2

我已经转换了所有的 VB.NET DLL 声明

Declare Function SFileOpenArchive Lib "Storm.dll" Alias "#266" (ByVal lpFileName As String, ByVal dwPriority As Integer, ByVal dwFlags As Integer, ByRef hMPQ As Integer) As Boolean

进入德尔福。

function SFileOpenArchive(lpFileName: String; dwPriority, dwFlags, hMPQ: Integer): Boolean; stdcall; external 'Storm.dll';

但是,当我调用函数并编译程序时,出现以下错误:

过程入口点 SFileOpenArchive 无法位于动态链接库 Storm.dll 中。

我已确保:

  1. DLL 存储在与应用程序相同的目录中
  2. 我声明的函数存在(我得到了用 VB.NET 编码的源代码)

我能做些什么来解决这个错误?

提前谢谢你。

4

1 回答 1

4

我可以看到您有以下问题:

  1. 该函数已按序号而不是名称导出。您需要在 Delphi 代码中指定序数。
  2. 第一个参数应该是 PAnsiChar 而不是 Delphi 字符串。VB 代码使用字符串来指示编组器传递一个以空值结尾的字符串。根据经验,在 DLL 导入或导出中包含 Delphi 托管的 stype (如字符串)几乎总是错误的。
  3. 最后一个参数是通过引用传递的。那是一个 Delphi var 参数。
  4. 我认为返回值应该是 BOOL,但这可能不会给你带来麻烦。

像这样把它们放在一起:

function SFileOpenArchive(lpFileName: PAnsiChar; 
    dwPriority, dwFlags: Integer; var hMPQ: Integer): BOOL; 
    stdcall; external 'Storm.dll' index 266;

请注意,我不是 100% 确定文本编码是 ANSI。但是,对您来说主要的障碍是序数导入。我希望我已经为你清除了。我相信你可以解决剩下的细节。

于 2012-10-14T22:04:50.783 回答