我正在尝试加载一个 dll(它不是我的 dll),它是用 C++ 编写的
据我所知,没有出口,但它会在加载后完成我需要它做的事情。
assert(package.loadlib(dllfile,'')() 这会引发错误,obv,“找不到过程”,但 dll 仍会被加载,并按预期工作。
如果我第二次调用上述函数,它会使客户端崩溃,所以我需要某种检查器。
我的问题是,有没有办法验证它是否已加载?
我正在尝试加载一个 dll(它不是我的 dll),它是用 C++ 编写的
据我所知,没有出口,但它会在加载后完成我需要它做的事情。
assert(package.loadlib(dllfile,'')() 这会引发错误,obv,“找不到过程”,但 dll 仍会被加载,并按预期工作。
如果我第二次调用上述函数,它会使客户端崩溃,所以我需要某种检查器。
我的问题是,有没有办法验证它是否已加载?
在 Lua 5.1 中,当package.loadlib
用作第二个参数时,您必须指定由 DLL 实际导出的函数的名称。如果您只需要强制 Windows 动态链接器加载 DLL(这似乎是您的情况),这并不重要。
要发现此类名称,您可以使用DependencyWalker(免费工具)。使用打开 DLLdepend.exe
并查看导出函数列表面板(第一列有一个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。
希望这可以帮助。