gpt4 book ai didi

c++ - 为什么 QueryInterface() 会在接口(interface)确实实现并且在 Windows 中具有内置编码器时失败?

转载 作者:搜寻专家 更新时间:2023-10-30 23:59:24 25 4
gpt4 key购买 nike

我有以下设置。有一个安装到 COM+ 中的 COM 服务器(在单独的进程中运行)并具有以下接口(interface)定义:

[object, uuid("InterfaceIdHere"), nonextensible, oleautomation, hidden]
interface IMyInterface : IUnknown {
HRESULT MyMethod( [in] IUnknown* param );
};

调用者这样调用它:

HRESULT callComObject(IStream* stream)
{
return comObject->MyMethod(stream);
}

请注意,此处 IStream* 被隐式向上转换为 IUnknown*。这样做是因为在 IDL 中声明类型为 IStream* 的参数导致了一些我现在想不起来的问题。无论如何,它始终是一个有效的 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 编码器。编码的 IUnknown* 在另一个进程中到达服务器并在那里获得 IUnknown* 然后有一个 QueryInterface() 调用编码 来自同一对象的 IStream*QueryInterface() 失败。

这看起来很疯狂,因为编码 IStream* 应该一直工作 - Windows 中预装了一个用于此接口(interface)的编码器。

为什么它可能不工作,我如何找到原因?

最佳答案

与行为匹配的可能场景之一如下:

  • 调用者和被调用者之间没有任何编码
  • 接口(interface)指针有效
  • 但是实现 IStream 的对象没有相应的 COM_INTERFACE_ENTRY 映射条目并且不使接口(interface)可用,调用者可能通过非COM方式,例如直接 C++ 转换

这很容易通过 QueryInterface 在调用之前在调用方端对流进行检查。

在这种情况下,被调用方只需将 reinterpret_cast 转换为 IStream 即可正常运行。

关于c++ - 为什么 QueryInterface() 会在接口(interface)确实实现并且在 Windows 中具有内置编码器时失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16590106/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com