我是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
我已经检查并存档。
答案 0 :(得分:1)
如果您阅读文档:
INFO: Windows Rundll and Rundll32 Interface
Rundll32 printui.dll,PrintUIEntry
您会看到PrintUIEntryW
函数指针的声明是错误的。最重要的是,旨在由rundll32
调用的函数没有返回值,并且PrintUIEntry
未记录为使用SetLastError()
进行错误报告。
因此,在这种情况下,您无法进行任何类型的错误检查。
您正在检查不存在的BOOL
值,这意味着您正在检查随机值恰好存储在EAX
cpu寄存器中当PrintUIEntryW
退出时PrintUIEntryW
没有您可以查看的返回值。
您正在调用GetLastError()
来检索SetLastError()
设置的最后一个错误代码。这可能与任何PrintUIEntryW
错误有关,也可能没有,因为它没有记录行为。例如,PrintUIEntryW
可能在内部使用其他API,可能会使用SetLastError()
/ GetLastError()
进行自己的错误报告,并在内部由PrintUIEntryW
处理。任何调用PrintUIEntryW
的代码都不应解释此类错误,因为代码没有用于解释错误的上下文。
在这种情况下,此问题与How to check the result of PrintUIEntry call重复。
由于您尝试安装打印机,请考虑改用AddPrinter()
或InstallPrinterDriverFromPackage()
。