Создание C ++ DLL, загружаемой Lua - PullRequest
9 голосов
/ 26 августа 2010

У меня есть небольшое приложение, которое использует Lua, связанный как dll (не статичный).Я хочу загрузить свой собственный написанный на c ++ dll через Lua, используя package.loadlib (libname, funcname) .Для этого мне нужно экспортировать функцию, которая соответствует протоколу Lua lua_CFunction .Ясно, что по этой причине я должен включить lua.h в свой проект и использовать функции Lua для передачи параметров и результатов.Итак, мои вопросы:

  1. Будет ли моя DLL использовать Lua dll, которая уже загружена в процесс небольшого приложения?
  2. package.loadlib Загружает и выгружает мою DLL сразу или мою DLL после загрузкиостается до конца выполнения lua scrpit или завершения приложения?

Ответы [ 2 ]

8 голосов
/ 27 августа 2010

Начиная с ваших конкретных вопросов:

  1. Да, но только если ваша DLL неявно связана с ней.Будьте осторожны с этим, потому что если вы случайно подключите две копии Lua VM к своему приложению, это может привести к путанице.В этом отношении аналогичные проблемы относятся и к среде выполнения C.Я бы загрузил все приложение в Dependency Walker , чтобы убедиться, что оно относится только к одному экземпляру Lua DLL и одному времени выполнения C.

  2. Насколько я понимаю,package.loadlib() отвечает только за загрузку и связывание с указанной функцией в указанной библиотеке.Пока возвращенный объект функции (представляющий lua_CFunction, который вы назвали) жив, то DLL, безусловно, загружается.Если вы потеряете последнюю ссылку на функцию, библиотека может быть доступна для сборки мусора, и если она будет собрана, она будет выгружена.В списке рассылки Lua-L говорилось о том, как точно гарантировать, что конкретная DLL была выгружена, если это ваша проблема.В противном случае, если вы просто предполагаете, что DLL загружена до тех пор, пока вы можете достичь функции, хранящейся в ней, у вас все будет хорошо.

Позвольте мне добавить, что система модулей построена поверхэто намного лучший способ расширить Lua кодом C или C ++. Глава 26 Программирование на Lua описывает это более подробно, и ссылка на эту главу содержится в онлайн-копии первого издания (которая описывает Lua 5.0).Обратите внимание, что система модулей немного изменилась в Lua 5.1 и снова в Lua 5.2.Получение копии второго или третьего выпусков PiL (доступных как в бумажной, так и в виде электронных книг у многих книготорговцев) может быть полезным.

Вот краткое содержание: чтобы создать модуль с именем foo в C, высоздайте foo.dll, который экспортирует как минимум функцию с прототипом int luaopen_foo(lua_State *L).Эта функция должна загружать ваш модуль (обычно с помощью luaL_register() в Lua 5.1 или luaL_newlib() или luaL_setfuncs() в Lua 5.2 для регистрации таблицыполный функций C) и вернуть эту таблицу.Со стороны Lua, вы помещаете DLL куда-нибудь по пути, описанному в package.cpath, и затем она может быть загружена кодом, подобным local foo = require "foo".Существуют и другие тонкие различия между различными версиями Lua 5.x, но довольно просто создать код C, который можно скомпилировать для любой из них.

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

0 голосов
/ 26 августа 2010

Вы можете динамически связываться с той же самой Lua dll, что и в вашем приложении.

Что касается package.loadlib, я понятия не имею, как это работает. Прочитать источник?

...