addmonitor win32调用失败,使用lasterror 5

时间:2012-07-30 20:27:03

标签: winapi device-driver windows-7-x64 administrator printers

我创建了一个非常小的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

感谢

0 个答案:

没有答案