
サンプル・プログラム
newguid.msi | インストーラ |
bin/newguid.exe | 実行プログラム本体 |
bin/etc/help.chm | ヘルプ・ファイル |
sour/newguid.cpp | ソース・プログラム |
sour/resource.h | リソース・ヘッダ |
sour/resource.rc | リソース・ファイル |
sour/application.ico | アプリケーション・アイコン |
sour/makefile | GUI版ビルド |
sour/makefile_cmd | CUI版ビルド |
バージョン | 更新日 | 内容 |
---|---|---|
1.4.6 | 2025/03/08 | 使用ライブラリ更新 |
1.4.5 | 2024/11/23 | 使用ライブラリ更新 |
1.4.4 | 2024/07/27 | 使用ライブラリ更新 |
1.4.3 | 2024/03/09 | 使用ライブラリ更新 |
1.4.2 | 2023/11/04 | 使用ライブラリ更新 |
GUIDとは
実際に UUID を生成するには、作成するPCのMACアドレスなどを取り込むなどしている。

UUID を16進数32桁の文字列表記にしたものが GUID である。たとえば AAA0452F-17B5-43AB-BB7E-52F60C1C2412 のように表記する。
Windowsシステムでは、レジストリ・エントリなど、さまざまな識別に GUID が用いられており、Windows API(OLE32)を使って生成することができる。
今回のプログラムでは、このAPIをコールして GUID を生成することを目指す。
使用ライブラリ
リソースの準備
ResEdit を起動し、resource.rc を用意する。
Eclipse に戻り、ソース・プログラム "newguid.cpp" を追加する。
今回は GDI+ を使用する関係で、リンカー・フラグを -mwindows -static -lstdc++ -lgcc -lwinpthread "C:\Windows\System32\ole32.dll" に設定する。

MSYS2 コマンドラインからビルドするのであれば、"makefile" と "makefile_cmd" を利用してほしい。
解説:ヘッダファイル等
newguid.cpp
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.6" // バージョン
38: #define APPYEAR "2020-2025" // 作成年
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を生成
newguid.cpp
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: }
参考サイト
- WiX によるWindowsインストーラー作成:ぱふぅ家のホームページ
- CoCreateGuid:Windowsデベロッパーセンター
そこで今回は、C++を使ってWindows APIを呼び出し、1つまたは複数の GUID を生成するプログラムを作成する。生成した GUID をクリップボードにコピーしたり、テキストファイルに保存できるようにする。
(2025年3月8日)使用ライブラリ更新
(2024年11月23日)使用ライブラリ更新
(2024年7月27日)使用ライブラリ更新