2007-08-12

CStringの内容をレジストリに保存する

今日は ATL::CStringなグローバル変数に格納している値をレジストリに保存しようとして失敗しました。
 
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 件のコメント: