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

maomaoma 2005-04-08 05:00:33
问题一:如题,我的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
...全文
555 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
maomaoma 2005-04-11
  • 打赏
  • 举报
回复
周末过去了,顶一下,希望找到答案:)
maomaoma 2005-04-09
  • 打赏
  • 举报
回复
to junki(『打破沙锅问到底』):
如果openPrinter调用成功,就可以返回打印机句柄啊。
maomaoma 2005-04-09
  • 打赏
  • 举报
回复
daisy8675(莫依) :
这个我看过了,重新试了下,下面几个打印机权限

Private Const STANDARD_RIGHTS_REQUIRED = &HF0000 '标准访问需要
Private Const PRINTER_ACCESS_ADMINISTER = &H4 '管理员级访问权限
Private Const PRINTER_ACCESS_USE = &H8 '普通用户级访问权限
Private Const PRINTER_ALL_ACCESS = (STANDARD_RIGHTS_REQUIRED Or PRINTER_ACCESS_ADMINISTER Or PRINTER_ACCESS_USE) '所有访问权限

只有在设访问权限为 PRINTER_ACCESS_USE 时 openprinter返回为1,其余都为0,Err.LastDllError= 5 。为什么?难道和硬件设置有关?
只设为普通用户权限,权限购吗?

照着那篇文档搞了一个,打印机的状态总是 ready 无论是打印机正在打印,还是缺纸等特殊情况,怎么回事?
daisy8675 2005-04-08
  • 打赏
  • 举报
回复
现在没办法测试你的代码,所以请参考这个KB

http://support.microsoft.com/default.aspx?scid=kb;EN-US;q202480
chendjin 2005-04-08
  • 打赏
  • 举报
回复
mark+ding
maomaoma 2005-04-08
  • 打赏
  • 举报
回复
补充一点,当pDefaults.DesiredAccess不给它赋权限,时openprinter返回值为1
junki 2005-04-08
  • 打赏
  • 举报
回复
hPrinter与ll_Handle是怎么获得的?
maomaoma 2005-04-08
  • 打赏
  • 举报
回复
拜托各位啦,这个东西我已经搞了好久了,一直没有找到原因,再弄不出来,不知道如何交差啊:(

1,488

社区成员

发帖
与我相关
我的任务
社区描述
VB API
社区管理员
  • API
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧