C++ で GUIDを生成

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

(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.0 2023/03/11 設定クリア機能追加,使用ライブラリ更新
1.3 2022/07/16 DLLを不要に(静的リンクに変更)
1.2 2022/07/12 CUI版を追加,ライブラリを更新
1.1 2022/07/11 生成数,チェックの状態,ウィンドウ位置を保存
1.0 2020/09/04

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

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

解説:GUIDを生成

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

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

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

参考サイト

(この項おわり)
header