我在OpenPrinter函数中使用该函数的第一个参数叫做“pPrinterName” 这就是它的MSDN描述:
[in]指向以null结尾的字符串的指针,该字符串指定打印机或打印服务器,打印机对象,XcvMonitor或XcvPort的名称。 对于打印机对象,请使用:PrinterName,Job xxxx。对于XcvMonitor,请使用:ServerName,XcvMonitor MonitorName。 对于XcvPort,请使用:ServerName,XcvPort PortName 。
显然我对大胆的部分感兴趣。什么是XcvPort?我知道这似乎是一个懒人的问题,但我真的找不到这个概念的信息。如果我想在ABC端口打开打印机,我应该写: “ \\ MySrever,XcvPort ABC ”?
答案 0 :(得分:2)
非常接近,只需添加一个反斜杠:
[DllImport("winspool.drv", EntryPoint = "OpenPrinter", SetLastError = true)]
internal static extern bool OpenPrinter(string pPrinterName, ref IntPtr phPrinter, PRINTER_DEFAULTS pDefault);
[DllImport("winspool.drv", EntryPoint = "ClosePrinter", SetLastError = true)]
internal static extern int ClosePrinter(IntPtr hPrinter);
public struct OpenPrinterAccessCodes
{
public const int DELETE = 0x10000; // DELETE - Allowed to delete printers
public const int READ_CONTROL = 0x20000; // READ_CONTROL - Allowed to read printer information
public const int WRITE_DAC = 0x40000; // WRITE_DAC - Allowed to write device access control info
public const int WRITE_OWNER = 0x80000; // WRITE_OWNER - Allowed to change the object owner
public const int SERVER_ACCESS_ADMINISTER = 0x1;
public const int SERVER_ACCESS_ENUMERATE = 0x2;
public const int PRINTER_ACCESS_ADMINISTER = 0x4;
public const int PRINTER_ACCESS_USE = 0x8;
public const int STANDARD_RIGHTS_REQUIRED = 0xF0000;
public const int PRINTER_ALL_ACCESS = (STANDARD_RIGHTS_REQUIRED | PRINTER_ACCESS_ADMINISTER | PRINTER_ACCESS_USE);
public const int SERVER_ALL_ACCESS = (STANDARD_RIGHTS_REQUIRED | SERVER_ACCESS_ADMINISTER | SERVER_ACCESS_ENUMERATE);
public const int MAX_PORTNAME_LEN = 64;
public const int MAX_NETWORKNAME_LEN = 49;
public const int MAX_SNMP_COMMUNITY_STR_LEN = 33;
public const int MAX_QUEUENAME_LEN = 33;
public const int MAX_IPADDR_STR_LEN = 16;
public const int ERROR_INSUFFICIENT_BUFFER = 122;
public const int ERROR_INVALID_FLAGS = 1004;
}
var def = new PRINTER_DEFAULTS { pDatatype = null, pDevMode = IntPtr.Zero, DesiredAccess = OpenPrinterAccessCodes.SERVER_ACCESS_ADMINISTER };
var hPrinter = IntPtr.Zero;
OpenPrinter(@"\\MyServer\,XcvPort ABC", ref hPrinter, def)
ClosePrinter(hPrinter);