我正在尝试学习一些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
有谁可以帮我?
我正在使用最新的2015。
发布于 2015-11-26 15:13:53
FormatMessage是一个宏,它将是FormatMessageW,它使用Unicode,或者FormatMessageA,它使用ANSI代码,这取决于是否定义了宏UNICODE。
将char**传递给函数,因此应该使用FormatMessageA而不是FormatMessage显式使用ANSI代码,并将强制转换移至LPSTR。
发布于 2015-11-26 15:11:16
您应该使用tchar.h定义代码,这样您的代码就可以同时工作在UNICODE和非Unicode构建上。这意味着,与char使用TCHAR不同,TCHAR将解析为UNICODE构建上的wchar_t,以及非UNICODE上的char。LPSTR应该是LPTSTR (额外的T在里面)。你的打印本应该是:
_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字符串/函数。
https://stackoverflow.com/questions/33941656
复制相似问题