wchar和注册表项的问题

时间:2017-11-06 11:49:48

标签: c string windows wchar-t

所以我想在注册表中添加一个字符串,因为注册表字符串是以NULL结尾的,我的字符串在各个地方都包含一个空字符。

这就是我的字符串。

char names[550] = "1DFA-3327-*\01DFA-3527-*\001DFA-E527-*\00951-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-*

所以它会占用0中的0951也会占用1中的1DFA

我尝试过:

1&GT;我尝试将字符串更改为

char names[550] = "1DFA-3327-*\0\01DFA-3527-*\0\001DFA-E527-*\0\00951-1500-

                              ^ ^ Two nulls

2 - ;我尝试了不同的转换。

for(int i; i < SIZE; i++)
   names_w[i] = (wchar_t)names[i];

1 个答案:

答案 0 :(得分:5)

问题出在你的字符串文字中。

char names[550] = "1DFA-3327-*\01DFA-3527-*\001DFA-E527-*\00951-1500-...\0";
                               ^^           ^^^           ^^

您可以以八进制表示法(\ ooo)或十六进制表示法(\ x hh)提供ASCII字符。 在您的情况下,您提供八进制表示法,这将最多吃掉三个字符。您应该将字符串更改为

char names[550] = "1DFA-3327-*\0001DFA-3527-*\0001DFA-E527-*\0000951-1500-...\0";

char names[550] = "1DFA-3327-*\0"  // put null byte at end of GUID
                  "1DFA-3527-*" "\0" // add null byte as extra literal
                  "1DFA-E527-*" "\0"
                  "0951-1500-...\0";

还可以更容易地识别字符串中的GUID。

如果要使用十六进制表示法,请注意这些表示字符可能超过两个字节,因此您还需要使用文字串联。 (见How to properly add hex escapes into a string-literal?

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";
BTW,有没有理由不直接存储宽字符串?

wchar_t names[550] = L"1DFA-3327-*\x001DFA-3527-*\x001DFA-E527-*\x000951-1500-...\0";