CStringの内容を RegSetValueExに渡すために、 CString::GetBufferを使用し、 CString::GetLengthでサイズを取得しました。
LONG lResult; HKEY hKey; _TCHAR *buf; INT len; lResult = RegOpenKeyEx(HKEY_CURRENT_USER, CONFIG_REGKEY, 0, KEY_ALL_ACCESS, &hKey); if (lResult == ERROR_SUCCESS) { buf = g_strTitle.GetBuffer(g_strTitle.GetLength()); len = g_strTitle.GetLength(); RegSetValueEx(hKey, CONFIG_MSG1_REGVALUE, NULL, REG_SZ, (const BYTE *)buf, len); g_strTitle.ReleaseBuffer(); }
ところが、この状態ではCStringの一部しかレジストリに書き込まれません。
最初、レジストリの内容を取得している別の場所を疑って余計な時間を使ってしまったのですが、 ドキュメントをよく読んでみると、 RegSetValueExの cbDataに必要なのは終端のヌル文字を含んだバイト数でした。
C言語は不慣れとはいえ、 常に同じところで失敗しています。
いいかげん進歩しろ>自分。
ということで、コード修正。
LONG lResult;
HKEY hKey;
_TCHAR *buf;
INT len;
lResult = RegOpenKeyEx(HKEY_CURRENT_USER, CONFIG_REGKEY, 0, KEY_ALL_ACCESS, &hKey);
if (lResult == ERROR_SUCCESS) {
buf = g_strTitle.GetBuffer(g_strTitle.GetLength());
len = g_strTitle.GetLength() * 2 + 1;
RegSetValueEx(hKey, CONFIG_MSG1_REGVALUE, NULL, REG_SZ, (const BYTE *)buf, len);
g_strTitle.ReleaseBuffer();
}
2倍して終端文字分1バイト足すことでうまく動作しているのですが、スマートな書き方では無いですね。
まだまだ検討の余地がありそうです。
でも、無駄に時間を使ってしまったので続きはまた明日...。
0 件のコメント:
コメントを投稿