在64位.NET应用程序中使用32位未托管的COM服务器

3

我需要在64位.NET应用程序中使用一个32位的非托管COM服务器。

我进行了一些研究,似乎找到了一个合适的解决方案:将COM服务器托管在COM+ 服务器应用程序中。因此,组件在专用(32位)进程中激活,并通过RPC与64位进程通信。 (link)

为了测试上述内容,我创建了一个示例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上跨进程参数传递出现了问题,但即使搜索了几个小时,我也找不到答案。
有任何想法吗?

每个数组的大小是多少? - sharptooth
顺便问一下,你看过这个问题吗?http://stackoverflow.com/questions/3573523/issues-with-porting-com-applications-from-windows-2003-to-windows-2008-server - sharptooth
2个回答

0

我认为问题可能出在字符串类型的编组上。我建议尝试使用:

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

替代

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

0
问题出在封送上 - 无论什么原因,互操作层都无法正确地封送第二个调用参数。我建议您更改签名以使用带有 带有 size_is 属性的数组

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接