Hello all,
I am trying to use Win32OLE to control a windows printer driver that
will be used to capture the printer output from applications to create
TIFF files. Below is my long winded explanation of what I am trying to
do. Any ideas at all would be welcome.
Thanks,
Steve Tuckner
Using the nifty Simple OLE browser from the WIN32OLE web page, I was
able to learn that this driver has three “interfaces” to play with.
They are:
BiPrnDrv
Abort
AboutBox
EndDoc
--------------------------- (what EndDoc output looks like)
Class BiPrnDrv
GUID : {E5B71FF3-4946-4DCC-863E-F16B8F864A66}
PROGID : BIPRNDRV.BiPrnDrvCtrl.1
DESCRIPTION : Black Ice Message Capture Control
Event FUNC VOID EndDoc
Dispatch ID : 3
DESCRIPTION :
arg1 - BSTR GroupFileName []
Event Interface : _DBiPrnDrvEvents
···
InitCapture
StarDoc
StartPage
_DBiPrnDrv
AboutBox
GetIDsOfNames
GetTypeInfo
GetTypeInfoCount
InitCapture
Invoke
PrinterName
----------------------------- (What PrinterName entry looks like)
Dispatch _DBiPrnDrv
GUID : {8FE2BEA5-0F7F-4758-B6A4-68F86C74AA2D}
PROGID :
DESCRIPTION : Dispatch interface for BiPrnDrv Control
DISPATCH BSTR PrinterName
UseCopyData
_DBiPrnDrvEvents
Abort
EndDoc
----------------------------- (What EndDoc looks like)
Dispatch _DBiPrnDrvEvents
GUID : {68E14ECB-14D9-4C9D-9470-C05348FED4CC}
PROGID :
DESCRIPTION : Event interface for BiPrnDrv Control
FUNC VOID EndDoc
Dispatch ID : 3
DESCRIPTION :
arg1 - BSTR GroupFileName []
EndPage
GetIDsOfNames
GetTypeInfo
GetTypeInfoCount
Invoke
StartDoc
StartPage
Below is my code to try and get the printing events to be noticed by me.
They have very little doc (the vendor I got it from on the interface,
but do have sample code in VB and Delphi. Even so I have not be able to
get it to work. I can get the AboutBox to come up so that much works.
Below is my Ruby code and below that is the example VB code. I don’t
know much about OLE but I have done some scripting of Outlook. I am
completely new to OLE events. Any ideas at all would be welcome on where
I should go from here (aside from talking to the vendor I acquired this
driver from who has probably never heard of Ruby before). I also tried
setting the printer name but that seemed to have no effect. I don’t
understand the difference between the first two interfaces or how it was
even possible to set the PrinterName against the first interface when it
is part of the second.
(My ruby code)
require “win32ole”
printer = WIN32OLE.new(“BIPRNDRV.BiPrnDrvCtrl.1”)
ev = WIN32OLE_EVENT.new(printer, “_DBiPrnDrvEvents”)
ev.on_event {|*args| print “default handler\n”}
ev.on_event(“StartDoc”) { print “in start doc\n”}
ev.on_event(“StartPage”) {|page_num| print “printing page
#{page_num}\n”}
ev.on_event(“EndDoc”) { print “in end doc\n”}
ev.on_event(“EndPage”) { print “in end page\n”}
while true
WIN32OLE_EVENT.message_loop
end
(VB sample code)
VERSION 5.00
Object = “{6ADA10EC-D372-4FE7-863C-BA84E3B89F76}#1.0#0”; "BIPRNDRV.OCX"
Object = “{F9043C88-F6F2-101A-A3C9-08002B2F49FB}#1.2#0”; "COMDLG32.OCX"
Begin VB.Form Form1
BorderStyle = 3 'Fixed Dialog
Caption = "Message capture sample"
ClientHeight = 3195
ClientLeft = 45
ClientTop = 330
ClientWidth = 4680
Icon = “BiCapture.frx”:0000
LinkTopic = "Form1"
MaxButton = 0 'False
MinButton = 0 'False
ScaleHeight = 3195
ScaleWidth = 4680
ShowInTaskbar = 0 'False
StartUpPosition = 3 'Windows Default
Begin VB.CommandButton Exit
Cancel = -1 'True
Caption = "E&xit"
Height = 375
Left = 1320
TabIndex = 5
Top = 2640
Width = 1815
End
Begin VB.ListBox List1
Height = 1425
ItemData = “BiCapture.frx”:030A
Left = 120
List = “BiCapture.frx”:030C
TabIndex = 4
Top = 960
Width = 4455
End
Begin MSComDlg.CommonDialog CommonDialog1
Left = 120
Top = 2640
_ExtentX = 847
_ExtentY = 847
_Version = 393216
End
Begin VB.Frame Frame1
Caption = "Current Printer"
Height = 735
Left = 120
TabIndex = 1
Top = 120
Width = 4455
Begin VB.CommandButton ChangePrinter
Caption = "Change Printer"
Height = 375
Left = 3000
TabIndex = 2
Top = 240
Width = 1215
End
Begin VB.Label CurrentPrinter
Height = 255
Left = 240
TabIndex = 3
Top = 360
Width = 2535
End
End
Begin BIPRNDRVLib.BiPrnDrv BiPrnDrv1
Height = 615
Left = 3960
TabIndex = 0
Top = 2520
Width = 615
_Version = 65536
_ExtentX = 1085
_ExtentY = 1085
_StockProps = 0
End
End
Attribute VB_Name = "Form1"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Private Sub BiPrnDrv1_EndDoc(ByVal GroupFileName As String)
List1.AddItem "EndDoc message was received."
List1.AddItem "The Group File is: " & GroupFileName
List1.TopIndex = List1.ListCount - 1
End Sub
Private Sub BiPrnDrv1_EndPage(ByVal ImageFileName As String)
List1.AddItem "EndPage message was received."
List1.AddItem “The Image File is:” & ImageFileName
List1.TopIndex = List1.ListCount - 1
End Sub
Private Sub BiPrnDrv1_StarDoc(ByVal GroupFileName As String)
List1.AddItem "StartDoc message was received."
List1.AddItem "The Group File is: " & GroupFileName
List1.TopIndex = List1.ListCount - 1
End Sub
Private Sub BiPrnDrv1_StartPage(ByVal PageNumber As Long)
List1.AddItem "StartPage message was received."
List1.AddItem "The current page number is: " & Str(PageNumber)
List1.TopIndex = List1.ListCount - 1
End Sub
Private Sub ChangePrinter_Click()
CommonDialog1.ShowPrinter
BiPrnDrv1.PrinterName = Printer.DeviceName
CurrentPrinter.Caption = Printer.DeviceName
List1.AddItem "Please print with the " & BiPrnDrv1.PrinterName & "
printer."
End Sub
Private Sub Exit_Click()
Unload Form1
End Sub
Private Sub Form_Load()
BiPrnDrv1.PrinterName = "Black Ice Color"
CurrentPrinter.Caption = "Black Ice Color"
List1.AddItem "Please print with the " & BiPrnDrv1.PrinterName & "
printer."
End Sub