
サンプル・プログラム
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.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とは
実際に 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" を利用してほしい。
解説:ヘッダファイル等
  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: }
参考サイト
- WiX によるWindowsインストーラー作成:ぱふぅ家のホームページ
- CoCreateGuid:Windowsデベロッパーセンター
そこで今回は、C++を使ってWindows APIを呼び出し、1つまたは複数の GUID を生成するプログラムを作成する。生成した GUID をクリップボードにコピーしたり、テキストファイルに保存できるようにする。
(2023年3月11日)設定クリア機能追加,使用ライブラリ更新.