我正在尝试学习一些WinAPI,并使用RegOpenKeyEx函数。我有这段代码:
LPCTSTR subKey;
subKey = TEXT("WinSide");
HKEY hKey = HKEY_CURRENT_USER;
DWORD options = 0;
REGSAM samDesired = KEY_READ | KEY_WRITE;
HKEY hResult;
long openKey = RegOpenKeyEx(hKey, subKey, options, samDesired, &hResult);
if (( openKey == ERROR_SUCCESS))
{
printf_s("Registry subkey opened! \n");
}
else
{
char *errorMsg = NULL;
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_ARGUMENT_ARRAY | FORMAT_MESSAGE_ALLOCATE_BUFFER,
NULL,openKey, 0, (LPSTR)&errorMsg,0,NULL);
printf("Error code %i: %s\n", openKey, errorMsg);
LocalFree(errorMsg);
}
RegCloseKey(hResult);
问题是,如果例如密钥不存在,则printf显示:
错误代码2:T
任何人都可以帮助我吗?
我正在使用最新的Visual Studio 2015。
答案 0 :(得分:2)
FormatMessage
是一个宏,将FormatMessageW
使用Unicode,或FormatMessageA
,它使用ANSI代码,具体取决于是否定义了宏UNICODE
。
您将char**
传递给该函数,因此您应该使用FormatMessageA
代替FormatMessage
使其明确使用ANSI代码,并将强制转换移至LPSTR
。< / p>
答案 1 :(得分:1)
您应该使用tchar.h定义代码,这样您的代码将在UNICODE和非Unicode构建中工作。这意味着,char
代替TCHAR
使用TCHAR
,将解析为UNICODE构建时的wchar_t,以及非UNICODE上的char。 LPSTR
应为LPTSTR
(内部附加T)。你的printf应该是:
_tprintf(_T("Error code %i: %s\n"), openKey, errorMsg);
所以正确的代码应该是这样的;
TCHAR *errorMsg = NULL;
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_ARGUMENT_ARRAY | FORMAT_MESSAGE_ALLOCATE_BUFFER,
NULL,openKey, 0, (LPTSTR)&errorMsg,0,NULL);
_tprintf(_T("Error code %i: %s\n"), openKey, errorMsg);
LocalFree(errorMsg);
我认为您的问题是由于您正在编译UNICODE构建但使用非UNICODE字符串/函数。