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

Vin*_*n.X 2 c c++ printing winapi

我目前面临的问题是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);
Run Code Online (Sandbox Code Playgroud)

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

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

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

Vin*_*n.X 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);
Run Code Online (Sandbox Code Playgroud)

然后我可以得到我的处理....

希望这可以帮助!