C++ で GUIDを生成

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

(2024年3月9日)使用ライブラリ更新.
(2023年11月4日)使用ライブラリ更新.
(2023年6月18日)使用ライブラリ更新.
(2023年3月11日)設定クリア機能追加,使用ライブラリ更新.

目次

サンプル・プログラム

圧縮ファイルの内容
newguid.msiインストーラ
bin/newguid.exe実行プログラム本体
bin/etc/help.chmヘルプ・ファイル
sour/newguid.cppソース・プログラム
sour/resource.hリソース・ヘッダ
sour/resource.rcリソース・ファイル
sour/application.icoアプリケーション・アイコン
sour/makefileGUI版ビルド
sour/makefile_cmdCUI版ビルド
newguid.cpp 更新履歴
バージョン 更新日 内容
1.4.3 2024/03/09 使用ライブラリ更新
1.4.2 2023/11/04 使用ライブラリ更新
1.4.1 2023/06/18 使用ライブラリ更新
1.4.0 2023/03/11 設定クリア機能追加,使用ライブラリ更新
1.3 2022/07/16 DLLを不要に(静的リンクに変更)

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" に設定する。

MSYS2 コマンドラインからビルドするのであれば、"makefile" と "makefile_cmd" を利用してほしい。

解説:ヘッダファイル等

  11: // 初期化処理 ======================================================
  12: #include <iostream>
  13: #include <stdio.h>
  14: #include <stdlib.h>
  15: #include <tchar.h>
  16: #include <sstream>
  17: #include <string>
  18: #include <fstream>
  19: #include <winsock2.h>
  20: #include <windows.h>
  21: #include <commctrl.h>
  22: #include <shlobj.h>
  23: #include <richedit.h>
  24: #include <boost/program_options.hpp>
  25: #include <boost/property_tree/xml_parser.hpp>
  26: #include <boost/format.hpp>
  27: #include "resource.h"
  28: 
  29: using namespace std;
  30: using namespace boost;
  31: using namespace boost::program_options;
  32: using namespace boost::property_tree;
  33: 
  34: #define APPNAME     "newguid"       //アプリケーション名(GUI版)
  35: #define APPNAMEJP   "GUID生成"      //アプリケーション名(日本語)
  36: #define APPCMD      "nguid"         //アプリケーション名(CUI版)
  37: #define APPVERSION  "1.4.3"         //バージョン
  38: #define APPYEAR     "2020-2024"     //作成年
  39: #define REFERENCE   "https://www.pahoo.org/e-soul/webtech/cpp01/cpp01-10-01.shtm"   // 参考サイト
  40: 
  41: //char*バッファサイズ
  42: #define SIZE_BUFF       5120
  43: 
  44: //標準フォント
  45: #define FONT_FACE       "MS UI Gothic"
  46: 
  47: //現在のインターフェイス
  48: HINSTANCE hInst;
  49: 
  50: //アプリケーション・ウィンドウ
  51: HWND hParent;
  52: 
  53: //アプリケーション・ウィンドウ位置
  54: unsigned hParent_X, hParent_Y;
  55: 
  56: //エラー・メッセージ格納用
  57: string ErrorMessage;
  58: 
  59: //ヘルプ・ファイル
  60: #define HELPFILE    ".\\etc\\help.chm"
  61: 
  62: //デフォルト保存ファイル名
  63: #define SAVEFILE    "newguid.txt"
  64: 
  65: //オプション
  66: #define OPTION_ADD_BRACE    'b'     //{...} 追加
  67: #define OPTION_TRIM_HYPHEN  't'     //ハイフン削除
  68: 
  69: //オプションの初期値
  70: #define OPTION_INIT         ""
  71: 
  72: //生成するGUIDの最小数と最大数
  73: #define MIN_GUID    1
  74: #define MAX_GUID    10
  75: 
  76: //GUIDの生成数
  77: unsigned GuidNum = MIN_GUID;
  78: 
  79: //生成したGUIDを保管する配列
  80: string Guid[MAX_GUID];

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

解説:GUIDを生成

 172: /**
 173:  * GUIDを1つ生成する.
 174:  * fmtに指定する値によって,ハイフンやブレースの有無を指定できる.
 175:  * デフォルトはハイフンあり,ブレース無し.
 176:  * @param   int fmt 生成文字列の書式ID
 177:  *                      0:通常, 1:ハイフン無し, 2:ブレース有り,ハイフン有り
 178:  *                      3:ブレース有り,ハイフン無し
 179:  * @return  string GUID/NULL:生成失敗
 180: */
 181: string newGUID(int fmt=0) {
 182:     GUID guid;
 183:     static char buff[SIZE_BUFF + 1];
 184:     //生成文字列の書式
 185:     const char *format[] = {
 186:         "%08lX-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X",
 187:         "%08lX%04X%04X%02X%02X%02X%02X%02X%02X%02X%02X",
 188:         "{%08lX-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}",
 189:         "{%08lX%04X%04X%02X%02X%02X%02X%02X%02X%02X%02X}"
 190:     };
 191:     if ((fmt < 0|| (fmt > (int)sizeof(format))) {
 192:         ErrorMessage = "生成文字列の書式が不正";
 193:         return "";
 194:     }
 195: 
 196:     //GUIDの生成(Windows API利用)
 197:     if (S_OK !::CoCreateGuid(&guid)) {
 198:         ErrorMessage = "GUID生成に失敗";
 199:         return "";
 200:     } else {
 201:         snprintf(buff, SIZE_BUFF, format[fmt], guid.Data1, guid.Data2, guid.Data3, guid.Data4[0],guid.Data4[1],guid.Data4[2],guid.Data4[3], guid.Data4[4], guid.Data4[5], guid.Data4[6], guid.Data4[7]);
 202:     }
 203: 
 204:     return (string)buff;
 205: }

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

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

参考サイト

(この項おわり)
header