私は 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 を適切に参照するように指示するにはどうすればよいでしょうか?
よろしくお願いいたします。