0

在此示例中,dwerror 为10045L.但此代码返回 0x13d 值作为错误。如何获取格式消息?请查看。

TCHAR lpMsgBuf[512];
if(!FormatMessage(
    FORMAT_MESSAGE_ALLOCATE_BUFFER | 
    FORMAT_MESSAGE_FROM_SYSTEM,
    NULL,
    dwError,
    MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
    (LPTSTR) &lpMsgBuf,
    0, NULL ))
{
    wprintf(L"Format message failed with 0x%x\n", GetLastError());
    return;
}
4

2 回答 2

1

首先,当你说 FORMAT_MESSAGE_ALLOCATE_BUFFER 时,你不需要分配超过一个指针。然后在 lpBuffer 中传递一个指向该指针的指针。所以试试这个:

TCHAR* lpMsgBuf;
if(!FormatMessage(
    FORMAT_MESSAGE_ALLOCATE_BUFFER | 
    FORMAT_MESSAGE_FROM_SYSTEM,
    NULL,
    dwError,
    MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
    (LPTSTR) &lpMsgBuf,
    0, NULL ))
{
    wprintf(L"Format message failed with 0x%x\n", GetLastError());
    return;
}

不要忘记拨打 LocalFree

或者您自己分配缓冲区:

TCHAR lpMsgBuf[512];
if(!FormatMessage(
    FORMAT_MESSAGE_FROM_SYSTEM,
    NULL,
    dwError,
    MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
    (LPTSTR) lpMsgBuf,
    512, NULL ))
{
    wprintf(L"Format message failed with 0x%x\n", GetLastError());
    return;
}

另外,试试这个:

#include <cstdio>
#include <cstdlib>

int alloc(char** pbuff,unsigned int n)
{
*pbuff=(char*)malloc(n*sizeof(char));
}

int main()
{
char buffer[512];

printf("Address of buffer before: %p\n",&buffer);

//  GCC sais: "cannot convert char (*)[512] to char** ... "
//  alloc(&buffer,128);

//  if i try to cast:   
alloc((char**)&buffer,128);
printf("Address of buffer after:  %p\n",&buffer);

// if i do it the right way:
char* p_buffer;
alloc(&p_buffer,128);
printf("Address of buffer after:  %p\n",p_buffer);


return 0;
}

尝试更改变量的地址是没有意义的。这可能就是您的代码不起作用的原因。

于 2012-02-27T09:35:12.580 回答
1

0x13d == 317 == ERROR_MR_MID_NOT_FOUND。您尝试查找的错误消息在 SYSTEM 中不存在。也许您的错误源自特定的dll驱动程序。如果您知道哪个 dll\driver 尝试获取它,则处理并指定FORMAT_MESSAGE_FROM_HMODULE而不是FORMAT_MESSAGE_FROM_SYSTEM提供句柄作为调用中的源FormatMessage

除此之外,如果你使用FORMAT_MESSAGE_ALLOCATE_BUFFER,你应该声明一个类型的变量,LPTSTR并将LPTSTR pMsg;其传递给 FormatMessage (LPTSTR)&pMsg,当你完成它时,使用它LocalFree(pMsg)来释放分配的内存。

于 2012-02-27T17:56:34.633 回答