Можно ли поделиться объектом ruby ​​с dll, созданной с помощью ruby.h? - PullRequest
0 голосов
/ 14 марта 2019

У меня есть исполняемый файл, который запускает код ruby ​​(точнее RGSS3), и мне также удалось создать DLL, включающую ruby.h, и она импортируется в исполняемый файл через LoadLibraryA.

Я хочу спросить, возможно ли разделить объект / память между exe и dll? Если да, что я должен сделать, чтобы dll получил доступ к объектам, созданным exe, и наоборот?

1 Ответ

0 голосов
/ 14 марта 2019

Да, это возможно.

Объекты Ruby представлены в C с VALUE, который в основном является указателем. Однако вызывать эти функции из RGSS3 немного глупо: вам нужно получить адрес памяти объекта (object.object_id << 1) и передать , который , в функцию.

Взгляните на этот репозиторий, в частности этот файл. Он объявляет и экспортирует функцию, которую вы можете использовать из RPG Maker, импортируя ее с Win32API. Предположим, вы скомпилировали 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)
...