[WIN32OLE]: Using Events

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

Just to let you’all know that the reason the events weren’t working was
because of some application specific interaction with the printer
object. WIN32OLE worked great! Thanks for a great extension!

Steve Tuckner

···

-----Original Message-----
From: Steve Tuckner [mailto:STUCKNER@MULTITECH.COM]
Sent: Monday, July 07, 2003 5:16 PM
To: ruby-talk ML
Subject: [WIN32OLE]: Using Events

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

Gentelmans: …(There are any woman around there ?)

I would love to be able to do:

a=(1…10)
a.each {| x , y| p x }

1
3
5
7
9

(IMHO … following the principle of the least surprise…may it
should be a native behavior .)

How can I overwrite this method, to get the behavior I want ?

-ronnie

···

Man invented language to satisfy his deep need to complain.
– Lily Tomlin
ruby -e ’ puts “why?”

Gentelmans: …(There are any woman around there ?)

Sorry… I don’t know if there is any ruby-girls around ?

ruby a.rb
1
3
5
7
9

expand -t2 a.rb
class Array
def each(&block)
n = block.arity
x = 0
while x < self.size
data = self.slice(x, n)
if data.size != n
until data.size >= n
data[data.size] = nil
end
end
yield *data
x += n
end
end
end

(1…10).to_a.each {|x, y| p x}

···

On Wed, 09 Jul 2003 03:50:15 +0900, Bermejo, Rodrigo wrote:


Simon Strandgaard

For that kind of thing I tend to do the quick-and-dirty

a = [1,2,3,4,5,6,7,8,9,10]
while a.size > 0
p a.shift
a.shift
end

A more general pattern might be:

module Enumerable
def each_group(n=1)
res =
each do |i|
res << i
if res.size >= n
yield res
res =
end
end
yield res if res.size > 0
end
end

By making it part of ‘Enumerable’ and only depending on ‘each’, it works for
any enumerable class:

(1…10).each_group(2) { |x,y| puts x } # prints 1,3,5,7,9

Regards,

Brian.

···

On Wed, Jul 09, 2003 at 02:50:15AM +0900, Bermejo, Rodrigo wrote:

I would love to be able to do:

a=(1…10)
a.each {| x , y| p x }

1
3
5
7
9