怎样获取网络打印机的当前状态?
问题一:如题,我的vb代码如下,在OpenPrinter处,返回的结果总是0,但同样的方法用pb返回的却是1,这是怎么回事?
问题二:在OpenPrinter调用成功、已经将打印机访问权限设为最高权限的情况下,为什么我获取的打印状态总是0 ——就绪?
附vb代码:
Public Function PrinterStatus() As String
Dim PrinterName As String '打印机名
Dim result As Long
Dim hPrinter As Long '打印机句柄
Dim ByteBuf As Long '
Dim BytesNeeded As Long '所需的缓冲区大小
Dim PrinterInfo() As Byte '打印机信息存放缓冲区
Dim pDefaults As PRINTER_DEFAULTS '定义打印机访问权限结构
Dim PI2 As PRINTER_INFO_2 '打印机状态信息结构
Dim PrinterStr As String
'********************
'**打开默认打印机
'********************
PrinterName = DefaultPrinterName()
'PrinterName = Printer.DeviceName '获取默认打印机specifies the default data type, environment, initialization data, and access rights for a printer
pDefaults.DesiredAccess = PRINTER_ALL_ACCESS '设置打印机访问权限为完全控制
'pDefaults.pDatatype = vbNullString
result = OpenPrinter(PrinterName, hPrinter, pDefaults) '打开成功返回非零值,失败返回零 ,hPrinter 为输入出参数,返回打印机句柄
If result = 0 Then
PrinterStatus = "打印机状态:" & Err.LastDllError
'PrinterStatus = "打印机状态:不能访问打印机"
Exit Function
End If
'*********************
'**获取打印机的状态
'*********************
'确定获取打印机信息缓冲区的大小.
BytesNeeded = 0
result = GetPrinter(hPrinter, 2, 0&, 0&, BytesNeeded) '获得指定打印机的属性 BytesNeeded 为输出参数,返回缓冲区大小
'调用GetPrinter获取打印机的状态.
ReDim PrinterInfo(1 To BytesNeeded)
ByteBuf = BytesNeeded
result = GetPrinter(hPrinter, 2, PrinterInfo(1), ByteBuf, BytesNeeded)
If result = 0 Then
PrinterStatus = "打印机状态:" & Err.LastDllError
result = ClosePrinter(hPrinter) '关闭打印机句柄
Exit Function
End If
CopyMemory PI2, PrinterInfo(1), Len(PI2) '提取结构 PRINTER_INFO_2 的内容赋值给Pi2
PrinterStr = CheckPrinterStatus(PI2.Status) '判断打印机的状态
result = ClosePrinter(hPrinter) '关闭打印机句柄
PrinterStatus = "打印机状态:" & PrinterStr '返回打印机状态
End Function
pb代码:
//window 2000 或windows xp代码
String ls_DefaultPrinterName,ls_DriverName,ls_PortName,ls_Comment
Long ll_PrinterNameSize
Long ll_Handle,ll_cbBuf,ll_cbNeed
Blob lbl_Buffer
long ll_result
boolean bln_Result
long ll_status
String ls_ErrorInfo
Long ll_ErrorCode
PRINTER_DEFAULTS lstr_PrinterDefaul
PRINTER_INFO_2 lstr_PrinterInfo
PRINTER_DEFAULTS pDefaults
SetNull(ls_DefaultPrinterName)
//第一次调用函数取得所需字符缓冲区的长度
GetDefaultPrinter(ls_DefaultPrinterName,ll_PrinterNameSize)
ls_DefaultPrinterName = Space(ll_PrinterNameSize)
//第二次调用函数可获得默认打印机名
GetDefaultPrinter(ls_DefaultPrinterName,ll_PrinterNameSize)
//根据获取默认打印机名打开打印机,调用GetPrinter()函数获取打印机信息
pDefaults.DesiredAccess = PRINTER_ALL_ACCESS
ll_result = OpenPrinter(ls_DefaultPrinterName,ll_Handle,lstr_PrinterDefaul)
If ll_result = 0 Then
ls_ErrorInfo = space(256)
ll_ErrorCode = GetLastError()
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER,0,ll_ErrorCode,0,ls_ErrorInfo,256,0)
Messagebox("api调用错误","错误代码:" + string(ll_ErrorCode) + "~R~n" + "错误信息:" + Trim(ls_ErrorInfo))
Return -1 //打印机打开失败
End If
l_SetBuffer:
lbl_Buffer = Blob(Space (ll_cbBuf))
If NOT GetPrinter(ll_Handle,2,lbl_Buffer,ll_cbBuf,ll_cbNeed) Then
If ll_cbNeed > ll_cbBuf Then
ll_cbBuf = ll_cbNeed
goto l_SetBuffer
Else
ClosePrinter(ll_Handle)
Return -1
End If
End If
//将内存缓冲区内容复制到打印机结构2中
CopyMemory(lstr_PrinterInfo,lbl_Buffer,PRINTER_INFO_2_LEN)
ll_status = lstr_PrinterInfo.status
ClosePrinter(ll_Handle)
return ll_status
问题二:在OpenPrinter调用成功、已经将打印机访问权限设为最高权限的情况下,为什么我获取的打印状态总是0 ——就绪?
附vb代码:
Public Function PrinterStatus() As String
Dim PrinterName As String '打印机名
Dim result As Long
Dim hPrinter As Long '打印机句柄
Dim ByteBuf As Long '
Dim BytesNeeded As Long '所需的缓冲区大小
Dim PrinterInfo() As Byte '打印机信息存放缓冲区
Dim pDefaults As PRINTER_DEFAULTS '定义打印机访问权限结构
Dim PI2 As PRINTER_INFO_2 '打印机状态信息结构
Dim PrinterStr As String
'********************
'**打开默认打印机
'********************
PrinterName = DefaultPrinterName()
'PrinterName = Printer.DeviceName '获取默认打印机specifies the default data type, environment, initialization data, and access rights for a printer
pDefaults.DesiredAccess = PRINTER_ALL_ACCESS '设置打印机访问权限为完全控制
'pDefaults.pDatatype = vbNullString
result = OpenPrinter(PrinterName, hPrinter, pDefaults) '打开成功返回非零值,失败返回零 ,hPrinter 为输入出参数,返回打印机句柄
If result = 0 Then
PrinterStatus = "打印机状态:" & Err.LastDllError
'PrinterStatus = "打印机状态:不能访问打印机"
Exit Function
End If
'*********************
'**获取打印机的状态
'*********************
'确定获取打印机信息缓冲区的大小.
BytesNeeded = 0
result = GetPrinter(hPrinter, 2, 0&, 0&, BytesNeeded) '获得指定打印机的属性 BytesNeeded 为输出参数,返回缓冲区大小
'调用GetPrinter获取打印机的状态.
ReDim PrinterInfo(1 To BytesNeeded)
ByteBuf = BytesNeeded
result = GetPrinter(hPrinter, 2, PrinterInfo(1), ByteBuf, BytesNeeded)
If result = 0 Then
PrinterStatus = "打印机状态:" & Err.LastDllError
result = ClosePrinter(hPrinter) '关闭打印机句柄
Exit Function
End If
CopyMemory PI2, PrinterInfo(1), Len(PI2) '提取结构 PRINTER_INFO_2 的内容赋值给Pi2
PrinterStr = CheckPrinterStatus(PI2.Status) '判断打印机的状态
result = ClosePrinter(hPrinter) '关闭打印机句柄
PrinterStatus = "打印机状态:" & PrinterStr '返回打印机状态
End Function
pb代码:
//window 2000 或windows xp代码
String ls_DefaultPrinterName,ls_DriverName,ls_PortName,ls_Comment
Long ll_PrinterNameSize
Long ll_Handle,ll_cbBuf,ll_cbNeed
Blob lbl_Buffer
long ll_result
boolean bln_Result
long ll_status
String ls_ErrorInfo
Long ll_ErrorCode
PRINTER_DEFAULTS lstr_PrinterDefaul
PRINTER_INFO_2 lstr_PrinterInfo
PRINTER_DEFAULTS pDefaults
SetNull(ls_DefaultPrinterName)
//第一次调用函数取得所需字符缓冲区的长度
GetDefaultPrinter(ls_DefaultPrinterName,ll_PrinterNameSize)
ls_DefaultPrinterName = Space(ll_PrinterNameSize)
//第二次调用函数可获得默认打印机名
GetDefaultPrinter(ls_DefaultPrinterName,ll_PrinterNameSize)
//根据获取默认打印机名打开打印机,调用GetPrinter()函数获取打印机信息
pDefaults.DesiredAccess = PRINTER_ALL_ACCESS
ll_result = OpenPrinter(ls_DefaultPrinterName,ll_Handle,lstr_PrinterDefaul)
If ll_result = 0 Then
ls_ErrorInfo = space(256)
ll_ErrorCode = GetLastError()
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER,0,ll_ErrorCode,0,ls_ErrorInfo,256,0)
Messagebox("api调用错误","错误代码:" + string(ll_ErrorCode) + "~R~n" + "错误信息:" + Trim(ls_ErrorInfo))
Return -1 //打印机打开失败
End If
l_SetBuffer:
lbl_Buffer = Blob(Space (ll_cbBuf))
If NOT GetPrinter(ll_Handle,2,lbl_Buffer,ll_cbBuf,ll_cbNeed) Then
If ll_cbNeed > ll_cbBuf Then
ll_cbBuf = ll_cbNeed
goto l_SetBuffer
Else
ClosePrinter(ll_Handle)
Return -1
End If
End If
//将内存缓冲区内容复制到打印机结构2中
CopyMemory(lstr_PrinterInfo,lbl_Buffer,PRINTER_INFO_2_LEN)
ll_status = lstr_PrinterInfo.status
ClosePrinter(ll_Handle)
return ll_status
...全文
相关推荐
C# 获取打印机当前状态的方法
C# 获取打印机当前状态的方法,需要的朋友可以参考一下
用IP地址添加网络打印机
如何添加网络中打印机 通过IP查找网络中打印机 并添加
JAVA通过网络调用网络打印机的工具类
公司需要一个用户下单后自动打印订单金额发票和快递单号的功能,所以特地写的工具类。 具体作用是:java通过网络,调用网络打印机,打印自定义内容,比如快递单号、发票等等,文档中附带了部分快递公司的快递单模版。
C#调用win32 获取打印机状态
获取打印机状态,完整代码,实测可运行(需要在打印机异常时再次下发打印任务后才可获取到打印机状态,因为此代码获取驱动信息,需打印机终端返回错误码驱动程序才能获取状态)
网络打印机一键安装脚本
此工具解决手动安装打印机的繁琐,一键全自动安装,方便省事儿!


API
