我目前遇到的问题是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,看起来像是截断的。它仅显示我实际打印机名称的一部分。
答案 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;