【问题标题】:FormatMessage returns NULL in lpBufferFormatMessage 在 lpBuffer 中返回 NULL
【发布时间】:2014-01-02 19:46:13
【问题描述】:

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

调用返回 false,因此我将调用 GetLastError,正如文档中所说的 (FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM)。这里返回的值是十进制的E000024B3758096971。但是,当我使用来自GetLastError 的返回值调用FormatMessage 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);

【问题讨论】:

  • 也许你的代码是错误的。由于您将其保密,我建议您必须自己调试它。
  • GetLastError 返回什么?
  • @David Heffernan: 0xE000024B 或 3758096971(十进制)
  • 这看起来不像是系统错误代码。对不起。那在Q中。不应该再问了。感谢代码更新。
  • @David Heffernan:我知道,这就是它如此令人费解的原因。

标签: c winapi device-driver


【解决方案1】:

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

【讨论】:

  • 我自己怎么知道错误字符串是什么?
  • 这是“文件哈希不在目录中”。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-04
    • 1970-01-01
    • 2011-12-30
    • 2016-11-07
    • 1970-01-01
    • 1970-01-01
    • 2020-01-11
    • 2021-02-22
    相关资源
    最近更新 更多