Option ExplicitPrivate Const CCHDEVICENAME = 32
Private Const CCHFORMNAME = 32Private Type DEVMODE
        dmDeviceName As String * CCHDEVICENAME
        dmSpecVersion As Integer
        dmDriverVersion As Integer
        dmSize As Integer
        dmDriverExtra As Integer
        dmFields As Long
        dmOrientation As Integer
        dmPaperSize As Integer
        dmPaperLength As Integer
        dmPaperWidth As Integer
        dmScale As Integer
        dmCopies As Integer
        dmDefaultSource As Integer
        dmPrintQuality As Integer
        dmColor As Integer
        dmDuplex As Integer
        dmYResolution As Integer
        dmTTOption As Integer
        dmCollate As Integer
        dmFormName As String * CCHFORMNAME
        dmUnusedPadding As Integer
        dmBitsPerPel As Long
        dmPelsWidth As Long
        dmPelsHeight As Long
        dmDisplayFlags As Long
        dmDisplayFrequency As Long
End TypePublic Enum Printer_Status
   PRINTER_STATUS_READY = &H0
   PRINTER_STATUS_PAUSED = &H1
   PRINTER_STATUS_ERROR = &H2
   PRINTER_STATUS_PENDING_DELETION = &H4
   PRINTER_STATUS_PAPER_JAM = &H8
   PRINTER_STATUS_PAPER_OUT = &H10
   PRINTER_STATUS_MANUAL_FEED = &H20
   PRINTER_STATUS_PAPER_PROBLEM = &H40
   PRINTER_STATUS_OFFLINE = &H80
   PRINTER_STATUS_IO_ACTIVE = &H100
   PRINTER_STATUS_BUSY = &H200
   PRINTER_STATUS_PRINTING = &H400
   PRINTER_STATUS_OUTPUT_BIN_FULL = &H800
   PRINTER_STATUS_NOT_AVAILABLE = &H1000
   PRINTER_STATUS_WAITING = &H2000
   PRINTER_STATUS_PROCESSING = &H4000
   PRINTER_STATUS_INITIALIZING = &H8000
   PRINTER_STATUS_WARMING_UP = &H10000
   PRINTER_STATUS_TONER_LOW = &H20000
   PRINTER_STATUS_NO_TONER = &H40000
   PRINTER_STATUS_PAGE_PUNT = &H80000
   PRINTER_STATUS_USER_INTERVENTION = &H100000
   PRINTER_STATUS_OUT_OF_MEMORY = &H200000
   PRINTER_STATUS_DOOR_OPEN = &H400000
   PRINTER_STATUS_SERVER_UNKNOWN = &H800000
   PRINTER_STATUS_POWER_SAVE = &H1000000
End Enum
Private Type PRINTER_DEFAULTS
  pDatatype As String
  pDevMode As DEVMODE
  DesiredAccess As Long
End TypePrivate Declare Function OpenPrinter Lib "winspool.drv" _
    Alias "OpenPrinterA" (ByVal pPrinterName As String, _
    phPrinter As Long, pDefault As PRINTER_DEFAULTS) As LongPrivate Declare Function ClosePrinter Lib "winspool.drv" _
    (ByVal hPrinter As Long) As LongPrivate Sub Command1_Click()    Dim lret As Long
    Dim pDef As PRINTER_DEFAULTS
    Dim mhPrinter As Long
    
    mhPrinter = Printer.hDC
    lret = OpenPrinter(Printer.DeviceName, mhPrinter, pDef)
    
    MsgBox lret
    
    lret = ClosePrinter(mhPrinter)End Sub

解决方案 »

  1.   

    Private Sub Command2_Click()  Dim lret As Long
      Dim SizeNeeded As Long
      Dim mhPrinter As Long
      Dim index As Long  Dim buffer() As Long
      
      Dim mPRINTER_INFO_2 As PRINTER_INFO_2  ReDim Preserve buffer(0 To 1) As Long
      lret = GetPrinterApi(mhPrinter, index, buffer(0), UBound(buffer), SizeNeeded)
      ReDim Preserve buffer(0 To (SizeNeeded / 4) + 3) As Long
      lret = GetPrinterApi(mhPrinter, index, buffer(0), UBound(buffer) * 4, SizeNeeded)    With mPRINTER_INFO_2 '\\ This variable is of type PRINTER_INFO_2
           .pServerName = StringFromPointer(buffer(0), 1024)
           .pPrinterName = StringFromPointer(buffer(1), 1024)
           .pShareName = StringFromPointer(buffer(2), 1024)
           .pPortName = StringFromPointer(buffer(3), 1024)
           .pDriverName = StringFromPointer(buffer(4), 1024)
           .pComment = StringFromPointer(buffer(5), 1024)
           .pLocation = StringFromPointer(buffer(6), 1024)
           .pDevMode = buffer(7)
           .pSepFile = StringFromPointer(buffer(8), 1024)
           .pPrintProcessor = StringFromPointer(buffer(9), 1024)
           .pDatatype = StringFromPointer(buffer(10), 1024)
           .pParameters = StringFromPointer(buffer(11), 1024)
           .pSecurityDescriptor = buffer(12)
           .Attributes = buffer(13)
           .Priority = buffer(14)
           .DefaultPriority = buffer(15)
           .StartTime = buffer(16)
           .UntilTime = buffer(17)
           .Status = buffer(18)
           .JobsCount = buffer(19)
           .AveragePPM = buffer(20)
        End With
    End Sub
    Public Function StringFromPointer(lpString As Long, lMaxLength As Long) As String
      Dim sRet As String
      Dim lret As Long  If lpString = 0 Then
        StringFromPointer = ""
        Exit Function
      End If  If IsBadStringPtrByLong(lpString, lMaxLength) Then
        '\\ An error has occured - do not attempt to use this pointer
          StringFromPointer = ""
        Exit Function
      End If  '\\ Pre-initialise the return string...
      sRet = Space$(lMaxLength)
      CopyMemory ByVal sRet, ByVal lpString, ByVal Len(sRet)
      If Err.LastDllError = 0 Then
        If InStr(sRet, Chr$(0)) > 0 Then
          sRet = Left$(sRet, InStr(sRet, Chr$(0)) - 1)
        End If
      End If  StringFromPointer = sRetEnd Function
      

  2.   

    具体例子,请参考:http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=30390&lngWId=1