2010-12-19 153 views
2

我在數據上鑄造(char *),並且我在註冊表中只獲取一個char值。如果 我不使用轉換msvc 2010告訴我參數類型LPCTSTR與const char *不兼容。C++ RegSetValueEx在註冊表中只設置一個字符值

有人可以幫我嗎?

HKEY hKey; 
LPCTSTR sk = TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run"); 

LONG openRes = RegOpenKeyEx(HKEY_CURRENT_USER, sk, 0, KEY_ALL_ACCESS , &hKey); 

if (openRes==ERROR_SUCCESS) { 
    printf("Success opening key."); 
} else { 
    printf("Error opening key."); 
} 

LPCTSTR value = TEXT("SomeKey"); 
LPCTSTR data = L"TestData\0"; 

LONG setRes = RegSetValueEx (hKey, value, 0, REG_SZ, (LPBYTE)data, strlen(data)+1); 

if (setRes == ERROR_SUCCESS) { 
    printf("Success writing to Registry."); 
} else { 
    printf("Error writing to Registry."); 
} 
cout << setRes << endl; 

LONG closeOut = RegCloseKey(hKey); 
if (closeOut == ERROR_SUCCESS) { 
    printf("Success closing key."); 
} else { 
    printf("Error closing key."); 
} 
+0

湯姆,它在第三個問題最近幾個小時與窄字符和寬字符字符串的不一致使用有關。不要每次遇到問題時都在SO上編寫代碼,也許最好是查看整個代碼以消除這些不一致之處?也許,這篇文章可以幫助:http://msdn.microsoft.com/en-us/library/ff381407%28v=vs.85%29.aspx? – atzz 2010-12-19 21:09:46

回答

7

strlen(data)可能返回值爲1,因爲strlen期望char *和L"TestData\0"是寬的。使用TEXT("TestData\0")並致電_tcslen(data)
注意RegSetValueEx預計的sizeof數據,所以使用_tcslen(data) * sizeof(TCHAR)

+0

看起來比我的更好的解釋/建議:) – zenzelezz 2010-12-19 20:49:52

+0

當我嘗試使用此,例如LPCTSTR數據= TEXT(「ThisIsTheValueIWant \ 0」);那麼我只在註冊表中獲得「ThisIsTheV」我該怎麼辦? – Tom 2010-12-19 21:02:13

+0

已修改的答案將其考慮在內。 – 2010-12-19 21:20:46

1

你在哪裏投射數據?

無論哪種方式,它看起來像你可能使用寬字符,但你似乎正在使用「普通舊」strlen - 而不是wcslen或其他函數旨在使用寬字符字符串。

0

通過tcslen(data) * sizeof(TCHAR));

更換L"TestData"通過_T("TestData");strlen(data)+1所以你的代碼如下所示:

LPCTSTR value = TEXT("SomeKey"); 
LPCTSTR data = TEXT("TestData"); 

LONG setRes = RegSetValueEx(hKey, value, 0, REG_SZ, (LPBYTE)data, _tcslen(data) * sizeof(TCHAR));