C++ で GUIDを生成

(1/1)
C++でGUIDを生成
WiX による Windows インストーラー作成」で述べたが、インストーラーを作成するには、コンポーネントごとに GUID(Globally Unique Identifier)を求められる。
そこで今回は、C++を使って Windows API を呼び出し、1 つまたは複数の GUID を生成するプログラムを作成する。生成した GUID をクリップボードにコピーしたり、テキストファイルに保存できるようにする。

目次

サンプル・プログラム

圧縮ファイルの内容
newguid.msiインストーラ
bin/newguid.exe実行プログラム本体
bin/etc/help.chmヘルプ・ファイル
source/newguid.cppソース・プログラム
source/resource.hリソース・ヘッダ
source/resource.rcリソース・ファイル
source/application.icoアプリケーション・アイコン

GUIDとは

世界中で重複することがなく、ユニークであることが保証された 128 ビットのランダムな数値のことを UUID(Universally Unique IDentifier)と呼び、OSF(Open Software Foundation)の DCE(Distributed Computing Environment)仕様によって 128 ビットの 2進数値として決まった。
実際に UUID を生成するには、作成する PC の MAC アドレスなどを取り込むなどしている。

UUID を 16進数 32 桁の文字列表記にしたものが GUID である。たとえば AAA0452F-17B5-43AB-BB7E-52F60C1C2412 のように表記する。
Windows システムでは、レジストリ・エントリなど、さまざまな識別に GUID が用いられており、Windows API(OLE32)を使って生成することができる。
今回のプログラムでは、この API をコールして GUID を生成することを目指す。

使用ライブラリ

今回は、オープンソースのライブラリ Boost C++ライブラリを使用する。導入方法等については、「C++ 開発環境の準備」をご覧いただきたい。

リソースの準備

Eclipse を起動し、新規プロジェクト newguid を用意する。
ResEdit を起動し、resource.rc を用意する。

Eclipse に戻り、ソース・プログラム "newguid.cpp" を追加する。
今回は GDI+ を使用する関係で、リンカー・フラグを -mwindows -static -lstdc++ -lgcc -lwinpthread "C:\Windows\System32\ole32.dll" に設定する。

解説:ヘッダファイル等

0010: // 初期化処理 ======================================================
0011: #include <iostream>
0012: #include <stdio.h>
0013: #include <stdlib.h>
0014: #include <tchar.h>
0015: #include <sstream>
0016: #include <string>
0017: #include <fstream>
0018: #include <windows.h>
0019: #include <commctrl.h>
0020: #include <richedit.h>
0021: #include <boost/format.hpp>
0022: #include "resource.h"
0023: 
0024: using namespace std;
0025: using namespace boost;
0026: 
0027: #define APPNAME     "GUID生成"        //アプリケーション名
0028: #define APPVERSION "1.0"            //バージョン
0029: #define APPYEAR     "2020"            //作成年
0030: #define REFERENCE "https://www.pahoo.org/e-soul/webtech/cpp01/cpp01-10-01.shtm"  // 参考サイト
0031: 
0032: //char*バッファサイズ
0033: #define SIZE_BUFF     512
0034: 
0035: //標準フォント
0036: #define FONT_FACE     "MS UI Gothic"
0037: 
0038: //現在のインターフェイス
0039: static HINSTANCE hInst;
0040: 
0041: //親ウィンドウ
0042: static HWND hParent;
0043: 
0044: //エラー・メッセージ格納用
0045: string ErrorMessage;
0046: 
0047: //ヘルプ・ファイル
0048: #define HELPFILE ".\\etc\\help.chm"
0049: 
0050: //デフォルト保存ファイル名
0051: #define SAVEFILE "newguid.txt"
0052: 
0053: //生成するGUIDの最小数と最大数
0054: #define MIN_GUID 1
0055: #define MAX_GUID 10

各種定数は、自由に変更できる。

解説:GUIDを生成

0288: /**
0289:  * GUIDを1つ生成する
0290:  * @param int fmt 生成文字列の書式ID
0291:  * @return string GUID/NULL:生成失敗
0292: */
0293: string newGUID(int fmt) {
0294:     GUID guid;
0295:     static char buff[SIZE_BUFF + 1];
0296:     //生成文字列の書式
0297:     const char *format[] = {
0298:         "%08lX-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X",
0299:         "%08lX%04X%04X%02X%02X%02X%02X%02X%02X%02X%02X",
0300:         "{%08lX-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}",
0301:         "{%08lX%04X%04X%02X%02X%02X%02X%02X%02X%02X%02X}"
0302:     };
0303:     if ((fmt < 0) || (fmt > (int)sizeof(format))) {
0304:         ErrorMessage = "生成文字列の書式が不正";
0305:         return "";
0306:     }
0307: 
0308:     //GUIDの生成(Windows API利用)
0309:     if (S_OK != ::CoCreateGuid(&guid)) {
0310:         ErrorMessage = "GUID生成に失敗";
0311:         return "";
0312:     } else {
0313:         snprintf(buffSIZE_BUFFformat[fmt], guid.Data1guid.Data2guid.Data3guid.Data4[0],guid.Data4[1],guid.Data4[2],guid.Data4[3], guid.Data4[4], guid.Data4[5], guid.Data4[6], guid.Data4[7]);
0314:     }
0315: 
0316:     return (string)buff;
0317: }

Windows API の CoCreateGuid を呼び出し、GUID を 1 つ生成する。

その他の関数、ヘルプファイルやインストーラー作成方法については、これまでの連載で説明してきたとおりである。

参考サイト

(この項おわり)
header