簡體   English   中英

C ++ REG_SZ值添加失敗

[英]C++ REG_SZ value adding fails

此代碼的目的是添加或編輯KeyboardDelay REG_SZ的值。 我能做的是使它的值為0但是當我嘗試將其設為31時,它會失敗並且一個奇怪的“盒子”作為KeyboardDelays數據值而不是31號。我做錯了什么因為它不會添加31但是它會做0嗎?

HKEY key;
if (RegOpenKey(HKEY_CURRENT_USER, TEXT("Control Panel\\Keyboard"), &key) != ERROR_SUCCESS)
{
cout << "Unable to open registry key";
}

if (RegSetValueEx(key, TEXT("KeyboardDelay"), 0, REG_SZ, (LPBYTE)"31", strlen("31")*sizeof(char)) != ERROR_SUCCESS)
{
RegCloseKey(key);
cout <<"Unable to set registry value value_name";
}
else
{
   cout << "KeyboardDelay was set" << endl;
} 

RegSetValueEx在winreg.h中定義如下:

#ifdef UNICODE
#define RegSetValueEx  RegSetValueExW
#else
#define RegSetValueEx  RegSetValueExA
#endif // !UNICODE

這意味着當定義UNICODE時,將使用RegSetValueExW。 最后一個字母'W'表示它接受寬字符串(wchar_t *),'A'表示它接受多字節字符串。 因此,如果您知道正在編譯啟用UNICODE(項目屬性 - >配置 - >字符集 - >使用Unicode字符集),則應提供寬字符串文字。 在Windows下最簡單的方法是使用宏:

TEXT("31")

或者我最喜歡的:

_T("31")

這兩個宏在非UNICODE編譯下將變為“31”,在UNICODE編譯下變為L“31”。

你也應該使用正確的字符串函數來獲取長度,使用wcslen作為UNICODE,使用strlen作為多字節字符集。 您可以使用_t *宏來檢查字符集,並使用_tcslen()來獲取長度。

實際上,在創建新項目時應始終使用UNICODE。

修復你的代碼使用:

if (RegSetValueEx(key, TEXT("KeyboardDelay"), 0, REG_SZ, (LPBYTE)TEXT("31"),_tcslen(TEXT("31"))*sizeof(TCHAR)) != ERROR_SUCCESS)

這里使用sizeof(TCHAR),因為當定義UNICODE時,單個字符長度為兩個字節,RegSetValueEx需要字節數而不是字符數。

在MSDN中描述'如果數據類型為REG_SZ,REG_EXPAND_SZ或REG_MULTI_SZ,則cbData必須包括終止空字符或字符的大小。

所以我想代碼應該是:

if (RegSetValueEx(key, TEXT("KeyboardDelay"), 0, REG_SZ, (LPBYTE)TEXT("31"), (_tcslen(TEXT("31")) + 1)*sizeof(TCHAR)) != ERROR_SUCCESS)

暫無
暫無

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

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