我想通过其 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