你如何使用ruby的WIN32OLE来获取非“IDispatch”接口的实例?

时间:2013-08-16 03:43:09

标签: ruby com win32ole

我想通过Ruby访问CUIAutomation对象。 OLE / COM对象查看器报告以下详细信息:

[
  uuid(FF48DBA4-60EF-4201-AA87-54103EEF594E),
  version(1.0),
  helpstring("The Central Class for UIAutomation")
]
coclass CUIAutomation {
    [default] interface IUIAutomation;
};

我尝试使用UUID

访问它
 WIN32OLE.new('{FF48DBA4-60EF-4201-AA87-54103EEF594E}')
WIN32OLERuntimeError: failed to create WIN32OLE object from `{FF48DBA4-60EF-4201-AA87-54103EEF594E}'
    HRESULT error code:0x80004002
      No such interface supported

查看WIN3OLE.new的实现,它试图获取IDispatch接口,但失败了。

...
/* get IDispatch interface */
hr = CoCreateInstance(&clsid, NULL, CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER,
                      &IID_IDispatch, &p);
...

Microsoft examples中代码直接使用IID_IUIAutomation接口

#include <uiautomation.h>

// CoInitialize must be called before calling this function, and the  
// caller must release the returned pointer when finished with it.
// 
HRESULT InitializeUIAutomation(IUIAutomation **ppAutomation)
{
    return CoCreateInstance(CLSID_CUIAutomation, NULL,
        CLSCTX_INPROC_SERVER, IID_IUIAutomation, 
        reinterpret_cast<void**>(ppAutomation));
}

我是否需要修补和重建Win32OLE?我怎样才能获得CUIAutomation的实例?

1 个答案:

答案 0 :(得分:0)

简短的回答是 - 你没有。 Win32Ole需要IDispatch提供的功能。如果COM对象不公开对IDispatch的访问,则它与Win32Ole不兼容。唯一的选择是使用其他语言(如C / C ++)开发自己的IDispatch包装器,然后可以将其与Win32Ole一起使用。