2010-12-19 99 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));