我有一个运行ruby代码(RGSS3,精确)的可执行文件,我还设法构建了一个包含ruby.h的DLL,它通过LoadLibraryA导入到exe。
我想问一下是否有可能在exe和dll之间共享对象/内存?如果是,我该怎么做才能让dll访问exe创建的对象,反之亦然?
对的,这是可能的。
Ruby对象用C表示VALUE
,它基本上是一个指针。但是,从RGSS3调用这些函数有点麻烦:你必须得到对象的内存地址(object.object_id << 1
)并将其传递给函数。
看看this存储库,特别是this文件。它声明和导出一个函数,您可以使用从Win32API
导入它的RPG Maker。假设您将test.c
从该存储库编译为test.dll
:
# Load RGSS3 dll
LoadLibrary = Win32API.new("kernel32", "LoadLibraryA", "p")
rgss3_dll = LoadLibrary.call("RGSS301.dll")
# Call function from your dll
bitmap = Bitmap.new(32, 32)
BitmapTest = Win32API.new("test.dll", "BitmapTest", "ll")
p BitmapTest.call(rgss3_dll, bitmap.object_id << 1)