列出伺服器上的印表機

來源:互聯網
上載者:User
列印|伺服器 組件邏輯

這個組件以“硬方式”編寫以便說明如何在VB中調用Wivdons API, 如果你使用VB5中的printer 類也可以實現相同的功能。

這個組件調用了由Windows2000使用的EnumPrinters函數。這個函數以五種格式之一返回一個印表機列表,格式是由你確定的“等級”而定。在這個例子裡,我們使用第四級,它只是列舉了我們NT伺服器所串連的印表機名字和位置(直接連接或網路連接)。

 

注意

在這裡顯示的組件代碼只適用於Windows NT,如果你在Windows95上運行Personal Web Server的話,使用第五級。Windows 95將網路印表機當作本機印表機處理。

第五級的列印結構同第四級的有略微的不同之處,使用VB5 API瀏覽器將PRINTER_INFO_5結構體複製到你的代碼中。

 

這是一個功能強大的API調用,可帶許多不同的參數。Visual C的協助檔案提供如何使用EnumPrinters函數的細節,但將C形式的文法翻譯成VB語句可能具有挑戰勝。你可以從www.microsoft.com網點中下載Microsoft Knowledge Base article Q166008來獲得如何翻譯的額外細節資訊。

我們將返回資訊存在一個長整數組中因為它比其它更低級的儲存結構更便於操作和索引。通過PtrToStr和StrLen調用,我們能夠將長整數數群組轉換成字串,這種結果在VB中最容易使用。

當確定了有多少印表機與系統相連,我們redim(重定義)兩個數組(m_aDeviceName和m_ServerName)來儲存所發現印表機數目。如果沒有發現印表機,這些代碼將不會執行,因為錯誤處理代碼將接管程式的執行。

 

編寫原始碼

再一次啟動一個新的VB6 ActiveX DLL項目,VB顯示了一個預設的代碼視窗名叫Class1,按F4,按以下修改屬性工作表:

(Name)WebPrinters

Instancing 5 - MultiUse

選擇Projects |Project 1 Properties將項目名改為Web Utils,並選擇Unattended Execution。選項最後最後單擊對話方塊的Make表欄並選擇Auto Increment,按OK鍵儲存設定。

下面程式碼封裝含了印表機組件的原始碼,這個組件只是列舉了你系統上的印表機——你可以擴充其代碼事完成實際的列印任務。不象先前的VB組件,這個例子使用VB的Get 和Let屬性。對這些屬性的討論超過了本例的範圍,但Microsoft’s Visual Books Online(與VB5捆綁在一起)包含了這兩個屬性的深層次解釋。

Option Explicit

Private Declare Function EnumPrinters Lib "winspool.drv" _
                Alias "EnumPrintersA" _
                (ByVal flags As Long, ByVal name As String, _
                ByVal Level As Long, pPrinterEnum As Long, _
                ByVal cdBuf As Long, pcbNeeded As Long, pcReturned As Long) _
                As Long

Private Declare Function PtrToStr Lib "Kernel32" Alias "lstrcpyA" _
                (ByVal RetVal As String, ByVal Ptr As Long) As Long

Private Declare Function StrLen Lib "Kernel32" Alias "lstrlenA" _
                (ByVal Ptr As Long) As Long

Private Type PRINTER_INFO_4
     pPrinterName As String
     pServerName As String
     Attributes As Long
End Type

Private Const PRINTER_ENUM_LOCAL = &H2
Private Const PRINTER_ENUM_CONNECTIONS = &H4
Private Const PRINTER_ENUM_NAME = &H8
Private Const PRINTER_ENUM_NETWORK = &H40
Private Const PRINTER_ENUM_REMOTE = &H10
Private Const PRINTER_ENUM_SHARED = &H20

Private m_iPrinterCount As Integer
Private m_aDeviceName() As String
Private m_aServer() As String

Private Property Let PrinterCount(iValue As Integer)
     m_iPrinterCount = iValue
End Property

Public Property Get PrinterCount() As Integer
    PrinterCount = m_iPrinterCount
End Property

Private Property Let DeviceName(iIndex As Integer, sValue As String)
    m_aDeviceName(iIndex) = sValue
End Property

Public Property Get DeviceName(iIndex As Integer) As String
    DeviceName = m_aDeviceName(iIndex)
End Property

Private Property Let Server(iIndex As Integer, sValue As String)
    m_aServer(iIndex) = sValue
End Property

Public Property Get Server(iIndex As Integer) As String
    Server = m_aServer(iIndex)
End Property

Private Sub Class_Initialize()
  Dim bReturn As Boolean
  Dim lFlags As Long
  Dim sName As String
  Dim lLevel As Long
  Dim lBuffer() As Long
  Dim lCdBuf As Long
  Dim lPcbNeeded As Long
  Dim lEntries As Long
  Dim i As Integer
  Dim lTemp As Long
  Dim sTempString As String

  lFlags = PRINTER_ENUM_CONNECTIONS Or PRINTER_ENUM_LOCAL
  sName = vbNullString
  lLevel = 4
  lCdBuf = 3072
  ReDim lBuffe



相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。