1

私は Visual Studio 2015 を使用しており、COM インターフェイスを定義し、コンパイル時に .tlb ファイルを生成する C# アプリケーション プロジェクトがあります。次に、その Csharp.tlb を IDL にインポートします。

MyLibrary.idl:

import "oaidl.idl";
import "ocidl.idl";
import "Cplusplus.idl";

library MyLibrary
{
  importlib("stdole32.tlb");
  importlib("stdole2.tlb");
  importlib("Csharp.tlb");

  interface IMyCOM : IDispatch
  {
    [propget, id(1)]
    HRESULT CpluplusObject
    (
      [out,retval] ICplusplusObject** cplusplusObject
    );

    [propget, id(2)]
    HRESULT CsharpObject
    (
      [out, retval] ICsharpObject** csharpObject
    );
  }

  coclass MyCOM
  {
    [default] interface IMyCOM;
  };
}

コンパイル中にエラーが発生します

C3646 'csharpObject': MyLibrary.tlh のオーバーライド指定子が不明です

MyLibrary.tlh はコンパイルによって自動生成され、次のようになります。

MyLibrary.tlh:

#pragma once
#pragma pack(push, 8)

#include <comdef.h>

namespace MyLibrary {

  struct __declspec(uuid("8e664998-bc93-48e7-adcc-84fc8598cd5d"))
  /* dual interface */ ICplusplusObject;

  _COM_SMARTPTR_TYPEDEF(ICplusplusObject, __uuidof(ICplusplusObject));

  struct __declspec(uuid("388ebf11-05c8-4b86-b2bd-60f0ef38695e"))
  IMyLibrary : IDispatch
  {
    __declspec(property(get=GetCplusplusObject))
    ICplusplusObjectPtr cplusplusObject;
    __declspec(property(get=GetCsharpObject))
    ICsharpObjectPtr csharpObject;

    ICplusplusObjectPtr GetCplusplusObject ( );
    ICsharpObjectPtr GetCsharpObject ( );

    virtual HRESULT __stdcall get_CplusplusObject (
      /*[out,retval]*/ struct ICplusplusObject * * cplusplusObject ) = 0;
    virtual HRESULT __stdcall get_CsharpObject (
      /*[out,retval]*/ struct ICsharpObject * * csharpObject ) = 0;
  }

  __declspec(implementation_key(1)) ICplusplusObjectPtr IMyLibrary::GetcplusplusObject ( );
  __declspec(implementation_key(2)) ICsharpObjectPtr IMyLibrary::GetcsharpObject ( );
}

エラーは、ICsharpObjectPtr または ICsharpObject がそれぞれ不明であることを意味し、これまでのところ理解しています。import "ICplusplus.idl" が定義を .tlh および importlib("ICsharp.tlb") に追加したため、ICplusplusObjectPtr は既知です。明らかにしませんでした。

テストのために、OLE/COM Object Viewer を使用して .tlb から ICsharp.idl を生成し、その idl をインポートしました。その後、エラーはなくなりました。

しかし、.tlb の importlib が直接動作しないのはなぜですか? 毎回 .tlb から idl ファイルを生成したくありません。

#include "ICsharp.tlh" が欠落しているか、.tlh の型を認識させる何かがあると思います。しかし、idl またはコンパイラに ICsharpObject を適切に参照するように指示するにはどうすればよいでしょうか?

よろしくお願いいたします。

4

1 に答える 1