首页 > 解决方案 > 通过其 hwnd 或其在 ruby​​ 中的内存地址检索 OLE 对象

问题描述

我想通过其 hwnd 获取 Excel 实例(应用程序)的 win32ole 对象。我怎样才能做到这一点?

(您在这里找到的更一般的问题。)

有一个方法 AccessibleObjectFromWindow 我可以通过小提琴使用它来获取 Excel 实例的内存地址。但是如何获取/连接到相应的 OLE 对象?我找不到合适的 win32ole 方法。你有什么建议吗?

这是我到目前为止的代码

module Oleacc
  # Extend this module to an importer
  extend Fiddle::Importer
  # Load 'oleacc' dynamic library into this importer
  dlload 'oleacc'
  # Set C aliases to this importer for further understanding of function signatures 
  typealias 'HWND', 'HANDLE'
  typealias 'HANDLE', 'void*'
  typealias 'ppvObject', 'void**'
  typealias 'DWORD', 'unsigned long'
  typealias 'HRESULT', 'long'  
  Guid = struct [
    'unsigned long data1',
    'unsigned short data2',
    'unsigned short data3',
    'unsigned char data4[8]'
  ]
  # Import C functions from loaded libraries and set them as module functions
  extern 'HRESULT AccessibleObjectFromWindow(HWND, DWORD, struct guid*, ppvObject)'
end

def get_ole_object(hwnd)
  accessible_object_address_buffer = ' ' * 8
  guid = Oleacc::Guid.malloc
  guid.data1 = 0x20400
  guid.data2 = 0x0
  guid.data3 = 0x0
  guid.data4 = [0xc0,0x0,0x0,0x0,0x0,0x0,0x0,0x46]
  status = Oleacc::AccessibleObjectFromWindow(hwnd, 0xFFFFFFF0, guid, accessible_object_address_buffer)
  # accessible_object_address_buffer results in sth. like "\xA8\u001D\xA97\xE9\u0001\u0000\u0000"
  if status == 0 
    accessible_object_address = accessible_object_address_buffer.unpack('L')[0]
    # results in sth. like 933830056,
    ole_excel = connect_to_ole_object(accessible_object_address)
    return ole_excel
    end
  end
end
   
    

标签: rubywindowsolewin32olefiddle

解决方案


推荐阅读