怎样获取网络打印机的当前状态?
问题一:如题,我的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