printf与FormatMessage函数

时间:2015-11-26 14:58:20

标签: c winapi

我正在尝试学习一些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。

2 个答案:

答案 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字符串/函数。