【发布时间】:2010-10-18 06:25:03
【问题描述】:
我们有一个用 C++ 用 ATL 编写的 32 位 COM 组件。当需要从 64 位 .NET 使用它时,我们创建一个 COM+ 应用程序,一切正常。
最近我们注意到 Win2k8 上有奇怪的行为。我们组件中的 COM 对象触发一个事件,我们在 .NET 代码中处理它。该事件还有一个参数也是从非托管代码传递的。
这里是澄清的部分定义(IDL 符号):
interface IOurCollectionInterface : IDispatch
{
[propget, restricted, id(DISPID_NEWENUM)]]
HRESULT _NewEnum( [out, retval] IUnknown** result );
}
interface IOurObjectInterface : IDispatch
{
[propget]
HRESULT Collection( [out, retval] IOurCollectionInterface** result );
}
事件处理程序被传递一个 IOurObjectInterface 实例。在里面我们尝试运行一个 foreach() 循环。
void onEvent( IOurObjectInterface ourObject )
{
foreach( object element in ourObject.Collection ) {
//do stuff
}
}
代码在 foreach 行崩溃,并显示以下消息: IEnumVARIANT 的 QI 在非托管服务器上失败
IEnumVARIANT 肯定是由IOurCollectionInterface::get__NewEnum() 实现返回的对象实现的。上面的代码在 WinXP 和 Win2k3 上运行正常,但在 Win2k8 上不行。
这种行为的原因是什么?
【问题讨论】:
-
错误中的 HRESULT 是什么?
标签: c# .net com interop windows-server-2008