首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有FormatMessage函数的printf

带有FormatMessage函数的printf
EN

Stack Overflow用户
提问于 2015-11-26 14:58:19
回答 2查看 746关注 0票数 1

我正在尝试学习一些WinAPI内容,并且使用了RegOpenKeyEx函数。我有这样的代码:

代码语言:javascript
复制
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。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-11-26 15:13:53

FormatMessage是一个宏,它将是FormatMessageW,它使用Unicode,或者FormatMessageA,它使用ANSI代码,这取决于是否定义了宏UNICODE

char**传递给函数,因此应该使用FormatMessageA而不是FormatMessage显式使用ANSI代码,并将强制转换移至LPSTR

票数 2
EN

Stack Overflow用户

发布于 2015-11-26 15:11:16

您应该使用tchar.h定义代码,这样您的代码就可以同时工作在UNICODE和非Unicode构建上。这意味着,与char使用TCHAR不同,TCHAR将解析为UNICODE构建上的wchar_t,以及非UNICODE上的char。LPSTR应该是LPTSTR (额外的T在里面)。你的打印本应该是:

代码语言:javascript
复制
_tprintf(_T("Error code %i: %s\n"), openKey, errorMsg);

所以正确的代码应该是这样的;

代码语言:javascript
复制
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字符串/函数。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33941656

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档