VB6-远程桌面会话中的打印机集合
有人知道包含VB6中打印机对象读取的所有打印机信息的文件在哪里吗 我们通常编写如下代码:VB6-远程桌面会话中的打印机集合,vb6,Vb6,有人知道包含VB6中打印机对象读取的所有打印机信息的文件在哪里吗 我们通常编写如下代码: For x in **Printers** ... ... ... Next 通常,我会将列表放入一个组合框中,以便用户可以选择打印机 当在服务器上使用上面的编码运行应用程序以便通过远程桌面会话打印时,我可以看到其他打印机也出现在列表上。我只想在会话中看到我自己的打印机,而不是其他打印机 在我看来,如果我能找到文件的位置,我想我可以做点什么 如有任何其他建议,我们将不胜感激!:) 谢谢 我正在使用枚举
For x in **Printers**
... ... ...
Next
通常,我会将列表放入一个组合框中,以便用户可以选择打印机
当在服务器上使用上面的编码运行应用程序以便通过远程桌面会话打印时,我可以看到其他打印机也出现在列表上。我只想在会话中看到我自己的打印机,而不是其他打印机
在我看来,如果我能找到文件的位置,我想我可以做点什么
如有任何其他建议,我们将不胜感激!:)
谢谢 我正在使用枚举组合框中的explorer Printers文件夹,并显示它们的图标。也可以在RDS下工作。我正在使用以下代码(它现在有点旧,所以可能会做得更好) 宣布:
Public Declare Function EnumPrinters Lib "winspool.drv" Alias "EnumPrintersA" (ByVal Flags As Long, ByVal Name As String, ByVal Level As Long, ByRef pPrinterEnum As Byte, ByVal cdBuf As Long, ByRef pcbNeeded As Long, ByRef pcReturned As Long) As Long
Public Declare Function lstrcpy Lib "kernel32.dll" Alias "lstrcpyA" (ByVal lpString1 As String, ByVal lpString2 As Long) As Long
Public Declare Sub MoveMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
'--------------------------------------------------------------
'EnumPrinters Flags
Public Const PRINTER_ENUM_CONNECTIONS As Long = &H4
Public Const PRINTER_ENUM_CONTAINER As Long = &H8000
Public Const PRINTER_ENUM_DEFAULT As Long = &H1
Public Const PRINTER_ENUM_EXPAND As Long = &H4000
Public Const PRINTER_ENUM_FAVORITE As Long = &H4
Public Const PRINTER_ENUM_HIDE As Long = &H1000000
Public Const PRINTER_ENUM_ICON1 As Long = &H10000
Public Const PRINTER_ENUM_ICON2 As Long = &H20000
Public Const PRINTER_ENUM_ICON3 As Long = &H40000
Public Const PRINTER_ENUM_ICON4 As Long = &H80000
Public Const PRINTER_ENUM_ICON5 As Long = &H100000
Public Const PRINTER_ENUM_ICON7 As Long = &H400000
Public Const PRINTER_ENUM_ICON6 As Long = &H200000
Public Const PRINTER_ENUM_ICON8 As Long = &H800000
Public Const PRINTER_ENUM_ICONMASK As Long = &HFF0000
Public Const PRINTER_ENUM_LOCAL As Long = &H2
Public Const PRINTER_ENUM_NAME As Long = &H8
Public Const PRINTER_ENUM_NETWORK As Long = &H40
Public Const PRINTER_ENUM_REMOTE As Long = &H10
Public Const PRINTER_ENUM_SHARED As Long = &H20
Public Type PRINTER_INFO_1 'REAL API STRUCTURE FOR USE WITH EnumPrinters
Flags As Long
pDescription As Long
pName As Long
pComment As Long
End Type
Public Type PRINTER_INFO_1_VB
Flags As Long
pDescription As String
pName As String
pComment As String
End Type
Private Enum NEPrinterEnumLevel1
pel1Local = PRINTER_ENUM_LOCAL
pel1Name = PRINTER_ENUM_NAME
pel1Default = PRINTER_ENUM_DEFAULT
pel1Connections = PRINTER_ENUM_CONNECTIONS
pel1Network = PRINTER_ENUM_NETWORK
pel1Remote = PRINTER_ENUM_REMOTE
End Enum
要填充组合框,请执行以下操作:
'##############################################################################
'##
'## Sub pFillcboPrinters
'##
'##############################################################################
Private Sub pFillcboPrinters()
Dim atPIs() As PRINTER_INFO_1_VB
Dim lCount As Long
Dim lIndex As Long
'--------------------------------------------------------------
'Clear List
Call cboPrinters.Clear
'--------------------------------------------------------------
'Get printers using the WinAPI
lCount = fnEnumPrinters_PI1(atPIs(), pel1Local + pel1Connections)
For lIndex = 1 To lCount
Call cboPrinters.AddItem(atPIs(lIndex).pName)
Next lIndex
'--------------------------------------------------------------
'No printers available?
If cboPrinters.ListCount = 0 Then Call cboPrinters.AddItem("[No printers available]")
End Sub
实际枚举打印机的例程:
'##############################################################################
'##
'## Function fnEnumPrinters_PI1
'##
'##############################################################################
'!! WARNING: sName = vbNullString IS IMPORTANT, BECAUSE sName = "" GIVES ANOTHER RESULT
Private Function fnEnumPrinters_PI1(ByRef atPIs() As PRINTER_INFO_1_VB, _
ByVal eEnum As NEPrinterEnumLevel1, _
Optional ByVal bShared As Boolean = False, _
Optional ByVal sName As String = vbNullString) As Long
Dim abBuffer() As Byte
Dim lBufferSize As Long
Dim lFlags As Long
Dim lIndex As Long
Dim lLenPI1 As Long
Dim lNeeded As Long
Dim lResult As Long
Dim lReturn As Long
Dim tPI1 As PRINTER_INFO_1
'--------------------------------------------------------------
'Default no printers available
lResult = 0
ReDim atPIs(0)
'--------------------------------------------------------------
'Set the flags for EnumPrinters
lFlags = eEnum
If bShared Then lFlags = lFlags Or PRINTER_ENUM_SHARED
'--------------------------------------------------------------
'Start with a big buffer
lBufferSize = 32767
lNeeded = 0
ReDim abBuffer(lBufferSize)
lReturn = EnumPrinters(lFlags, sName, 1, abBuffer(0), lBufferSize, lNeeded, lResult)
'--------------------------------------------------------------
'Need a bigger buffer? try again with bigger buffer
If (lReturn = 0) And (lNeeded > 0) Then
ReDim abBuffer(lBufferSize)
lReturn = EnumPrinters(lFlags, sName, 1, abBuffer(0), lBufferSize, lNeeded, lResult)
End If 'If (lReturn=0) And (lNeeded>0)
'--------------------------------------------------------------
'Everything OK? and printers to retrieve?
If (lReturn <> 0) And (lResult > 0) Then
'--------------------------------------------------------------
'Create enough entries for the Printerinfo's
ReDim atPIs(lResult)
lLenPI1 = Len(tPI1)
'--------------------------------------------------------------
'Buffer constist of first all PRINTER_INFO_1 and after that extra info,
'but the PRINTER_INFO_1 contains the important information which get's
'the other information, but we only use the PRINTER_INFO_1 info of the buffer
For lIndex = 1 To lResult
'--------------------------------------------------------------
'Copy the info to the real API PRINTER_INFO_1
Call MoveMemory(tPI1, abBuffer((lIndex - 1) * lLenPI1), lLenPI1)
'--------------------------------------------------------------
'Copy the information to the VB version
With atPIs(lIndex)
'--------------------------------------------------------------
'Copy the flags
.Flags = tPI1.Flags
'--------------------------------------------------------------
'Copy the Description
.pDescription = Space$(lstrlen(tPI1.pDescription))
Call lstrcpy(.pDescription, tPI1.pDescription)
'--------------------------------------------------------------
'Copy the name
.pName = Space$(lstrlen(tPI1.pName))
Call lstrcpy(.pName, tPI1.pName)
'--------------------------------------------------------------
'Copy the Comment
.pComment = Space$(lstrlen(tPI1.pComment))
Call lstrcpy(.pDescription, tPI1.pComment)
End With 'With atPIs(lIndex)
Next lIndex
End If 'If (lReturn<>0) And (lResult>0)
'--------------------------------------------------------------
'Return the ammount of printers
fnEnumPrinters_PI1 = lResult
End Function
'##############################################################################
'##
“##函数FNENUMU PI1”
'##
'##############################################################################
'!! 警告:sName=vbNullString很重要,因为sName=“”会给出另一个结果
私有函数fneumprinters_PI1(ByRef atPIs()作为PRINTER_INFO_1_VB_
ByVal eEnum作为尼泊尔人级别1_
可选的ByVal b共享为布尔值=False_
可选的ByVal sName As String=vbNullString)尽可能长
Dim abBuffer()作为字节
尺寸和长度一样大
时间和时间一样长
暗淡的菩提树和长的一样
将lLenPI1变长
需要的时间一样长
暗淡的结果就像长的一样
变暗,变长
将tPI1调暗为打印机信息
'--------------------------------------------------------------
'默认没有可用的打印机
lResult=0
ReDim atPIs(0)
'--------------------------------------------------------------
'设置枚举打印机的标志
lFlags=eEnum
如果是共享的,则lFlags=lFlags或打印机\u枚举\u共享
'--------------------------------------------------------------
“从一个大的缓冲区开始
lBufferSize=32767
需要=0
ReDim abBuffer(lBufferSize)
lReturn=EnumPrinters(lFlags、sName、1、abBuffer(0)、lBufferSize、lneed、lResult)
'--------------------------------------------------------------
“需要更大的缓冲吗?请使用更大的缓冲区重试
如果(lReturn=0)和(lNeed>0),则
ReDim abBuffer(lBufferSize)
lReturn=EnumPrinters(lFlags、sName、1、abBuffer(0)、lBufferSize、lneed、lResult)
如果(lReturn=0)和(lNeed>0),则结束
'--------------------------------------------------------------
“一切都好吗?还有要检索的打印机?
如果(lReturn 0)和(lResult>0),则
'--------------------------------------------------------------
'为Printerinfo创建足够的条目'
ReDim atPIs(lResult)
lLenPI1=Len(tPI1)
'--------------------------------------------------------------
'缓冲区首先包含所有打印机信息1,然后是额外信息,
'但是打印机\u INFO\u 1包含获取的重要信息
'其他信息,但我们只使用缓冲区的打印机信息
对于lIndex=1至lResult
'--------------------------------------------------------------
'将信息复制到真正的API打印机\u info\u 1
调用MoveMemory(tPI1,abBuffer((lIndex-1)*lLenPI1,lLenPI1)
'--------------------------------------------------------------
'将信息复制到VB版本
与atPIs(lIndex)合作
'--------------------------------------------------------------
"复制旗帜"
.Flags=tPI1.Flags
'--------------------------------------------------------------
“复制描述
.pddescription=Space$(lstrlen(tPI1.pddescription))
调用lstrcpy(.pddescription,tPI1.pddescription)
'--------------------------------------------------------------
'复制名称
.pName=Space$(lstrlen(tPI1.pName))
调用lstrcpy(.pName,tPI1.pName)
'--------------------------------------------------------------
复制评论
.pComment=Space$(lstrlen(tPI1.pComment))
调用lstrcpy(.pddescription,tPI1.pComment)
以“与atPIs(lIndex)”结尾
下一个林黛克斯
如果(lReturn0)和(lResult>0),则结束
'--------------------------------------------------------------
'返回打印机的数量
fneumu PI1=lResult
端函数
它不是文件,而是已配置设备的枚举。如果要排除特定打印机,可以尝试根据端口检测它们。可以说,这是错误的,因为所有配置的打印机都是“我的打印机”。