1

我正在尝试加载一个 dll(它不是我的 dll),它是用 C++ 编写的

据我所知,没有出口,但它会在加载后完成我需要它做的事情。

assert(package.loadlib(dllfile,'')() 这会引发错误,obv,“找不到过程”,但 dll 仍会被加载,并按预期工作。

如果我第二次调用上述函数,它会使客户端崩溃,所以我需要某种检查器。

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

4

1 回答 1

1

在 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()语句放在合适的位置以防止脚本终止),
  • 然后打开 ProcessExplorer 窗口,
  • 选择与您的脚本相关的进程(可能是一些lua.exe,但您可以将 ProcessExplorer 工具栏上的“目标”工具拖到您的脚本窗口以发现它)
  • 并输入 ctrl-D。

应出现一个下部面板,显示所选进程正在使用的所有 DLL。浏览列表以查看是否列出了您的 DLL。

希望这可以帮助。

于 2013-08-19T21:33:17.680 回答