2016-09-29 16 views
0

VS2012プロジェクトでCOMオブジェクトを使用したい。これらの目的のために、私はオブジェクトを記述するIDLファイルを与えられました。私は私のプロジェクトにこのヘッダを含む場合、しかしIDLで作成されたCOMオブジェクトを使用しようとするとリンカーエラーが発生する

EXTERN_C const CLSID CLSID_COComponent; 

#ifdef __cplusplus 

class DECLSPEC_UUID("bla bla bla") 
COComponent; 
#endif 

を、そしてCoCreateInstance呼び出しでCLSID_COComponentを使用しよう:.:私はこのような(部分的に)見えるヘッダファイルを生成するMIDLを使用していました

CComPtr<IModelService> m_IModelService; 

hRes = m_IModelService.CoCreateInstance(CLSID_COComponent, NULL, CLSCTX_ALL); 

私は、リンカエラーを取得:私は__uuidof(COComponent)を使用する場合

Error 123 error LNK2001: unresolved external symbol _CLSID_COComponent 

はしかし、それが正常に動作します。また、生成されたコードからEXTERN_Cを削除すると、コンパイルされます。

全く同じコードが別のプロジェクトで使用されていますが、私はそれが動作するのを見てきました。私の質問は、私は何が間違っていますか?

+1

通常、MIDLはGUID定義、/ iidコマンドラインオプションを含む.cファイルも生成します。あなたのプロジェクトにそれが含まれていないようです。 __uuidキーワードを使用するのは、実際には単純で完全に有効な回避策です。 –

+1

[インターフェイスUUIDファイル](https://msdn.microsoft.com/en-us/library/windows/desktop/aa367283.aspx)通常、フォーマットは* _i.c *です。コンパイルして最終的な実行可能イメージにリンクする必要があります。 – IInspectable

+0

偉大な、それは確かにトリックでした!あなたが答えとして投稿するなら、私はそれを受け入れることができます。 – Frank

答えて

2

The exact same code has been used in a different project, where I have seen it work. My question is, what could I be doing wrong?

つまり、コード自体に問題はありません。それはコードの外部になければなりません。ヒントはCLSID宣言である:完全な文がタイプconst CLSIDCLSID_COComponentと呼ばれるシンボルがあることをコンパイラに語っているが、それが他のどこかに定義されるように

EXTERN_C const CLSID CLSID_COComponent; 

EXTERN_Cは、extern "C"に展開されます。それを見て、リンカが後で一緒に縫い合わせるようにしないでください。

CLSIDの定義もMIDLによって生成されます。それはInterface UUID Fileに配置されています。このファイルのデフォルト名は< idlベース名> _i.c/iid MIDLスイッチで上書き可能)です。リンカーがシンボルを見つけるように、そのファイルをプロジェクトに含める必要があります。

また、Interface UUID Fileを必要としない__uuidof演算子を使用することもできます。私はどのコンパイラの魔法がこれを動作させるかは分かりません。しかし、Hans Passantがそれを"valid workaround"と呼ぶならば、私はそれに疑問を抱かない。 EXTERN_C取り外し


これはシンボルを定義ことにより、コンパイルすることを可能にします。ただし、CLSIDには正しい値が格納されていないため、実行時には失敗します。

関連する問題