FormatMessage在lpBuffer中返回NULL

时间:2014-01-02 19:46:14

标签: c winapi device-driver

我正在呼叫SetupCopyOEMInf复制设备驱动程序的.inf文件(MSFT文档说:'SetupAPI继续用于installing device drivers')。

调用返回false,因此我按照文档说的那样调用GetLastErrorFORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM)。此处返回的值为十进制E000024B3758096971。但是,当我使用FormatMessage的返回值来调用GetLastError as prescribed时,lpBuffer为NULL。

还要弄清楚为什么SetupCopyOEMInf会失败(它似乎适用于某些.inf文件而不是其他文件)。这是Windows 8.1

令人费解......有什么想法吗?

谢谢!

代码:

BOOL result = SetupCopyOEMInf(_T("C:\\Users\\edward\\Desktop\\_Test\\cncport.inf"), NULL, SPOST_PATH, 0, NULL, 0, NULL, NULL);

//result is FALSE

LPVOID lpBuffer;
DWORD dw = GetLastError();

DWORD dwMsg = FormatMessage(
    FORMAT_MESSAGE_ALLOCATE_BUFFER |
    FORMAT_MESSAGE_FROM_SYSTEM |
    FORMAT_MESSAGE_IGNORE_INSERTS,
    NULL,
    dw,
    MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
    (LPTSTR)&lpBuffer,
    2048, NULL);

2 个答案:

答案 0 :(得分:7)

FORMAT_MESSAGE_FROM_SYSTEM does not support all error codes。您找到的是ERROR_FILE_HASH_NOT_IN_CATALOG FORMAT_MESSAGE_FROM_SYSTEM未涵盖的{{3}}。 setupapi.h错误似乎在系统消息资源中没有任何预定义文本。您必须自己编写错误字符串。

答案 1 :(得分:2)

即使这篇文章是刚刚创建的,你实际上可以通过使用HRESULT_FROM_SETUPAPI宏来获取文本(由Microsoft在http://msdn.microsoft.com/en-us/library/windows/hardware/ff545011%28v=vs.85%29.aspx发布)。这会将返回的错误代码映射到可以在FormatMessage函数中使用的错误代码。