我创建了一个非常小的win32控制台应用程序(AddPrintMonitor.exe),它只能调用AddMonitor。这是一个小片段:
MONITOR_INFO_2 m_MonitorInfo2;
m_MonitorInfo2.pName = lpMonitorName;
TCHAR env[12] = TEXT("Windows x64");
m_MonitorInfo2.pEnvironment = env;
m_MonitorInfo2.pDLLName = lpDllName;
if ( !AddMonitor(NULL, 2, (LPBYTE) &m_MonitorInfo2) )
{
DWORD error = GetLastError();
std::cout << "Last error = " << error << "\n";
return PRINTER_ERR_API;
}
当我作为Administrators组的成员运行时失败。 GetLastError()返回5.当我以“管理员”身份运行它时,它成功,没有任何问题。我在Windows 7 x64上运行。我正在尝试安装redmonnt.dll,我确实有64位版本的dll。此任务是PostScript驱动程序的较大安装的一部分。我只是将AddMonitor部分隔离出来以消除其他外部问题。
错误5是访问冲突或安全问题。我的第一个问题是为什么管理员组的成员不能执行此函数调用?在给定此上下文的情况下,实际管理员与管理员组成员之间的区别是什么?
需要注意的其他细节。我使用InstallShield 12(旧版)进行打印机安装(addmonitor只是其中的一部分)。我通过win32函数调用添加了一个监视器,端口,驱动程序和打印机。在运行AddPrinterMonitor.exe之前,我确保redmonnt.dll确实存在于system32目录中。实际上,无论dll是否存在,我所看到的错误都没有区别。我确实看到了有关设置SeLoadDriverPrivilege的帖子。在我查看并且管理员组可以加载/卸载设备驱动程序时,这对我来说是死路一条。
另外,我正在使用win32调用来完成这项工作。这有效(我的意思是它全部工作)在Win2K,WinXP和Windows Server 2003上没有任何问题。使用像Windows 7这样的新操作系统有几个困难。有没有更好的方式让我忽略了?我试图让这个工作变得非常沮丧,所以我开始质疑Vista及更高版本的方法。
更多初始化代码:
#define MONITOR_NAME "My Redirected Port"
#define MONITOR_FILE "redmonnt.dll"
MONITOR_NAME传递给lpMonitorName,MONITOR_FILE传递给lpDllName
感谢