在我的应用程序模拟用户之后,我需要获得打印机DEVMODE结构。 只要我的架构与在32位操作系统上运行的Windows 32位应用程序相匹配,就可以正常工作,反之亦然。 但是,对于在64位操作系统上运行的我的应用程序的32位版本上的模拟之后,对于DocumentProperties的任何调用都将失败,并显示错误代码:Windows 10上的5(访问被拒绝)或Windows 7上的RPC错误。 不幸的是,由于其他需要与之交互的传统应用程序,客户无法运行我的应用程序的64位版本。
有没有人知道这个问题的工作?
这是一个小的示例代码,将展示这个问题。 您将需要将其构build为x86应用程序,并在64位操作系统上运行以查看问题。
// DocumentPropertiesTest.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include <string> #include <iostream> #include "Winspool.h" #include "DocumentPropertiesTest.h" #ifdef _DEBUG #define new DEBUG_NEW #endif // The one and only application object CWinApp theApp; using namespace std; int _tmain(int argc, TCHAR* argv[], TCHAR* envp[]) { int nRetCode = 0; HMODULE hModule = ::GetModuleHandle(NULL); if (hModule != NULL) { // initialize MFC and print and error on failure if (!AfxWinInit(hModule, NULL, ::GetCommandLine(), 0)) { // TODO: change error code to suit your needs _tprintf(_T("Fatal Error: MFC initialization failed\n")); nRetCode = 1; } else { wstring username; wstring domainName; wstring password; wstring printername; int lastError; cout << "Please specify a valid username: "; wcin >> username; cout << "Please specify the computer or domain name for the user. Use \".\" for this computer: "; wcin >> domainName; cout << "Please specify the users password: "; wcin >> password; cout << "Please give the printer name: "; wcin.ignore(); getline (wcin, printername); HANDLE pHandle; HANDLE pPrinter; if (LogonUser(username.c_str(), domainName.c_str(), password.c_str(), LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, &pHandle) != 0) { if (ImpersonateLoggedOnUser(pHandle) != 0) { PRINTER_DEFAULTS printerDefaults; printerDefaults.pDatatype = NULL; printerDefaults.pDevMode = NULL; printerDefaults.DesiredAccess = PRINTER_ALL_ACCESS; if (::OpenPrinter((LPWSTR)(printername.c_str()), &pPrinter, NULL)) { int dSize = ::DocumentPropertiesW(NULL, pPrinter, (LPWSTR)(printername.c_str()), NULL, NULL, 0); if (dSize > 0) { } else { lastError = ::GetLastError(); cout << "Failed DocumentProperties with Error code: " << lastError << endl; } ::ClosePrinter(pPrinter); } else { lastError = ::GetLastError(); cout << "Failed OpenPrinter with Error code: " << lastError << endl; } RevertToSelf(); } else { lastError = ::GetLastError(); cout << "Failed ImpersonateLogonUser with Error code: " << lastError << endl; } } else { lastError = ::GetLastError(); cout << "Failed LogonUser with Error code: " << lastError << endl; } system("pause"); } } else { // TODO: change error code to suit your needs _tprintf(_T("Fatal Error: GetModuleHandle failed\n")); nRetCode = 1; } return nRetCode; }