# Ruby problems calling VB COM using win32ole

**URL:** <https://www.ruby-forum.com/t/ruby-problems-calling-vb-com-using-win32ole/98120>\
**Category:** Ruby\
**Created:** [July 12, 2006, 5:19pm UTC](https://www.ruby-forum.com/t/ruby-problems-calling-vb-com-using-win32ole/98120 "2006-07-12T17:19:59Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![rawroe](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/94ad74/32.png) [@rawroe](https://www.ruby-forum.com/u/rawroe)\
**Post date:** [July 12, 2006, 5:19pm UTC](https://www.ruby-forum.com/t/ruby-problems-calling-vb-com-using-win32ole/98120/1 "2006-07-12T17:19:59Z")

</div>

Hi,

I’m experiencing some unusual behaviour trying to use VB COM through  
win32ole in Ruby, and I’m hoping someone might be able to help. I’m  
using Ruby 1.84-19 (final) here.

I’ve included the contents of the files I’m using to reproduce these  
issues below. Note that you need VB6 to build the COM DLL, but hopefully  
you’ll be able to see what it’s doing without this.

If you run the script, you’ll find that it calls a VB subroutine that  
raises an error, and just before this it displays a dialog window saying  
“About to raise error…”. However, despite the script only containing  
one call to this subroutine, when you click OK to dismiss the window it  
appears again. Is this a bug or is there an explanation for it?

The script then calls a VB function that returns an empty variant and an  
uninitialised array in a variant. However, when Ruby tries to display  
the contents of the return value it gives different results, namely  
‘nil’ and ‘false’. I was expecting it to display ‘nil’ in both cases  
since there is no data available, but perhaps I’ve misunderstood  
something. Note that until the most recent version, this final call  
would actually generate a segmentation fault!

Thanks,

Andrew.

Problems.rb

* * *

require ‘win32ole’

def problems()  
begin  
test = WIN32OLE.new(‘Project1.Class1’)  
test.raiseerror()  
end  
rescue  
puts test.emptyvariant()  
puts test.emptyarray()  
end

problems()

Class1.cls

* * *

VERSION 1.0 CLASS  
BEGIN  
MultiUse = -1 'True  
Persistable = 0 'NotPersistable  
DataBindingBehavior = 0 'vbNone  
DataSourceBehavior = 0 'vbNone  
MTSTransactionMode = 0 'NotAnMTSObject  
END  
Attribute VB\_Name = “Class1”  
Attribute VB\_GlobalNameSpace = False  
Attribute VB\_Creatable = True  
Attribute VB\_PredeclaredId = False  
Attribute VB\_Exposed = True  
Option Explicit  
Public Function EmptyVariant() As Variant  
End Function  
Public Function EmptyArray() As Variant  
Dim Test() As Variant  
EmptyArray = Test  
End Function  
Public Sub RaiseError()  
MsgBox “About to raise error…”  
Err.Raise vbObjectError  
End Sub

Project1.vbp

* * *

Type=OleDll  
Class=Class1; Class1.cls  
Reference=\*\G{00020430-0000-0000-C000-000000000046}#2.0#0#C:\WINNT\System32\STDOLE2.TLB#OLE  
Automation  
Startup="(None)"  
ExeName32=“Project1.dll”  
Command32=""  
Name=“Project1”  
HelpContextID=“0”  
CompatibleMode=“1”  
CompatibleEXE32=“Project1.dll”  
MajorVer=1  
MinorVer=0  
RevisionVer=0  
AutoIncrementVer=0  
ServerSupportFiles=0  
VersionCompanyName=“BNP Paribas”  
CompilationType=0  
OptimizationType=0  
FavorPentiumPro™=0  
CodeViewDebugInfo=0  
NoAliasing=0  
BoundsCheck=0  
OverflowCheck=0  
FlPointCheck=0  
FDIVCheck=0  
UnroundedFP=0  
StartMode=1  
Unattended=0  
Retained=0  
ThreadPerObject=0  
MaxNumberOfThreads=1  
ThreadingModel=1
