2013-02-28 65 views
1

我尝试加载一个dll(这不是我的DLL),它的C++编写LUA LOADLIB DLL

有没有就我所知出口,但它做什么,我需要做一次加载。

断言(package.loadlib(dllfile, '')() 这将引发错误,OBV, “程序未找到”,但该dll仍然加载,并且按预期工作。

,如果我叫上述功能的第二次,它崩溃的客户端,所以我需要某种形式的检查。

我的问题是,有没有一种方法来验证它的加载?

+1

试试'package.loadlib(dllfile,'*')'。 – 2013-02-28 15:54:36

+0

“procedure not found” – user1594623 2013-02-28 16:32:56

+0

使用星号代替函数名称时,不会出现此错误。显示你的代码。 – 2013-02-28 16:53:42

回答

0

在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。

希望这会有所帮助。