はじめに
C++は久しぶりに触ったのですが、やっぱり普段さわってないと忘れます。
C++でのレジストリ操作はWinAPIを利用します。
利用するWinAPIは下記の通りです。
- RegOpenKeyEx
- 指定されたレジストリキーをオープンします
- RegCreateKeyEx
- 指定されたレジストリキーを作成します。
- RegSetValueEx
- レジストリキーの下に指定された値のデータと型を設定します
- RegQueryValueEx
- 指定されたレジストリキーをオープンします。この関数は指定されたレジストリキーが存在しない場合はキーを作成しません。
- RegCloseKey
- 指定されたレジストリキーのハンドルを解放します
今回は、C++でのレジストリ操作についての備忘録です。
レジストリキー作成
使用しているWinAPI
- RegCreateKeyEx
- RegCloseKey
BOOL CreateRegistryKey(HKEY hKeyParent,PWCHAR subkey)
{
DWORD dwDisposition;
HKEY hKey;
DWORD Ret;
Ret = RegCreateKeyEx(
hKeyParent,
subkey,
0,
NULL,
REG_OPTION_NON_VOLATILE,
KEY_ALL_ACCESS,
NULL,
&hKey,
&dwDisposition
);
if (Ret != ERROR_SUCCESS)
{
printf("Error opening or creating new key\n");
return FALSE;
}
RegCloseKey(hKey);
return TRUE;
}
DWORD型の値をレジストリに書き込む
使用しているWinAPI
- RegOpenKeyEx
- RegSetValueEx
- RegCloseKey
BOOL WriteInRegistry(HKEY hKeyParent, PWCHAR subkey, PWCHAR valueName, DWORD data)
{
DWORD Ret;
HKEY hKey;
Ret = RegOpenKeyEx(
hKeyParent,
subkey,
0,
KEY_WRITE,
&hKey
);
if (Ret == ERROR_SUCCESS)
{
if (ERROR_SUCCESS != RegSetValueEx(
hKey,
valueName,
0,
REG_DWORD,
reinterpret_cast(&data),
sizeof(data)))
{
RegCloseKey(hKey);
return FALSE;
}
RegCloseKey(hKey);
return TRUE;
}
return FALSE;
}
文字列をレジストリに書き込む
使用しているWinAPI
- RegOpenKeyEx
- RegSetValueEx
- RegCloseKey
BOOL writeStringInRegistry(HKEY hKeyParent, PWCHAR subkey, PWCHAR valueName, PWCHAR strData)
{
DWORD Ret;
HKEY hKey;
Ret = RegOpenKeyEx(
hKeyParent,
subkey,
0,
KEY_WRITE,
&hKey
);
if (Ret == ERROR_SUCCESS)
{
if (ERROR_SUCCESS != RegSetValueEx(
hKey,
valueName,
0,
REG_SZ,
(LPBYTE)(strData),
((((DWORD)lstrlen(strData) + 1)) * 2)))
{
RegCloseKey(hKey);
return FALSE;
}
RegCloseKey(hKey);
return TRUE;
}
return FALSE;
}
DWORD型データを読み込み
使用しているWinAPI
- RegOpenKeyEx
- RegQueryValueEx
- RegCloseKey
BOOL readDwordValueRegistry(HKEY hKeyParent, PWCHAR subkey, PWCHAR valueName, DWORD *readData)
{
HKEY hKey;
DWORD Ret;
Ret = RegOpenKeyEx(
hKeyParent,
subkey,
0,
KEY_READ,
&hKey
);
if (Ret == ERROR_SUCCESS)
{
DWORD data;
DWORD len = sizeof(DWORD);
Ret = RegQueryValueEx(
hKey,
valueName,
NULL,
NULL,
(LPBYTE)(&data),
&len
);
if (Ret == ERROR_SUCCESS)
{
RegCloseKey(hKey);
(*readData) = data;
return TRUE;
}
RegCloseKey(hKey);
return TRUE;
}
else
{
return FALSE;
}
}
文字列データを読み込み
使用しているWinAPI
- RegOpenKeyEx
- RegQueryValueEx
- RegCloseKey
BOOL readStringFromRegistry(HKEY hKeyParent, PWCHAR subkey, PWCHAR valueName, PWCHAR *readData)
{
HKEY hKey;
DWORD len = TOTAL_BYTES_READ;
DWORD readDataLen = len;
PWCHAR readBuffer = (PWCHAR )malloc(sizeof(PWCHAR)* len);
if (readBuffer == NULL)
return FALSE;
DWORD Ret = RegOpenKeyEx(
hKeyParent,
subkey,
0,
KEY_READ,
&hKey
);
if (Ret == ERROR_SUCCESS)
{
Ret = RegQueryValueEx(
hKey,
valueName,
NULL,
NULL,
(BYTE*)readBuffer,
&readDataLen
);
while (Ret == ERROR_MORE_DATA)
{
len += OFFSET_BYTES;
readBuffer = (PWCHAR)realloc(readBuffer, len);
readDataLen = len;
Ret = RegQueryValueEx(
hKey,
valueName,
NULL,
NULL,
(BYTE*)readBuffer,
&readDataLen
);
}
if (Ret != ERROR_SUCCESS)
{
RegCloseKey(hKey);
return false;;
}
*readData = readBuffer;
RegCloseKey(hKey);
return true;
}
else
{
return false;
}
}
最後に
C#とかに慣れると、C++ではちょっと面倒ですね。
是非参考になればと思います。
参考