0

我正在编写一个导入 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 *”。有没有办法阻止编译器这样做?

4

1 回答 1

0

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

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

于 2012-07-27T12:17:01.843 回答