2016-08-19 291 views
1

我正在尝试使用DeviceCapabilities获取网络打印机支持的页面大小列表,并且完全与sPort参数混淆。网络打印机的DeviceCapabilities

DWORD nPapersCount = ::DeviceCapabilities(sPrinter, sPort, DC_PAPERS, nullptr, nullptr); 

任何人都可以建议我,我应该在网络打印机的sPort中提供什么,以及我如何可靠地获得该端口?

作为实验,我尝试过格式为“\\ Share”的PC名称,其端口“\\ Share \ LPT1”,只是“LPT1”,没有运气。

此外,我找到了EnumPorts函数,所以我可以获得远程服务器上的打印机端口列表,但我不知道如何处理端口列表(如果服务器上有多个打印机)。

typedef struct _PORT_INFO_2 { 
    LPTSTR pPortName; 
    LPTSTR pMonitorName; 
    LPTSTR pDescription; 
    DWORD fPortType; 
    DWORD Reserved; 
} PORT_INFO_2, *PPORT_INFO_2; 

回答

1

你不能猜出PORTNAME,特别是在网络打印机的情况下。使用PrintDlg从当前选定的打印机获取信息(这可以在不显示打印对话框的情况下完成)。

端口名称可通过hDevNamesPRINTDLG结构成员。

DEVNAMES structure

typedef struct tagDEVNAMES { 
    WORD wDriverOffset; 
    WORD wDeviceOffset; 
    WORD wOutputOffset; //<= port name 
    WORD wDefault; 
} DEVNAMES, *LPDEVNAMES; 

Unicode的例子:

PRINTDLG pdlg = { sizeof PRINTDLG }; 
pdlg.Flags = PD_RETURNDEFAULT; 
PrintDlg(&pdlg); 

LPDEVNAMES lpDev = (LPDEVNAMES)GlobalLock(pdlg.hDevNames); 
std::wstring device = (LPCTSTR)lpDev + lpDev->wDeviceOffset; 
std::wstring port = (LPCTSTR)lpDev + lpDev->wOutputOffset; 
::GlobalUnlock(pdlg.hDevNames); 

//clean up after PrintDlg, as pointed out by @RemyLebeau 
GlobalFree(pdlg.hDevMode); 
GlobalFree(pdlg.hDevNames); 

int nPapersCount; 
nPapersCount = ::DeviceCapabilities(device.c_str(), port.c_str(), DC_PAPERS, NULL, NULL); 
if (nPapersCount > 0) 
{ 
    WORD* sizeBuf = new WORD[nPapersCount]; 
    DeviceCapabilities(device.c_str(), port.c_str(), DC_PAPERS, (LPTSTR)sizeBuf, NULL); 
    for (int i = 0; i < nPapersCount; i++) 
     std::wcout << sizeBuf[i] << "\n"; 
    delete[] sizeBuf; 
} 
+0

不要忘记释放'hDevMode','hDevNames'和'hDC'处理在'PRINTDLG '结构完成使用后。为此,使用'GlobalFree()'和'DeleteDC()'。但是你确定你需要'PD_RETURNDC'吗?你没有使用'hDC'做任何事情。 –

+0

@RemyLebeau没有分配,所以不需要'GlobalFree'。也没有DC。 'PD_RETURNDC'是不必要的,我删除它。 –

+1

['PRINTDLG'](https://msdn.microsoft.com/en-us/library/windows/desktop/ms646843.aspx)文档明确指出,如果hDevMode和hDevNames为NULL,则分配它们输入。它没有说的是,“PD_RETURNDEFAULT”是否改变了这种行为。它所说的是,它们被设置为处理系统默认打印机。他们是否被分配?或者他们是静态的,由操作系统所拥有?文件没有说这种或那种。但大多数'PD_RETURNDEFAULT'示例我都可以找到调用'GlobalFree()'。 –