У меня проблема с доступом к COM-объекту с 64-битного COM-сервера, написанного на C ++, из проекта .NET (32-битная версия работает хорошо). Это проблема, аналогичная описанной здесь Устранение проблемы с x64 com interro marshaling . У меня есть метод COM, который принимает в качестве параметра массив структур с длинными и BSTR. Когда вызов возвращается, он работает нормально, если вызов был сделан из собственного модуля, но когда он был сделан из управляемой (C #) сборки, я получаю нарушение прав доступа. Если строки не заполнены в структуре, то исключений нет.
Файл прокси / заглушки начинается со следующего:
32-бит
/* File created by MIDL compiler version 7.00.0500 */
/* at Thu Sep 22 17:52:25 2011
*/
/* Compiler settings for .\RAC.idl:
Oicf, W1, Zp8, env=Win32 (32b run)
protocol : dce , ms_ext, c_ext, robust
error checks: allocation ref bounds_check enum stub_data
VC __declspec() decoration level:
__declspec(uuid()), __declspec(selectany), __declspec(novtable)
DECLSPEC_UUID(), MIDL_INTERFACE()
*/
//@@MIDL_FILE_HEADING( )
#if !defined(_M_IA64) && !defined(_M_AMD64)
64-битный * * +1010
/* File created by MIDL compiler version 7.00.0500 */
/* at Thu Sep 22 17:58:46 2011
*/
/* Compiler settings for .\RAC.idl:
Oicf, W1, Zp8, env=Win64 (32b run)
protocol : dce , ms_ext, c_ext, robust
error checks: allocation ref bounds_check enum stub_data
VC __declspec() decoration level:
__declspec(uuid()), __declspec(selectany), __declspec(novtable)
DECLSPEC_UUID(), MIDL_INTERFACE()
*/
//@@MIDL_FILE_HEADING( )
#if defined(_M_AMD64)
Я пробовал как с 32-битной, так и с 64-битной версией midl.exe из Windows SDK v7.0A, но он выдает тот же результат. Так что предложение из другой ветки не помогло. Есть еще идеи?
UPDATE:
Структура выглядит следующим образом (я изменил имена, остальные идентичны):
[uuid(6F13C84D-0E01-48cd-BFD4-F7071A32B49F)] struct S
{
long a;
BSTR b;
long c;
BSTR d;
long e;
BSTR f;
BSTR g;
BSTR h;
BSTR i;
long j;
BSTR k;
long l;
BSTR m;
long n;
};
Подпись метода выглядит следующим образом:
[id(54)] HRESULT GetListOfStructs(SAFEARRAY(struct S)* arrRes);
У меня действительно есть несколько таких структур и методов, подобных этому. Очевидно, у всех них одна и та же проблема.