c ++ RegSetValueEx在注册表中只设置一个char值

时间:2010-12-19 20:36:01

标签: c++ windows winapi registry

我正在对数据进行转换(char *),而我在注册表中只获得一个char值。如果 我不使用转换msvc 2010告诉我参数类型LPCTSTR与const char *不兼容。

有人可以帮助我吗?

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.");
}

3 个答案:

答案 0 :(得分:8)

strlen(data)可能返回值1,因为strlen期望char *和L"TestData\0"是宽的。使用TEXT("TestData\0")并致电_tcslen(data) 请注意,RegSetValueEx需要数据的大小,因此请使用_tcslen(data) * sizeof(TCHAR)

答案 1 :(得分:1)

你在哪里投射数据?

无论哪种方式,看起来你可能正在使用宽字符,但你似乎使用“普通旧”strlen - 而不是wcslen或其他一些用于处理宽字符字符串的函数。

答案 2 :(得分:1)

L"TestData"替换为_T("TestData");,将strlen(data)+1替换为tcslen(data) * sizeof(TCHAR));

因此您的代码如下所示:

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

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