Dll 加载库

Dll 加载库,dll,lua,package,assert,loadlibrary,Dll,Lua,Package,Assert,Loadlibrary,我试图加载一个dll(它不是我的dll),它是用C写的++ 我的知识没有输出,但它完成了加载后我需要它做的事情 断言(package.loadlib(dllfile,)() 这会抛出一个错误obv“procedure not found”,但dll仍在加载,并按预期工作 如果我第二次调用上述函数,它会使客户端崩溃,因此我需要某种检查程序 我的问题是,有没有办法验证它是否已加载?在Lua 5.1中,当使用package.loadlib作为第二个参数时,您必须指定DLL实际导出的函数的名称。如果您只

我试图加载一个dll(它不是我的dll),它是用C写的++

我的知识没有输出,但它完成了加载后我需要它做的事情

断言(package.loadlib(dllfile,)()
这会抛出一个错误obv“procedure not found”,但dll仍在加载,并按预期工作

如果我第二次调用上述函数,它会使客户端崩溃,因此我需要某种检查程序


我的问题是,有没有办法验证它是否已加载?

在Lua 5.1中,当使用
package.loadlib
作为第二个参数时,您必须指定DLL实际导出的函数的名称。如果您只需要强制Windows动态链接器加载DLL(这似乎是您的情况),这一点并不重要

要发现这些名称,您可以使用(免费工具)。使用
depend.exe
打开DLL,并查看导出函数列表面板(第一列有E标题标签)。选择任何函数,并将其名称用作第二个参数(如果它确实没有导出函数,您就倒霉了!)尝试选择一个标记为C(不C++)的函数。C++导出函数有可能导致问题的被损坏的名称。 例如,假设您要加载kernel32.dll:使用
depend.exe
,您可以发现在所有导出的函数中有一个名为
AddAtomA
(但任何其他C函数都可以)。因此您可以这样使用
package.loadlib

assert( package.loadlib( "kernel32.dll", "AddAtomA" ) )
assert
调用确保在无法加载DLL时发出错误

要验证DLL是否已实际加载,可以使用(另一个免费工具)

  • 确保脚本正在运行(您可以将
    io.read()
    语句放在适当的位置,以防止脚本终止)
  • 然后打开ProcessExplorer窗口
  • 选择与脚本相关的进程(可能是一些
    lua.exe
    ,但您可以将ProcessExplorer工具栏上的“目标”工具拖到脚本窗口以发现它)
  • 然后键入ctrl-D
应显示一个较低的面板,显示所选进程正在使用的所有DLL。浏览列表以查看是否列出了您的DLL


希望这有帮助。

尝试
package.loadlib(dllfile,“*”)
“找不到过程”如果使用星号而不是函数名,则无法得到此错误。请显示您的代码。assert(package.loadlib(mypath..[\lib.dll]],“*”)()Oops!Lua 5.1不支持loadlib中的星号。请尝试Lua 5.2(或者使用DLUAJIT\u ENABLE\u lua52 compat选项构建LuaJIT,或者从luajit4win.no ip.org下载)。为什么要尝试执行loadlib返回的函数,并使用空函数名调用?