Winapi:PrintUIEntry返回错误代码2

时间:2016-09-28 17:36:22

标签: c winapi dll

我是winapi的新手并且遇到了一些问题。这是我的代码:

typedef BOOL (WINAPI *pPrintUIEntry)(HWND, HMODULE, wchar_t *, DWORD);

printuiDll = LoadLibrary("printui.dll");

if (printuiDll == NULL)
{
  printf("Error LoadLibrary %d.\n", GetLastError());

  return -1;
}

PrintUIEntry = (pPrintUIEntry) GetProcAddress(printuiDll, "PrintUIEntryW");

if (PrintUIEntry == NULL)
{
  printf("Error GetProcAddress %d.\n", GetLastError());

  return -1;
}
//cmd is /ia /m "Printer" /f "C:\Program Files x86)\\drivers\Printer\Printer.inf

if (PrintUIEntry(GetDesktopWindow(), printuiDll, cmd, SW_SHOW))
{
  printf("Error PrintUIEntry %d.\n", GetLastError());

  return -1;
}

抱歉,我无法将代码复制到我的大学工作中。我遇到的问题是PrintUIEntry返回0并且它给出了代码2的错误。我试图谷歌一点关于这个功能,但我发现了很多。希望你能帮忙。感谢。

PS
我已经检查并存档。

1 个答案:

答案 0 :(得分:1)

如果您阅读文档:

INFO: Windows Rundll and Rundll32 Interface

Rundll32 printui.dll,PrintUIEntry

您会看到PrintUIEntryW函数指针的声明是错误的。最重要的是,旨在由rundll32 调用的函数没有返回值,并且PrintUIEntry未记录为使用SetLastError()进行错误报告。

因此,在这种情况下,您无法进行任何类型的错误检查。

  1. 您正在检查不存在的BOOL值,这意味着您正在检查随机值恰好存储在EAX cpu寄存器中当PrintUIEntryW退出时PrintUIEntryW没有您可以查看的返回值。

  2. 您正在调用GetLastError()来检索SetLastError()设置的最后一个错误代码。这可能与任何PrintUIEntryW错误有关,也可能没有,因为它没有记录行为。例如,PrintUIEntryW可能在内部使用其他API,可能会使用SetLastError() / GetLastError()进行自己的错误报告,并在内部由PrintUIEntryW处理。任何调用PrintUIEntryW的代码都不应解释此类错误,因为代码没有用于解释错误的上下文。

  3. 在这种情况下,此问题与How to check the result of PrintUIEntry call重复。

    由于您尝试安装打印机,请考虑改用AddPrinter()InstallPrinterDriverFromPackage()