wchar 和注册表项的问题
Problems with wchar and registry entry
所以我想在注册表中添加一个字符串,因为注册表字符串以 NULL 结尾,我的字符串在各个地方都包含一个空字符。
这是我的字符串的样子。
char names[550] = "1DFA-3327-*DFA-3527-*[=15=]1DFA-E527-*[=15=]951-1500-
我将其转换为 whcar_t
字符串,就像这样。
wchar_t names_w[1000];
size_t charsConverted = 0;
mbstowcs_s(&charsConverted, names_w, names, SIZE);
RegSetValueEx(*pKeyHandle, valueName, 0, REG_MULTI_SZ, (LPBYTE)names_w, size);
注册表项应该是
1DFA-3327-*
1DFA-3527-*
1DFA-E527-*
0951-1500-*
0951-0004-*
0951-160D-*
但这是现在的注册表项,
1DFA-3327-*
<a box here>DFA-3527-*
<a box here>DFA-E527-*
951-1500-*
951-0004-*
951-160D-*
所以它吃掉了 0951
中的 0
也吃掉了 1DFA
中的 1
我尝试过的:
1> 我尝试将字符串更改为
char names[550] = "1DFA-3327-*[=21=]DFA-3527-*[=21=][=21=]1DFA-E527-*[=21=][=21=]951-1500-
^ ^ Two nulls
2> 我尝试了不同的转换方式。
for(int i; i < SIZE; i++)
names_w[i] = (wchar_t)names[i];
问题出在您的字符串文字上。
char names[550] = "1DFA-3327-*DFA-3527-*[=10=]1DFA-E527-*[=10=]951-1500-...[=10=]";
^^ ^^^ ^^
您可以提供八进制 (\ooo) 或十六进制 (\x hh) 的 ASCII 字符。
在您的情况下,您提供八进制表示法,这会占用接下来最多三个字符。您应该将字符串更改为
char names[550] = "1DFA-3327-*[=11=]01DFA-3527-*[=11=]01DFA-E527-*[=11=]00951-1500-...[=11=]";
或
char names[550] = "1DFA-3327-*[=12=]" // put null byte at end of GUID
"1DFA-3527-*" "[=12=]" // add null byte as extra literal
"1DFA-E527-*" "[=12=]"
"0951-1500-...[=12=]";
这也使得识别字符串中的 GUID 变得更加容易。
如果您想使用十六进制表示法,请注意它们可能会占用两个以上的字节,因此您还需要使用文字串联。 (参见 )
char names[550] = "1DFA-3327-*\x00" // put null byte at end of GUID
"1DFA-3527-*" "\x00" // add null byte as extra literal
"1DFA-E527-*" "\x00"
"0951-1500-...\x00";
顺便说一句,有什么理由不直接存储宽字符字符串吗?
wchar_t names[550] = L"1DFA-3327-*\x001DFA-3527-*\x001DFA-E527-*\x000951-1500-...[=14=]";
所以我想在注册表中添加一个字符串,因为注册表字符串以 NULL 结尾,我的字符串在各个地方都包含一个空字符。
这是我的字符串的样子。
char names[550] = "1DFA-3327-*DFA-3527-*[=15=]1DFA-E527-*[=15=]951-1500-
我将其转换为 whcar_t
字符串,就像这样。
wchar_t names_w[1000];
size_t charsConverted = 0;
mbstowcs_s(&charsConverted, names_w, names, SIZE);
RegSetValueEx(*pKeyHandle, valueName, 0, REG_MULTI_SZ, (LPBYTE)names_w, size);
注册表项应该是
1DFA-3327-*
1DFA-3527-*
1DFA-E527-*
0951-1500-*
0951-0004-*
0951-160D-*
但这是现在的注册表项,
1DFA-3327-*
<a box here>DFA-3527-*
<a box here>DFA-E527-*
951-1500-*
951-0004-*
951-160D-*
所以它吃掉了 0951
中的 0
也吃掉了 1DFA
1
我尝试过的:
1> 我尝试将字符串更改为
char names[550] = "1DFA-3327-*[=21=]DFA-3527-*[=21=][=21=]1DFA-E527-*[=21=][=21=]951-1500-
^ ^ Two nulls
2> 我尝试了不同的转换方式。
for(int i; i < SIZE; i++)
names_w[i] = (wchar_t)names[i];
问题出在您的字符串文字上。
char names[550] = "1DFA-3327-*DFA-3527-*[=10=]1DFA-E527-*[=10=]951-1500-...[=10=]";
^^ ^^^ ^^
您可以提供八进制 (\ooo) 或十六进制 (\x hh) 的 ASCII 字符。 在您的情况下,您提供八进制表示法,这会占用接下来最多三个字符。您应该将字符串更改为
char names[550] = "1DFA-3327-*[=11=]01DFA-3527-*[=11=]01DFA-E527-*[=11=]00951-1500-...[=11=]";
或
char names[550] = "1DFA-3327-*[=12=]" // put null byte at end of GUID
"1DFA-3527-*" "[=12=]" // add null byte as extra literal
"1DFA-E527-*" "[=12=]"
"0951-1500-...[=12=]";
这也使得识别字符串中的 GUID 变得更加容易。
如果您想使用十六进制表示法,请注意它们可能会占用两个以上的字节,因此您还需要使用文字串联。 (参见
char names[550] = "1DFA-3327-*\x00" // put null byte at end of GUID
"1DFA-3527-*" "\x00" // add null byte as extra literal
"1DFA-E527-*" "\x00"
"0951-1500-...\x00";
顺便说一句,有什么理由不直接存储宽字符字符串吗?
wchar_t names[550] = L"1DFA-3327-*\x001DFA-3527-*\x001DFA-E527-*\x000951-1500-...[=14=]";