Вызов COM-метода возвращает катастрофический сбой при передаче BSTR - PullRequest
1 голос
/ 21 марта 2009

Пересмотрено с предыдущий вопрос

Примечание:

  • Pass BSTR переменная для COM метод, HRESULT возврат 8000FFFF
  • Предыдущие вызовы с указателем интерфейса , были успешными : HRESULT 0
  • Выполнение внутри Visual Studio успешно , снаружи с ошибками - выпуск и отладка

Иллюстрация:

BSTR raw_sim_Open = SysAllocString (L"c:\\example.S8");

hresult = pis8->raw_Open (raw_sim_Open); //0x8000FFFF returned

Редактировать - WinDbg:

First chance exceptions are reported before any exception handling.
This exception may be expected and handled.
eax=003a5be8 ebx=00009000 ecx=003a0208 edx=77606e00 esi=0012ec90 edi=00191b14
eip=003a0283 esp=0012ec34 ebp=0012ecb4 iopl=0         nv up ei ng nz ac pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00010296
Missing image name, possible paged-out or corrupt data.
Missing image name, possible paged-out or corrupt data.
<Unloaded_PI32.dll>+0x3a0282:
003a0283 0080023a0088    add     byte ptr [eax-77FFC5FEh],al ds:0023:883a95ea=??

Ответы [ 3 ]

1 голос
/ 21 марта 2009

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

1 голос
/ 24 марта 2009

Как и в упоминаниях Данбыстрома, разница может быть в инициализации. Но это может повлиять и на исполнение косвенно. Например, что если метод не вызывает SysStringLen для определения длины строки, а вместо этого пытается использовать ее в качестве строки с нулевым символом в конце? Это вряд ли является причиной проблемы, но стоит проверить.

В этом случае поможет следующее. Используйте SysAllocStringLen (), чтобы получить BSTR с завершающим нулевым символом.

0 голосов
/ 21 марта 2009

Возврат E_UNEXPECTED напрямую не подразумевает вообще ничего.

Более конкретные ошибки времени выполнения COM более конкретны (например, потеря соединения DCOM), поэтому, скорее всего, сам компонент COM возвращает E_UNEXPECTED.

Необходимо проверить или отладить реализацию самого компонента COM.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...