从托管程序集访问64位COM服务器失败

时间:2011-09-22 15:36:31

标签: c# c++ com interop 64-bit

从.NET项目中用C ++编写的64位COM服务器访问COM对象时遇到问题(32位版本运行良好)。这是一个类似于此处描述的问题Troubleshooting an x64 com interop marshaling issue。我有一个COM方法,它将一个带有long和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位

 /* 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)

我尝试使用Windows SDK v7.0A中的32位和64位版本的midl.exe,但它生成的输出完全相同。所以来自另一个线程的建议没有帮助。还有其他想法吗?

更新:

结构看起来像这样(我更改了名称,其余部分完全相同):

[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);

我实际上有几个这样的结构和方法。显然,他们都有同样的问题。

0 个答案:

没有答案