使用ReadPrinter Winspool.Drv

时间:2018-08-06 07:41:16

标签: c# windows printing zpl

我有通过USB连接的Zebra打印机,并且正在尝试使用命令^XA^HWR:^XZ读取打印机的内存。该命令适用于TCP / IP。

我什至不确定我是否正确设置了方法标题。

[DllImport("winspool.Drv", EntryPoint = "ReadPrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
static extern bool ReadPrinter(IntPtr hPrinter, IntPtr pBuf, int cbBuf, out int pNoBytesRead);

方法ReadPrinter始终返回false和0个读取字节。当我尝试获取LastWin32Error时,会得到各种0、6或63(ERROR_SUCCESS-尽管它返回false并且没有数据,ERROR_INVALID_HANDLE或{{1} }),具体取决于我要尝试的内容。我尝试了几种方法标头和不同的方法,但是没有一个方法导致成功读取数据。我启用了“双向支持”并安装了打印机驱动程序。它可能看起来像是其他线程的副本,但是我已经理解了它们,但它们都没有帮助。

代码段:

ERROR_PRINT_CANCELLED

1 个答案:

答案 0 :(得分:0)

我通过使用FileStreamsStreamReaders的Visual Basic示例解决了该问题。感谢@kunif指出了示例代码。

kernel32.dll代替了winspool.Drv

[DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)]
private static extern SafeFileHandle CreateFile(string lpFileName, EFileAccess dwDesiredAccess, 
                                                EFileShare dwShareMode, IntPtr lpSecurityAttributes, 
                                                ECreationDisposition dwCreationDisposition, 
                                                EFileAttributes dwFlagsAndAttributes, 
                                                IntPtr hTemplateFile);

private static string ReadUsbPort(StreamReader sr)
{
    string readResult = string.Empty;
    if (sr != null && sr.BaseStream != null)
    {
       do
       {
            readResult += sr.ReadLine();
            readResult += "\r";
        }
        while (sr.EndOfStream == false);
     }
   return readResult;
}

非常有用的是 GUID_DEVINTERFACE_USB_DEVICEWinUSBNet