我正在尝试加载一个 dll(这不是我的 dll),它是用 C++ 编写的
据我所知,没有任何出口,但它做了我需要它做的事情 一旦加载。
assert(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 是否已列出。
希望这有帮助。