【问题标题】:Can I pass a HWND in a COM method?我可以在 COM 方法中传递 HWND 吗?
【发布时间】:2009-04-30 19:46:54
【问题描述】:

是否可以有一个传递HWND 的 COM 方法?在我的对象CoCreateInstance 中使用以下方法返回DISP_E_BADVARTYPE (0x80020008):

STDMETHODIMP ShowDialog(HWND hWndParent);

到目前为止,我通过传递 OLE_HANDLE 然后进行转换来解决这个问题,但感觉就像是一团糟:

STDMETHODIMP ShowDialog(OLE_HANDLE hWndParent);

【问题讨论】:

  • 请注意,如果您在具有 HWND 类型的接口上有一个属性,即使它从未在 .NET 代码中引用,也会发生这种情况!我花了很长时间追着我的尾巴试图解决类似的问题,然后我才注意到界面上还有其他东西(我没有使用)带有[out, retval] HWND * 参数。接口是oleautomation,但不是dual

标签: windows com hwnd


【解决方案1】:

我认为 HWND 是一个指向结构的指针,这就是为什么你不能在 IDL 中使用它的原因。
如果您查看 Microsoft Typelibs,您会看到有关如何传递句柄的各种变化(从 int 到 long 到 HANDLE)。

【讨论】:

    【解决方案2】:

    您的界面可能已注册为“双重”,而 HWND 不是 OLE 自动化支持的类型之一。您的界面是否需要与 IDispatch 兼容(您是否需要从脚本或后期绑定语言中调用它)?如果没有,从 IUnknown 而不是 IDispatch 派生并且不注册为双重身份将帮助您。

    注意:只要您只使用进程中的方法,强制转换是可以的。

    【讨论】:

    • 根据我的经验,未标记为dual的接口仍然可能发生此错误。
    猜你喜欢
    • 1970-01-01
    • 2020-05-25
    • 1970-01-01
    • 2015-12-29
    • 2023-03-31
    • 2015-08-23
    • 2015-02-13
    • 2011-03-10
    • 1970-01-01
    相关资源
    最近更新 更多