lua loadlib dll

问题描述 投票:0回答:1

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

据我所知,没有任何出口,但它做了我需要它做的事情 一旦加载。

assert(package.loadlib(dllfile,'')()

这会引发错误,obv,“未找到过程”,但 dll 仍已加载,并且按预期工作。

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

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

dll lua package assert loadlibrary
1个回答
1
投票

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

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

希望这有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.