我有以下设置。有一个 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 中预装了一个用于该接口的编组器。
为什么它可能不起作用,我该如何找到原因?