【问题标题】:#import COM DLL generate wrong method signature#import COM DLL 生成错误的方法签名
【发布时间】:2012-07-26 02:13:47
【问题描述】:

我正在编写一个导入 COM DLL 的 C++ 应用程序,如下所示,

#import "MyLib.dll" no_namespace, raw_interfaces_only

使用 idl 文件中声明的方法 '_GetObject' 存在问题,

[
  object,
  uuid(f022c0e0-1234-5678-abcd-c17d63954f4b),
  dual,
  nonextensible,
  helpstring("IStorageProxy Interface"),
  pointer_default(unique)
]
interface IStorageProxy : IDispatch
{
    [hidden, helpstring("method _GetObject")]
    HRESULT _GetObject(
            [in] BSTR entryId,
            [in] REFCLSID rclsid,
            [in] REFIID riid,
            [out, iid_is(riid), retval] IUnknown** stgObject);
};

但是生成的tlh文件改变了第二个和第三个参数的类型。

struct __declspec(uuid("f022c0e0-1234-5678-abcd-c17d63954f4b"))
IStorageProxy : IDispatch
{
  //
  // Raw methods provided by interface
  //

  virtual HRESULT __stdcall _GetObject (
    /*[in]*/ BSTR entryId,
    /*[in]*/ GUID * rclsid,
    /*[in]*/ GUID * riid,
    /*[out,retval]*/ IUnknown * * stgObject ) = 0;
};

由于我正在针对原始函数签名(在 idl 中定义)进行编码,因此现在 C++ 代码无法编译。我不确定为什么类型更改为“GUID *”。有没有办法阻止编译器这样做?

【问题讨论】:

    标签: c++ com dllimport importerror


    【解决方案1】:

    不,这很正常。 REFGUID 和 REFIID 都只是 GUID* 的 typedef。与 HWND 和 HDC 相同的想法,用于 HANDLE 的 typedef。这些 typedef 会捕获 C++ 代码中的错误,它们并不真正适合为多种语言提供 typeinfo 的类型库。

    从技术上讲,您可以保留这些 typedef,但这些类型也必须在类型库中定义,以便 COM 客户端知道它们的含义。组件作者必须包含 WTypes.idl。现在可能为时已晚,您无法在 COM 客户端中对此进行任何处理。

    【讨论】:

    • 那么我应该怎么做才能解决这个问题?类型转换?
    • 我回答了这个问题。为什么要投? REFGUID 只是 GUID* 的另一个名称,因此不需要强制转换。
    • 对不起,我误解了你。是的,你是对的。感谢您的回答。
    猜你喜欢
    • 1970-01-01
    • 2012-11-21
    • 2017-02-15
    • 2016-08-08
    • 2012-03-10
    • 1970-01-01
    • 2023-04-01
    • 2023-04-06
    相关资源
    最近更新 更多