gpt4 book ai didi

c++ - Lua 模块从 DllMain 推送 C 函数

转载 作者:太空宇宙 更新时间:2023-11-04 04:50:34 25 4
gpt4 key购买 nike

我有一个该死的大问题。如您所知,Lua 允许创建模块,并且您可以使用 5.1(以前的 loadlib)中的 require() 函数加载这些模块。

#define LUA extern "C" __declspec(dllexport) int __cdecl

static int l_TestFunc(lua_State * L)
{

lua_pushboolean (L, 1); // return true

return 1;
}

LUA luaopen_MyModule(lua_State *L)
{

printf("test2");
lua_pushcfunction(L, l_TestFunc);
lua_setglobal(L, "TestFunc");

return 1;
}

所以在 Lua 中你只需要使用 require("MyModule") 一切正常。(luaopen_* 是入口点)

但我需要使用标准方式(DllMain 作为入口点)。我试过了,但没用。有什么想法吗?

最佳答案

But I need to use standard way(DllMain as entry point). I tried but it didn't work. Got any ideas?

DllMain 始终是您的入口点(如果已定义),但您不能使用它来加载您的函数,因为您没有 Lua 状态来将它们加载到那里

当您在 Lua 代码中运行“require”时,执行该代码的应用程序(例如 lua.exe)将加载您的 DLL(调用 DllMain),然后调用 luaopen_MyModule 传入 Lua state 执行了 require 语句。您的 DllMain 无法访问该状态指针...


...嗯,不是普通方式。您可以解决一些问题,以便主机应用程序在加载之前将 Lua 状态的内存位置写入您的 DLL 可访问的某个外部位置(注册表、文件等)你的 DLL。您的 DLLMain 可以获取指针寄存器,它的功能进入该状态。不确定您为什么要这样做,但在像 C 这样的语言中,这在技术上是可行的。

这需要您编写主机,以便您可以安排在某处写入状态。或者你可以有一个单独的模块,以普通方式加载,它写入 Lua_state 值,然后所有其他模块都可以从它们的 DllMains 访问它。


这闻起来很像 XY Problem .愿意分享为什么你想在 DllMain 中注册你的函数吗?

关于c++ - Lua 模块从 DllMain 推送 C 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15844908/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com