ruby - 通过其 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
解决方案
推荐阅读
- javascript - JavaScript 模块导入通配符 * 与显式导入
- java - Querydsl - 使用泛型时返回错误的类
- excel - 将 Excel 工作表导出到 PDF 文件时出现奇怪的 Powershell 行为
- android - android studio中的模拟器和USB调试问题
- vue.js - vue - v-日历 24 小时格式
- android - int bitrate = mediaformat.getInteger(MediaFormat.KEY_BIT_RATE) 正在返回 NullPointerException
- python - 皮威。CharField 更新时将单个字符串值保存为模型的实例字段中的元组
- recursion - 如何在 C 中对子集问题使用递归
- node.js - 如何将json转换为带空格的字符串
- android - SurfaceTexture 的构造函数是否支持 GL_TEXTURE_2D 纹理?