描述:
我需要安装打印驱动到Local Port。也就是说在安装驱动前需要在机器上添加一个端口,类型是localport。试用了两种方法:
1、AddPort(NULL,NULL,"Local Port")方法:但这种会弹出对话框,要求用户输入端口名称
2、修改注册表HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Ports,这样需要重启spooler服务。
我想做到在安装驱动前添加好端口,并且不需要用户参与。应该怎么做了?请教大家~
解决方案1:
但是使用用上面的代码的前提是在应用层调用AddPort时要指定第二个参数为NULL
你可以在DDK 2000/XP自带的Localui文件夹中,打开config.c文件,把对应的AddPortUI函数修改成如下的代码就行:
BOOL
AddPortUI(
PCWSTR pszServer,
HWND hWnd,
PCWSTR pszMonitorNameIn,
PWSTR *ppszPortNameOut
)
{
PWSTR pszPortName = NULL;
BOOL rc = TRUE;
WCHAR szLocalMonitor[MAX_PATH+1];
DWORD dwReturn, dwStatus;
DWORD cbNeeded;
PRINTER_DEFAULTS Default;
PWSTR pszServerName = NULL;
HANDLE hXcv = NULL;
/* Get the user to enter a port name:
*/
if (!(pszServerName = ConstructXcvName(pszServer, pszMonitorNameIn, L"XcvMonitor"))) {
rc = FALSE;
goto Done;
}
Default.pDatatype = NULL;
Default.pDevMode = NULL;
Default.DesiredAccess = SERVER_ACCESS_ADMINISTER;
if (!(rc = OpenPrinter((PWSTR) pszServerName, &hXcv, &Default))) {
rc = FALSE;
goto Done;
}
if(hWnd) //添加了这一条语句,你就不会再看到弹出来的对话框了
{
if (!(pszPortName=GetPortName(hWnd, hXcv))) {
rc = FALSE;
goto Done;
}
}
else{
//这里填写你自己在应用层调用AddPort时设置的端口名字
pszPortName=L"Local Port";
}
// We can't Add, Configure, or Delete Remote COM ports
if (IS_COM_PORT(pszPortName) || IS_LPT_PORT(pszPortName)) {
SetLastError(ERROR_NOT_SUPPORTED);
rc = FALSE;
goto Done;
}
if(IS_COM_PORT(pszPortName))
CharUpperBuff(pszPortName, 3);
else if(IS_LPT_PORT(pszPortName))
CharUpperBuff(pszPortName, 3);
rc = XcvData( hXcv,
L"AddPort",
(PBYTE) pszPortName,
(wcslen(pszPortName) + 1)*sizeof(WCHAR),
(PBYTE) &dwReturn,
0,
&cbNeeded,
&dwStatus);
if (rc) {
if(dwStatus == ERROR_SUCCESS) {
if(ppszPortNameOut)
*ppszPortNameOut = AllocSplStr(pszPortName);
if(IS_LPT_PORT(pszPortName))
rc = ConfigLPTPort(hWnd, hXcv);
else if(IS_COM_PORT(pszPortName))
rc = ConfigCOMPort(hWnd, hXcv, pszServer, pszPortName);
} else if (dwStatus == ERROR_ALREADY_EXISTS) {
Message( hWnd, MSG_ERROR, IDS_LOCALMONITOR, IDS_PORTALREADYEXISTS_S, pszPortName );
} else {
SetLastError(dwStatus);
rc = FALSE;
}
}
Done:
if(hWnd)
FreeSplStr(pszPortName);
FreeSplMem(pszServerName);
if (hXcv)
ClosePrinter(hXcv);
return rc;
}
编译好localui后加载到注册表和WINDOWS的System 32目录下,就可以了。
我之前也遇到和搂主同样的问题,这样做以后就解决了。
我也来顶一个!
我碰到的问题更麻烦,