簡體   English   中英

wchar和注冊表項的問題

[英]Problems with wchar and registry entry

因此,我想向注冊表添加一個字符串,因為注冊表字符串要以NULL終止,所以我的字符串在各個地方都包含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-*

所以它吃掉09510也吃掉1DFA1

我試過的

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更容易。

如果要使用十六進制表示法,請注意它們可能會占用兩個以上的字節,因此還需要使用文字串聯。 (請參閱如何將十六進制轉義符正確添加到字符串字面量中?

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM