我尝试加载一个dll(这不是我的DLL),它的C++编写LUA LOADLIB DLL
有没有就我所知出口,但它做什么,我需要做一次加载。
断言(package.loadlib(dllfile, '')() 这将引发错误,OBV, “程序未找到”,但该dll仍然加载,并且按预期工作。
,如果我叫上述功能的第二次,它崩溃的客户端,所以我需要某种形式的检查。
我的问题是,有没有一种方法来验证它的加载?
我尝试加载一个dll(这不是我的DLL),它的C++编写LUA LOADLIB DLL
有没有就我所知出口,但它做什么,我需要做一次加载。
断言(package.loadlib(dllfile, '')() 这将引发错误,OBV, “程序未找到”,但该dll仍然加载,并且按预期工作。
,如果我叫上述功能的第二次,它崩溃的客户端,所以我需要某种形式的检查。
我的问题是,有没有一种方法来验证它的加载?
在Lua中5.1使用package.loadlib
作为第二时参数,你必须指定一个函数实际上由DLL导出的名称,如果你只是需要的话,这并不重要强制Windows动态链接器加载DLL(这似乎是你的情况)。
要发现这样的名字,你可以使用DependencyWalker(免费工具)。使用depend.exe
打开DLL并查看导出功能列表面板(第一列有一个E标题标签)。选择任何函数并将其名称用作第二个参数(如果它确实没有导出的函数,那么您运气不好!)。尝试选择标记为C(而不是C++)的函数。 C++导出的函数具有可能导致问题的错误名称。
例如,假设你想加载kernel32.dll:使用depend.exe
你可以发现在所有导出的函数中有一个名为AddAtomA
(但是其他C函数会这样做)。所以,你可以以这种方式使用package.loadlib
:
assert(package.loadlib("kernel32.dll", "AddAtomA"))
的assert
调用确保,如果DLL无法加载发出一个错误。
要验证DLL是否实际加载,您可以使用ProcessExplorer(另一个免费工具)。
io.read()
声明在一个合适的地方,让您的脚本终止),lua.exe
,但您可以将ProcessExplorer工具栏上的“目标”工具拖动到您的脚本窗口以发现它)应该出现一个下面板,显示所选进程正在使用的所有DLL。浏览列表以查看是否列出了您的DLL。
希望这会有所帮助。
试试'package.loadlib(dllfile,'*')'。 – 2013-02-28 15:54:36
“procedure not found” – user1594623 2013-02-28 16:32:56
使用星号代替函数名称时,不会出现此错误。显示你的代码。 – 2013-02-28 16:53:42