Хорошо, я немного искал, но, похоже, не смог найти ответ или пример того, как этого добиться.
По сути, у меня есть приложение, разработанное для переносимости (созданное с использованием VC ++ в VS2010, но без MFC или управляемых компонентов, необработанный WinAPI). У меня есть Lua 5.2, встроенный в него и позволяющий пользователю писать скрипты внутри приложения. У меня есть несколько склеенных функций, которые доступны для скриптов Lua, которые обрабатывают различные вызовы WinAPI.
Однако я бы хотел, чтобы пользователь мог написать скрипт, который выглядит примерно так:
require[[Alien/alien]]
local mb = alien.User32.MessageBoxA
mb:types{ 'long', 'long', 'string', 'string', 'long' }
print(mb(0, "Hello World!", "Test", 64))
Я просто не могу найти способ сделать это. Я не хочу требовать от пользователя установки Lua для Windows и, в идеале, не должно быть core.dll и struct.dll от иностранца; Когда я пытался что-то сделать с этими DLL-файлами в ./alien/, он зависал в Lua5.1.dll, потому что у меня был установлен LuaForWindows, я удалил LFW, а затем он просто утверждает, что Lua5.1.dll отсутствует. У меня есть Lua 5.2, встроенная в мое приложение, поэтому очевидно, что библиотеки DLL core / struct из Alien Rock ожидают, что Lua5.1.dll будет в пути.
Я предпринял бесполезную попытку включить Alien src в проект, но, похоже, тоже не работает.
Любые идеи будут с благодарностью. Я бы предпочел, чтобы все это содержалось в моем приложении, но я остановлюсь на решении, которое включает в себя включение библиотек в мой проект для сборки и объединения в дистрибутив, если это единственная альтернатива.
Спасибо!
UPDATE:
Хорошо, спасибо, Бен Фойгт! Я думаю, что я почти там. Я загрузил core.c и struct.c и убедился, что все пути есть для libffi. Все компилируется без проблем, пока я не попытаюсь вызвать luaopen_alien_core в core.c (файл src alien.core), утверждая, что идентификатор не объявлен. Я попытался объявить сигнатуру функции в моем отдельном исходном файле, который пытается выполнить вызов, компиляция идет дальше, но не удается пожаловаться на неразрешенный внешний файл.
Очевидно, что это, вероятно, сейчас общая проблема C ++ (поскольку я только новичок в этой области). Вот общее представление о том, что у меня есть:
//core.c (from Alien project)
(...)
int luaopen_alien_core(lua_State *L) {
alien_register_library_meta(L);
alien_register_callback_meta(L);
alien_register_function_meta(L);
alien_register_buffer_meta(L);
lua_getglobal(L, "alien");
if(lua_isnil(L, -1)) {
lua_newtable(L);
lua_pushvalue(L, -1);
lua_setglobal(L, "alien");
}
lua_newtable(L);
lua_pushvalue(L, -1);
lua_setfield(L, -3, "core");
alien_register_main(L);
return 1;
}
//mysource.c (the file attempting to call luaopen_alien_core(L))
void initLua()
{
L = luaL_newstate();
luaL_openlibs(L);
luaopen_alien_core(L);
(...)
}
Не удается начать компиляцию, выдав ошибку:
error C3861: 'luaopen_alien_core': identifier not found
Это имеет смысл, поэтому я добавляю следующую строку в myheader.h:
int luaopen_alien_core(lua_State *L);
Компилируется, но не может связаться с:
error LNK2001: unresolved external symbol "int __cdecl luaopen_alien_core(struct lua_State *)" (?luaopen_alien_core@@YAHPEAUlua_State@@@Z)
Я пробовал несколько вещей, о которых я могу думать, с моим ограниченным опытом, но ничто не удовлетворит эту ошибку. Я даже пытался переместить содержимое файла core.c в mysource.c, но это создает совершенно другой беспорядок и, похоже, является неправильным путем.
Я надеюсь, и воображаю, что это действительно глупо, но я просто не уверен, как заставить его вызвать luaopen_alien_core, который, кажется, является последним фрагментом, который мне нужен.
Еще раз спасибо!
}