Как мне вызвать функции внутри C++ DLL из Lua?

У меня есть DLL, написанная на C++, которая является устаревшим кодом и не может изменить исходный код. Я хочу иметь возможность вызывать некоторые функции внутри DLL из Lua.

Например, я хотел бы сделать что-то вроде этого:

-- My Lua File
include(myCppDll.dll)

function callCppFunctionFromDll()
     local result = myCppFunctionFromDll(arg1, arg2)
     --Do something with result here
end

Возможно ли что-то подобное?

3 ответа

Решение

Если Alien не отвечает вашим потребностям, и его может быть непросто использовать, если DLL имеет строго объектно-ориентированный интерфейс, где вам нужно получить доступ к членам и методам объектов, а также просто вызвать экспортированные функции, тогда вам следует посмотреть при генерации DLL-оболочки, которая связывает устаревший API от DLL до Lua.

Это можно сделать с помощью генератора обертки, такого как Swig, который будет писать обертки для Lua, а также многих других языков сценариев, основанных на объявлениях классов и функций, часто просто принимая чуть больше, чем существующие.h файлы в качестве входных данных.

Lua - также достаточно простой код, для которого может быть проще написать свою собственную обертку вручную на C. Для этого начните со стандартного рецепта создания вызываемого модуля Lua в C и реализуйте функции, которые передают аргументы из стека Lua. в форму, подходящую для каждого вызова API, вызовите библиотеку DLL и поместите все результаты обратно в стек Lua. Это также место, где можно воспользоваться возможностью Lua возвращать более одного результата для тех функций, которые в DLL должны были использовать выходные указатели для обработки второго (или более) возвращаемого значения. Обсуждение проблем и некоторые примеры кода доступны на вики Lua User.

Также есть страница, посвященная привязке Lua к другим языкам в вики Lua User.

Попробуйте Alien: http://alien.luaforge.net/

Существует также C / Invoke: http://www.nongnu.org/cinvoke/lua.html

Вам придется использовать либо автоматизированный инструмент, либо написанный вручную интерфейс C++. Lua не может обрабатывать прямой код C++.

Другие вопросы по тегам