0

次のようにCOMDLLをインポートする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ファイルは、2番目と3番目のパラメーターのタイプを変更しました。

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。これらのtypedefは、C ++コードの間違いをキャッチします。多くの言語にtypeinfoを提供するタイプ・ライブラリーでは、実際には適切ではありません。

技術的にはこれらのtypedefを保持することもできますが、COMクライアントがその意味を認識できるように、これらの型も型ライブラリで定義する必要があります。コンポーネントの作成者は、WTypes.idlを含める必要があります。それはおそらく今では手遅れです。COMクライアントではそれについて何もできません。

于 2012-07-27T12:17:01.843 に答える