Program-06 GUIDを生成する
Q 重複しない「一意の値」としてGUIDを使用したいのですが、どうすればGUIDを生成できるでしょうか。
A 方法が2パターンあるのですが、今回はUuidCreate関数などを使ってみます。
どう使う?
'関数の宣言(コードの一番上に書くことを推奨)
Declare Function UuidCreate Lib "rpcrt4" (Uuid As VoidPtr) As DWord
Declare Function UuidToString Lib "rpcrt4" Alias "UuidToStringA" (Uuid As VoidPtr,StringUuid As DWordPtr) As DWord
Declare Function RpcStringFree Lib "rpcrt4" Alias "RpcStringFreeA" (StringUuid As DWordPtr) As DWord
Dim Uuid[15] As Byte
Dim UuidPtr As BytePtr,UuidBuf As String
UuidCreate(Uuid)
UuidToString(Uuid,VarPtr(UuidPtr))
UuidBuf=MakeStr(UuidPtr)
RpcStringFree(VarPtr(UuidPtr))
'UuidBufにはGUIDが格納されている
UuidCreate関数でGUIDを生成して、UuidString関数でそれを文字列に変換しています。
関数名などにある「Uuid」とは、GUIDのことです(違う名前で呼ばれていますが同じものです)。
CoCreateGuid関数を使う、という手もあるのですが、こちらは文字列変数にZeroString関数などを使ってメモリを確保しなければならないため、今回はそれよりは手軽に(?)扱えるこちらの関数を利用しました。
まあ、RpcStringFree関数で解放はしなければならないんですが(^^;;;
ここでGUIDの話を少し。
GUIDとは、
{336A3B2D-02E4-4121-B3B2-269147DAD0B1}
という形式で表される128ビット(Long型4つ分に相当)の値です。
GUIDは、生成するたびに違う値になります。これを利用して、クラスやインターフェース…要するに「固有のもの」を指し示すことができるのです。
毎回違う値が生成されることを利用して、ダブっては困る文字列(ミューテックスオブジェクトの名前など)として使用することも可能です。
但し、ここでGUIDは
336a3b2d-02e4-4121-b3b2-269147dad0b1
の形式で返されます。必要に応じて、{ }で括ったり、アルファベットを大文字に変換(CharUpper関数を使うとよい)してください。