我有以下设置。有一个 COM 服务器安装在 COM+ 中(在单独的进程中运行)并具有以下接口定义:
[object, uuid("InterfaceIdHere"), nonextensible, oleautomation, hidden]
interface IMyInterface : IUnknown {
HRESULT MyMethod( [in] IUnknown* param );
};
调用者这样称呼它:
HRESULT callComObject(IStream* stream)
{
return comObject->MyMethod(stream);
}
请注意,这里IStream*
隐式向上转换为IUnknown*
. 这样做是因为IStream*
在 IDL 中声明类型参数会导致一些我现在无法回忆的问题。无论如何,它总是一个有效IStream*
的代替IUnknown*
.
COM 服务器端具有以下实现MyMethod()
:
STDMETHODIMP CServer::MyMethod(IUnknown* param)
{
if(param == 0) {
return E_INVALIDARG;
}
ATL::CComQIPtr<IStream> stream(param);
if(stream == 0) {
return E_INVALIDARG;// control passes HERE
}
// whatever
}
所以我已经IStream*
传递到callComObject()
客户端,它被隐式向上转换IUnknown*
,后者被传递给 COM 编组器。marshalledIUnknown*
在另一个进程中到达服务器并IUnknown*
获得,然后从同一个对象QueryInterface()
调用 marshallIStream*
并且QueryInterface()
失败。
这看起来很疯狂,因为编组IStream*
应该在任何时候都可以工作——Windows 中预装了一个用于该接口的编组器。
为什么它可能不起作用,我该如何找到原因?