VB6-远程桌面会话中的打印机集合

VB6-远程桌面会话中的打印机集合,vb6,Vb6,有人知道包含VB6中打印机对象读取的所有打印机信息的文件在哪里吗 我们通常编写如下代码: For x in **Printers** ... ... ... Next 通常,我会将列表放入一个组合框中,以便用户可以选择打印机 当在服务器上使用上面的编码运行应用程序以便通过远程桌面会话打印时,我可以看到其他打印机也出现在列表上。我只想在会话中看到我自己的打印机,而不是其他打印机 在我看来,如果我能找到文件的位置,我想我可以做点什么 如有任何其他建议,我们将不胜感激!:) 谢谢 我正在使用枚举

有人知道包含VB6中打印机对象读取的所有打印机信息的文件在哪里吗

我们通常编写如下代码:

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
端函数

它不是文件,而是已配置设备的枚举。如果要排除特定打印机,可以尝试根据端口检测它们。可以说,这是错误的,因为所有配置的打印机都是“我的打印机”。