From: Steve Tuckner Date: 2003-07-09T01:03:12+09:00 Subject: Re: [WIN32OLE]: Using Events This is a multi-part message in MIME format. ------=_NextPart_000_0395_01C34540.7D0E2B90 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit 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 ------=_NextPart_000_0395_01C34540.7D0E2B90 Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable
Just=20 to let you'all know that the reason the events weren't working was = because of=20 some application specific interaction with the printer object. WIN32OLE = worked=20 great! Thanks for a great extension!
 
Steve=20 Tuckner
-----Original Message-----
From: Steve Tuckner=20 [mailto:STUCKNER@MULTITECH.COM]
Sent: Monday, July 07, 2003 = 5:16=20 PM
To: ruby-talk ML
Subject: [WIN32OLE]: Using=20 Events

Hello=20 all,
 
I = am trying to use=20 Win32OLE to control a windows printer driver that will be used to = capture the=20 printer output from applications to create TIFF files. Below is my = long winded=20 explanation of what I am trying to do. Any ideas at all would be=20 welcome.
 
Thanks,
 
Steve=20 Tuckner
 
 
Using the nifty=20 Simple OLE browser from the WIN32OLE web page, I was able to learn = that this=20 driver has three "interfaces" to play with.
 
They=20 are:
 
BiPrnDrv
  =20 Abort
  =20 AboutBox
  =20 EndDoc
--------------------------- (what EndDoc output looks=20 like)
Class =20 BiPrnDrv
  GUID : = {E5B71FF3-4946-4DCC-863E-F16B8F864A66}
 =20 PROGID : BIPRNDRV.BiPrnDrvCtrl.1
  DESCRIPTION : Black Ice = Message=20 Capture Control
 
Event FUNC VOID=20 EndDoc
  Dispatch ID : 3
  DESCRIPTION :
  = arg1 -=20 BSTR GroupFileName []
 
  Event=20 Interface :=20 _DBiPrnDrvEvents
-----------------------------
  =20 InitCapture
  =20 StarDoc
   StartPage
_DBiPrnDrv
  =20 AboutBox
   GetIDsOfNames
  =20 GetTypeInfo
  =20 GetTypeInfoCount
  =20 InitCapture
  =20 Invoke
  =20 PrinterName
----------------------------- (What PrinterName entry looks=20 like)
Dispatch =20 _DBiPrnDrv
  GUID : = {8FE2BEA5-0F7F-4758-B6A4-68F86C74AA2D}
 =20 PROGID :
  DESCRIPTION : Dispatch interface for BiPrnDrv=20 Control
 

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