GUID

GUIDとは

Globally Unique Identifierの略。
ファイルの一意性を保つために、時刻とランダム値、ネットワークカードのMACアドレスによって生成される128ビットの整数値。
世界中で重複しない値になることが、ある確率で保証されている。
タイプライブラリはすべて、レジストリに格納されているGUIDに関連付けられている。
タイプライブラリへの参照を設定すると、そのGUIDを使ってタイプライブラリが識別される。

DEFINE_GUID マクロはどのように機能するのか?

DEFINE_GUID マクロは、ソース コード内の GUID 値の extern 参照の宣言に関する問題を解決する。
たとえば、プロジェクトに 3 つのソース ファイル Src1.cpp、Src2.cpp、および Src3.cpp があり、3 つのファイルがすべて定義済みの特定の GUID 値を使用するとする。
GUID 値はプロジェクト内で 1 回だけ定義し、その他のソース ファイルではそのGUID 値への extern 参照を宣言する必要がある。
DEFINE_GUID マクロを使うと、同じヘッダー ファイルを両方の目的で使用できる。
ヘッダー ファイルでは、次のように GUID を宣言する。

DEFINE_GUID(CLSID_MyObject,
0x00000000, 0x0000, 0x0000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);

この例の 0 の部分に、実際の GUID 値に置き換える。Guidgen ユーティリティを使用して、新しい GUID を作成し、その GUID を DEFINE_GUID 形式でヘッダー ファイルに貼り付けることができる。この GUID を参照するすべてのソース ファイルにこのヘッダー ファイルをインクルードする。ソース ファイルのうちの 1 つでは、他のヘッダー ファイルよりも前に Initguid.h ヘッダー ファイルをインクルードする。以下に例を示す。

// Src1.cpp
#include <initguid.h>
#include "MyGuids.h"

// Src2.cpp
#include "MyGuids.h"

// Src3.cpp
#include "MyGuids.h"

Initguid.h ヘッダー ファイルがインクルードされていないファイルでは、DEFINE_GUID マクロが GUID 値への extern 参照を作成する。Initguid.h ヘッダー ファイルがインクルードされている場合は、このヘッダー ファイルが DEFINE_GUID マクロを再定義し、DEFINE_GUID は GUID の定義の宣言を作成する。

どのソース ファイルにも Initguid.h をインクルードしていない場合は、リンク エラー "unresolved external symbol" が出力される。同じ GUID について Initguid.h を 2 回インクルードしている場合、コンパイル エラー "redefinition; multiple initialization" が出力される。これらのエラーを解決するには、Initguid.h が 1 回だけインクルードされていることを確認すること。また、Initguid.h をプリコンパイル済みヘッダー ファイルにインクルードしないこと。プリコンパイル済みヘッダーは、事実上、すべてのソース ファイルにインクルードされるからだ。

Initguid.hをインクルドしたファイルでは CGuid.h はインクルドされない。
(INITGUIDが定義されているとスキップされてしまうので)
そうするとそのファイルではIID_NULLが未定義となってしまい、使えなくなってしまうので、
専用のヘッダとソースを用意するのがいいと思われる。
例えばGUIDをMyGuid.hで定義し、MyGuid.cpp内でInitguid.hとMyGuid.hをインクルドするみたいな

GUIDの定義

Guiddef.hにて以下のように定義されている。
typedef struct _GUID {
        unsigned long Data1;
        unsigned short Data2;
        unsigned short Data3;
        unsigned char Data4[ 8 ];
} GUID;
最終更新:2008年09月16日 16:10
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。