CreateDC因网络打印机失败 - 错误代码1801

时间:2014-03-13 01:50:52

标签: c++ c winapi printing

我目前遇到的问题是HANDLE从网络位置的打印机返回NULL。

//NOTE:szDriver is the driver location
//my device name  = "\\somelocation\HP Color LaserJet CP3505 PCL 6",
HANDLE hDC;
hDC = CreateDC(szDriver,(char*)pDevMode->dmDeviceName,NULL,pDevMode);

hDC将返回NULL,即使我已经仔细检查了我的打印机并进行了测试打印。

我放了一个GetLastError()调用,它返回错误1801,这意味着打印机名称无效。

然后我再看一下pDevMode-> dmDeviceName,看起来像是截断的。它仅显示我实际打印机名称的一部分。

2 个答案:

答案 0 :(得分:5)

后来我找到了DEVMODE的MSDN参考:

http://msdn.microsoft.com/en-us/library/windows/desktop/dd183565(v=vs.85).aspx

它说: “ 的 dmDeviceName 一个以零结尾的字符数组,用于指定打印机或显示器的“友好”名称;例如,在PCL / HP LaserJet的情况下,“PCL / HP LaserJet”。此字符串在设备驱动程序中是唯一的请注意,此名称可能会被截断以适合dmDeviceName数组。“

似乎对35个字符有限制,任何超过它的内容都会被截断。这非常糟糕,因为现在很多网络打印机都有很长的名字。

然后我将LONG名称打印机复制到一个LOCAL VARIABLE(在我将值分配给dmDeviceName之前)并传递它(而不是直接使用dmDeviceName),然后它对我来说很好。

我是这样做的:

//NOTE:szDriver is the driver location
//my device name  = "\\somelocation\HP Color LaserJet CP3505 PCL 6",
HANDLE hDC;

//use local variable
char    szPrinterName [255];
//NOTE:strcpysz is our own function copies a string into its destination with 0 terminator
//You can do it differently
strcpysz (szPrinterName,sizeof(szPrinterName), "\\somelocation\HP Color LaserJet CP3505 PCL 6");

//in this case 
//(char*)pDevMode->dmDeviceName will be "\\somelocation\HP Color Laser" <-TRUNCATED
hDC = CreateDC(szDriver,szPrinterName,NULL,pDevMode);

然后我可以得到我的帮助......

希望这有帮助!

答案 1 :(得分:0)

您需要做一些更精细的事情来获取完整的打印机名称,而不是截断为32个字符:

PG_PRINTDLGW pd;
PrintDlgW(&pd)
LPDEVNAMES dvn;
dvn = (LPDEVNAMES) GlobalLock(pd.hDevNames) ; 
// full name will be at:
(wchar_t *)dvn + dvn->wDeviceOffset;