Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: FormatMessage в CLR. Упакованные структуры  (Прочитано 7218 раз)
0 Пользователей и 1 Гость смотрят эту тему.
email2011
Новенький

ru
Offline Offline

« : 20-02-2014 09:21 » 

FormatMessage в консольном приложении работает, в CLR - нет.

Не могу понять, пишет

"Необработанное исключение типа "System.Runtime.InteropServices.MarshalDirectiveException" произошло в Проект.exe

    Дополнительные сведения: Невозможно упаковать "parameter #7": Указатели не могут ссылаться на упакованные структуры.
    Используйте ByRef."

Что за упакованные структуры - где почитать? ByRef вообще вроде из VB.
Подозрение что FormatMessage в CLR-среде неприменимо (нужна из-за GetLastError), да?

MS Visual C++ 2010 Express.

Добавлено через 12 минут и 44 секунды:
В качестве параметра №7 передается NULL.
« Последнее редактирование: 20-02-2014 09:33 от email2011 » Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 20-02-2014 11:28 » 

email2011, ну ты код-то покажи - телепатов нету, что там у тебя за структура такая.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
email2011
Новенький

ru
Offline Offline

« Ответ #2 : 21-02-2014 07:00 » 

   ...

   DWORD dw = GetLastError();

   LPVOID lpMsgBuf;
   LPVOID lpDisplayBuf;

   FormatMessage(
      FORMAT_MESSAGE_ALLOCATE_BUFFER |
      FORMAT_MESSAGE_FROM_SYSTEM |
      FORMAT_MESSAGE_IGNORE_INSERTS,
      NULL,
      dw,
      MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
      (LPTSTR) &lpMsgBuf,
      0,
      NULL);

FormatMessage(1,2,3,4,5,6, va_list *Arguments)
если через стек вызвовов смотреть
FormatMessage(,,,,,, System::ArgIterator* pArgs)
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 21-02-2014 11:10 » 

Ну там же получается, что в переменную lpMsgBuf записывается указатель на созданную строчку, а не сама строчка. Вот CLR и говорит, что указатель на указатель на строчку оно записывать отказывается. И это логично, поскольку управление объектами для сборщика мусора становится непонятным.

Тут либо явным образом нужно описывать структуру из этих вложенных указателей и подсовывать эту структуру в функцию, либо не использовать FORMAT_MESSAGE_ALLOCATE_BUFFER, а самому выделить буфер и пользоваться им.

Попробуй так:
Код: (C++)
LPVOID buf;
LPVOID lpMsgBuf = &buf;

// ...

  (LPSTR)lpMsgBuf
Т.е. не вычислять адрес в месте вызова. Может поможет.
« Последнее редактирование: 21-02-2014 11:13 от Dimka » Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
email2011
Новенький

ru
Offline Offline

« Ответ #4 : 24-02-2014 08:28 » 

Ну там же получается, что в переменную lpMsgBuf записывается указатель на созданную строчку, а не сама строчка. Вот CLR и говорит, что указатель на указатель на строчку оно записывать отказывается. И это логично, поскольку управление объектами для сборщика мусора становится непонятным.

А ты не путаешь lpMsgBuf это параметр №5 а строка №7.
      FORMAT_MESSAGE_ALLOCATE_BUFFER |
      FORMAT_MESSAGE_FROM_SYSTEM |
      FORMAT_MESSAGE_IGNORE_INSERTS,
Это все один параметр.

Тут либо явным образом нужно описывать структуру из этих вложенных указателей и подсовывать эту структуру в функцию, либо не использовать FORMAT_MESSAGE_ALLOCATE_BUFFER, а самому выделить буфер и пользоваться им.
...
Т.е. не вычислять адрес в месте вызова. Может поможет.
Насчет структуры разбираюсь, остальное не помогло, ошибка та же.
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 24-02-2014 11:47 » new

email2011, так это переменное число параметров - т.е. либо там ничего не должно быть (даже NULL), просто 6 параметров. Либо, как в MSDN сказано:
Цитата
If you do not have a pointer of type va_list*, then specify the FORMAT_MESSAGE_ARGUMENT_ARRAY flag and pass a pointer to an array of DWORD_PTR values; those values are input to the message formatted as the insert values. Each insert must have a corresponding element in the array.
Т.е. поставить флажок FORMAT_MESSAGE_ARGUMENT_ARRAY и в параметре указать массив из DWORD_PTR. Если в строке формата аргументов не упомянуто, то пустой массив.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines