I thought I'd summarise my conclusions here, on the off chance they may help someone else with a similar problem... Although unfortunately, I offer no solutions! ;-) Jeff Cohen wrote: > > Sounds like have a COM object but not a scriptable COM object. Only COM > objects which implement the IDispatch interface can be called from > late-binding scripting languages like VBScript and JScript. > > VB (not VBScript) is able to use early-binding COM objects as well as > late-binding ones, so that's why you got a "false positive" by using VB > instead of VBScript. Actually, that is not the problem here. The COM objects *do* implement IDispatch: irb(main):004:0> p hfm.ole_methods [QueryInterface, AddRef, Release, GetTypeInfoCount, GetTypeInfo, GetIDsOfNames, Invoke, ... The problem seems to be that a key method (OpenApplication) which is required to obtain references to other COM objects does so by using OUT parameters which are declared to be of type Unknown, rather than the actual type. Here is the method signature again: # VOID OpenApplication # method OpenApplication # BSTR arg0 --- bstrClusterName [IN] # BSTR arg1 --- bstrProduct [IN] # BSTR arg2 --- bstrApp [IN] # UNKNOWN arg3 --- ppIUnkServer [OUT] # UNKNOWN arg4 --- ppIUnkSession [OUT] As Ruby (along with VBScript, JScript, etc) is a dynamically typed language, there is no way to declare the desired type of the arg3 and arg4 parameters passed into (and out of, via ARGV) the OpenApplication method, as you can do in VB: Dim session as HsvSession Passing an ordinary Object (Object.new) for arg3 and arg4 allows the method call to succeed, but the returned objects can't be used to call any COM methods because WIN32OLE does not have any type info for them. I think the reason the types are declared as Unknown in this instance is because the type of the returned object (HsxServer and HsvSession respectively) are defined in different (and separate) type libraries. Exactly why this should be the case, I've no idea. There are two ways I can see that this problem might still be overcome, but both are beyond me: 1) Create a dummy object of the correct COM type, i.e. server = WIN32OLE.new('Hyperion.HsxServer') session = WIN32OLE.new('Hyperion.HsvSession') hfm.OpenApplication(arg0, arg1, arg2, server, session) server = ARGV[3] session = ARGV[4] This seemed quite promising, in that the call appeared to succeed, and the returned objects had the necessary type library info attached. However, any attempt to use these objects subsequently led to a "HRESULT error code:0x80020009 Exception occurred" error. I'm not sure what is causing this error (something to do with reference counting maybe?), but I was unable to get past it. 2) Enhance WIN32OLE to somehow allow type information to be added to an object once it has been created. What I'm getting at here is that after a successful call to OpenApplication using Object.new, I know that ARGV[3] is actually of type HsxServer and ARGV[4] is of type HsvSession, but WIN32OLE does not. If I could somehow assign type information to these out parameters that currently lack it, I could then call the COM methods on these objects. I'm not sure how much effort this second option would be, but I figure this problem is probably too specialised to warrant the effort. Therefore, I'll probably end up working around this via VB (arghh!) :-( Cheers, Adam -- Posted via http://www.ruby-forum.com/.