c - 如何修复 PrintUIEntry 返回错误代码 2

标签 c winapi dll

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

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

我已检查并且文件存在。

最佳答案

如果您阅读了文档:

INFO: Windows Rundll and Rundll32 Interface

Rundll32 printui.dll,PrintUIEntry

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

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

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

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

在这种情况下,该问题将成为 How to check the result of PrintUIEntry call 的重复问题.

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

关于c - 如何修复 PrintUIEntry 返回错误代码 2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39754211/

相关文章:

.net - 随机获取 "Invalid Typeref token"错误

c - 使用基本C语言输出二维数组

将十六进制转换为 float 并将 float 转换为十六进制

user-interface - Win32 图形用户界面 : dialog in dialog

c++ - 内存中的 DLL 大小和硬盘上的大小

.net - CUDA - 维护指向全局内存的指针

Cygwin 读取从 tail -f 输入的输入

c - 任何允许与服务器直接通信的 C 中的 HTTP 库?

c++ - 重新注册用户定义的窗口类 - C++

c++ - 如何从 Windows 应用程序输出到 stdin?