gpt4 book ai didi

c - wchar 和注册表项的问题

转载 作者:可可西里 更新时间:2023-11-01 11:11:27 28 4
gpt4 key购买 nike

所以我想向注册表添加一个字符串,因为注册表字符串以 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-*

所以它吃掉了 0951 中的 0 也吃掉了 1DFA 中的 1

我尝试过的:

1> 我尝试将字符串更改为

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

最佳答案

问题出在您的字符串文字上。

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

顺便说一句,有什么理由不直接存储宽字符字符串吗?

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

关于c - wchar 和注册表项的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47136357/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com