Использование 32-разрядного неуправляемого COM-сервера в 64-разрядном приложении .NET - PullRequest
2 голосов
/ 14 июля 2011

Мне нужно использовать 32-разрядный неуправляемый COM-сервер в 64-разрядном приложении .NET.

Я провел небольшое исследование, и мне показалось, что я нашел подходящее решение: размещение COM-сервера в COM + * 1003.* серверное приложение .Таким образом, компонент активируется в выделенном (32-битном) процессе и связывается с 64-битным процессом через RPC.( ссылка )

Чтобы проверить вышесказанное, я создал образец COM-сервера и зарегистрировал его в приложении COM +.Его интерфейс выглядит следующим образом:

interface ITestComObj: IUnknown
{
  HRESULT _stdcall Ping( void );
  HRESULT _stdcall Uppercase([in] LPSTR input, [out, retval] LPSTR * output );
};

Затем я создал простое консольное приложение .NET, которое вызывает эти методы через COM-взаимодействие.

Сначала я протестировал его на 32-битном WinXP, и он работалхорошо.

Затем я перешел на 64-битную Win7.Первый вызов (к методу Ping () без параметров) был успешным, но второй вызов вызвал исключение (после некоторого ожидания): удаленный вызов процедуры не удался.(Исключение из HRESULT: 0x800706BE).

Я провел дальнейшие исследования.Я заставил клиента в 32-битный процесс (встроенный в целевую платформу x86), чтобы увидеть, если что-то меняется, но результат был тот же.Однако, если я переключился на внутрипроцессную активацию (изменил тип приложения COM + на библиотечное приложение), клиент работал.

Очевидно, что-то с межпроцессной передачей параметров происходит неправильно в Win7, но я не могне найдете ответа даже после поисков в течение нескольких часов.

Есть идеи?

Ответы [ 2 ]

0 голосов
/ 01 августа 2011

Я думаю, что проблема может заключаться в сортировке строковых типов.Я бы попробовал использовать:

HRESULT _stdcall Uppercase([in] BSTR input, [out, retval] BSTR * output );

вместо

HRESULT _stdcall Uppercase([in] LPSTR input, [out, retval] LPSTR * output );
0 голосов
/ 14 июля 2011

Проблема с маршаллингом - уровень взаимодействия по какой-либо причине не может правильно распределить параметры второго вызова.Я предлагаю вам изменить подпись для использования массивов с атрибутом size_is .

...