- 2012-2-15
- Visual C++
古い記事
今でも使えるんだろうか?
OLEオブジェクトやリモートプロシジャでは
UUID(Universally Unique Identifer)と呼ばれる
必ず一意の値を取得して利用します。
この値は、OSF/DCE で定義されたアルゴリズムで取得します。
生成されたUUID/GUIDは、どのマシンでいつ取得しても必ず異なる値となります。
この値を生成するアルゴリズムは、
現在の時刻
時計の逆進を処理するクロックシーケンスなど
高速割り当てに対処するためのカウンタ
ネットワークアダプタのIEEEマシンIDまたはマシンごとに異なる状態情報
から合成された値を利用します。
●UUIDとGUIDの関係
UUIDは元々RPCのインターフェースを定義されるために利用することを目的にしていますが、
WindowsではこのIDをCOM(Compnent Object Model)の
IID(Interface Identifer)やCLSID(Class Identifer)に利用し、
これらのIDを総称してGUIDと呼んでいます。
実際にこのIDを取得するには、Win32 RPC API UUIDCreateをるか、
Win32 OLE API CoCreateGuid を利用することで取得することができます。
と、どっかのHPに書いてあった。。間違っていたら修正してちょ。。
これだけでは、全部パクリになってしまうので、GUIDとUUID取得のサンプル作ってみた。
二重インクルードとかに使うと良いかも。。VC6.0のころは使ってたなぁ。。
使用する構造体MSDN確認のこと。
typedef struct _GUID
{
unsigned long Data1;
unsigned short Data2;
unsigned short Data3;
unsigned char Data4[8];
} GUID, UUID;
//GUID
void CreateGuid()
{
GUID st_Guid = GUID_NULL;
CString strGuid;
::CoCreateGuid(&st_Guid);
//MSDNサンプルの文字列変換バージョン(やっぱりパクリ)
strGuid.Format(
"GUID : {%08lX-%04X-%04x-%02X%02X-%02X%02X%02X%02X%02X%02X}",
st_Guid.Data1, st_Guid.Data2, st_Guid.Data3,
st_Guid.Data4[0], st_Guid.Data4[1], st_Guid.Data4[2], st_Guid.Data4[3],
st_Guid.Data4[4], st_Guid.Data4[5], st_Guid.Data4[6], st_Guid.Data4[7]
);
//変換方法はUUIDのものも使える
MessageBox(strGuid);
}
//UUID
void CreateUuid()
{
GUID st_Uuid = GUID_NULL;
CString strUuid;
unsigned char* szUuid;
HRESULT hr = ::UuidCreate(&st_Uuid);//UUID生成
::UuidToString(&st_Uuid,&szUuid); //UUID文字列に変換
strUuid.Format("UUID :{%s}",szUuid);
MessageBox(strUuid);
}