wchar和注册表项存在问题

wchar和注册表项存在问题,c,string,windows,wchar-t,C,String,Windows,Wchar T,因此,我想向注册表添加一个字符串,因为注册表字符串以NULL结尾,所以我的字符串在不同的位置包含一个NULL字符 这就是我的绳子的样子 字符名[550]=“1DFA-3327-*\01DFA-3527-*\001DFA-E527-*\00951-1500- ^ ^ Two nulls 我将其转换为whcar\t字符串,如下所示 wchar_t names_w[1000]; size_t charsConverted = 0; mbst

因此,我想向注册表添加一个字符串,因为注册表字符串以NULL结尾,所以我的字符串在不同的位置包含一个NULL字符

这就是我的绳子的样子

字符名[550]=“1DFA-3327-*\01DFA-3527-*\001DFA-E527-*\00951-1500-

                              ^ ^ Two nulls
我将其转换为
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-*
2> 我尝试了不同的转换

for(int i; i < SIZE; i++)
   names_w[i] = (wchar_t)names[i];
for(int i;i
问题在于字符串文字

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";

这也使得识别字符串中的guid更加容易

如果您想使用十六进制表示法,那么请注意这些表示法可能会占用两个以上的字节,所以您还需要使用文字连接

顺便问一下,有没有理由不直接存储宽字符字符串

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

问题在于字符串文字

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";

这也使得识别字符串中的guid更加容易

如果您想使用十六进制表示法,那么请注意这些表示法可能会占用两个以上的字节,所以您还需要使用文字连接

顺便问一下,有没有理由不直接存储宽字符字符串

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

为什么你有NUL在你的字符串中间?@ StAdvuru这与Windows注册表有关。一种注册表项是一个由多个空终止字符串组成的多字符串。因此,“0”作为分隔符,双“0”作为终止符。“?为什么在字符串的中间有NUL?@ StAdvuru:这与Windows注册表有关。一种类型的注册表项是由多个以null结尾的字符串组成的多字符串。因此,'\0'作为分隔符,双'\0'作为终止符。那么
L“blabla”
呢?谢谢,这就解决了这个问题。尽管我需要将字符串拆分为
“1DFA-3327-*”“\x0”“01DFA-3527”
注意:十六进制转义不一定限于2个字符,如中所示。@qwn这是个好主意。它有助于保持对所有guid的概述,并使guid之间以及与空字节之间的分离变得更容易。谢谢,这解决了这个问题。尽管我需要将字符串拆分为
“1DFA-3327-*”“\x0”“01DFA-3527”
注意:十六进制转义不一定限于2个字符,如中所示。@qwn这是个好主意。它有助于保持对所有guid的概述,并使guid之间以及与空字节之间的分离变得更容易。