【问题标题】:How to fix PrintUIEntry returns error code 2如何修复 PrintUIEntry 返回错误代码 2
【发布时间】:2017-02-06 19:54:44
【问题描述】:

我有一些问题。这是我的代码:

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。我试着用谷歌搜索一下这个功能,但我能找到很多。希望你能帮忙。谢谢。

我已经检查并且文件存在。

【问题讨论】:

  • 从命令提示符输入rundll32.exe printui.dll PrintUIEntry,然后查看它所期望的附加信息。是什么给您的印象,您可以直接调用它而无需这些细节?您在哪里可以找到传递给它的参数的文档?为什么你会期望它寻找已经从其中加载的 DLL 的 HMODULE 作为这些参数之一?
  • 您希望我们告诉您什么?错误是找不到文件。但后来你知道了,因为你查了一下。这有关系吗?可能是。 cmd的价值是什么?只有你知道。
  • 进程远程启动,无法查看cmd的值,抱歉,我会补充更多细节
  • 所以换句话说,你不知道你的代码做了什么,你希望有人解释它的行为。
  • 不,我想知道为什么我得到错误代码2

标签: c winapi dll


【解决方案1】:

如果您阅读文档:

INFO: Windows Rundll and Rundll32 Interface

Rundll32 printui.dll,PrintUIEntry

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

所以在这种情况下你不能做任何类型的错误检查。

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

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

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

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

【讨论】:

  • 还有一个问题,我有这样的代码Log() << "Before -> " << GetLastError() << ".\n"; PrintUIEntry(GetDesktopWindow(), printuiDll, cmd, SW_SHOW); Log() << "After -> " << GetLastError() << ".\n";,它返回after -> 2
  • 我在回答中提到了这一点。
猜你喜欢
  • 2021-12-31
  • 1970-01-01
  • 1970-01-01
  • 2019-05-14
  • 1970-01-01
  • 2021-12-25
  • 2018-05-05
  • 2019-09-29
  • 1970-01-01
相关资源
最近更新 更多