描述:
            我需要安装打印驱动到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目录下,就可以了。
 我之前也遇到和搂主同样的问题,这样做以后就解决了。
            我也来顶一个!
我碰到的问题更麻烦,
 

