怎样获取网络打印机的当前状态?

maomaoma maomaoma 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
问题一:如题,我的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
...全文

相关推荐

评论 8
收藏 已收藏
分享
返回顶部
maomaoma
API 1,488 成员 23,270 内容