не удается получить доступ к 64-битному COM-серверу из управляемой сборки - PullRequest
0 голосов
/ 22 сентября 2011

У меня проблема с доступом к 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);

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

...