代わりにstd::wstring
タイプを使用する必要があります。これは、Windowsが文字列を内部的に格納する方法であるwchar_t
型に基づいて、ワイド文字(Unicode)文字列を提供します。
次に、c_str()
メンバ関数を使用して、Cスタイルの文字列へのポインタを取得し、これを直接RegSetValueEx
関数に渡すことができます。 size()
メンバー関数は、2つの注意点を除いて、あなたがcbData
パラメータとして渡すことができる文字列の長さを与える:
cbData
がに文字列の長さは、終端のヌル文字が含ま期待し、あなたので、 size()
によって返された長さに1を加える必要があります。
cbData
はバイト内の文字列の大きさではなく、文字の数を予想し、そのワイド文字列のために、あなたはwchar_t
の長さによってsize()
によって返された値を乗算する必要があります。あなたは絶対に狭い(ANSI)文字列を使用する必要がある場合
bool SetStringValue(HKEY hRegistryKey,
const std::wstring& valueName,
const std::wstring& data)
{
assert(hRegistryKey != nullptr);
return (RegSetValueExW(hRegistryKey,
valueName.c_str(),
0,
REG_SZ,
(LPBYTE)(data.c_str()),
(data.size() + 1) * sizeof(wchar_t)) == ERROR_SUCCESS);
}
、することができます(そして、あなたは、いけないあなたは、ここにオペレーティングシステムと直接インターフェースユーザー・データで作業していないため)同じことをしますが、接尾辞A
のRegSetValueEx
のANSIバージョンを明示的に呼び出してください。ここでも長さに1を加えなければなりませんが、バイト単位のサイズは文字数に等しいので、スケーリングは必要ありません。
bool SetStringValue_ANSI(HKEY hRegistryKey,
const std::string& valueName,
const std::string& data)
{
assert(hRegistryKey != nullptr);
return (RegSetValueExA(hRegistryKey,
valueName.c_str(),
0,
REG_SZ,
(LPBYTE)(data.c_str()),
data.size() + 1) == ERROR_SUCCESS);
}
内部的には、RegSetValueExA
は、Unicodeに文字列を変換してからRegSetValueExW
と同じタスクを実行します。
どのようなエラーメッセージが表示されますか? –