我已经在Stackoverflow上搜索了我遇到的问题,但它们都非常具体针对特定的访问冲突.
我认为我遇到问题的代码是一个名为MpqExtractFile存储在DLL中的函数.
功能:
function MpqExtractFile(var hMPQ: Integer; szToExtract, szExtracted: AnsiString): Boolean; stdcall; external 'MpqLib.dll' name 'B2';
Run Code Online (Sandbox Code Playgroud)
呼叫:
if MpqExtractFile(hMPQ, 'war3map.j', AnsiString(tempDir+'\war3map.j')) = True
then ShowMessage('Success.')
else ShowMessage('Failed.');
Run Code Online (Sandbox Code Playgroud)
执行此代码后,我的应用程序抛出访问冲突错误,因此ShowMessage根本不显示.
我不确定上述是否足以估计问题可能是什么,但如果还有什么我应该告诉我.
编辑
这是我一直在解释的VB.NET源代码的摘录:
Declare Function MpqExtractFile Lib "MpqLib.dll" Alias "B2" (ByVal hMPQ As Integer, ByVal szToExtract As String, ByVal szExtracted As String) As Boolean
Run Code Online (Sandbox Code Playgroud)
我显然不熟悉其他语言的声明,但我在声明VB函数的同一个VB文件中找到了下面的函数.
BOOL WINAPI MpqExtractFile(HANDLE hMpq, const char * szToExtract, const char * szExtracted);
Run Code Online (Sandbox Code Playgroud)
先谢谢你!
AnsiString是完全错误的类型,除非DLL在Delphi/C++ Builder中写入并实际用于AnsiString其参数.如果是这种情况,您需要知道DLL的编写版本是哪个版本的Delphi/C++ Builder,因为内存布局AnsiString在2009年发生了变化.
在任何情况下,跨DLL边界传递非POD数据是非常危险的,因此大多数DLL都不会这样做.有问题的参数最有可能PAnsiChar,例如:
function MpqExtractFile(var hMPQ: Integer; szToExtract, szExtracted: PAnsiChar): Boolean; stdcall; external 'MpqLib.dll' name 'B2';
Run Code Online (Sandbox Code Playgroud)
.
if MpqExtractFile(hMPQ, 'war3map.j', PAnsiChar(AnsiString(tempDir+'\war3map.j'))) then
ShowMessage('Success.')
else
ShowMessage('Failed.');
Run Code Online (Sandbox Code Playgroud)
其他要考虑的要点:
1)并非所有DLL都使用stdcall调用约定.对于用C语言编写的DLL,与许多开源库一样,使用cdecl调用约定的情况并不少见:
function MpqExtractFile(var hMPQ: Integer; szToExtract, szExtracted: PAnsiChar): Boolean; cdecl; external 'MpqLib.dll' name 'B2';
Run Code Online (Sandbox Code Playgroud)
2)C没有Boolean像Delphi和C++这样的真实数据类型.C代码使用Byte甚至Integer模仿a的情况并不少见Boolean.
为了在Delphi中使用DLL,您确实需要知道其导出函数的实际正确声明.这在C/C++中不是一个问题,因为大多数DLL都有一个附带的.h文件来提供声明.你有这样的.h文件吗?如果是这样,请在此处发布,以便有人可以验证您对Delphi的翻译.
更新:
根据新信息,正确的Delphi声明是这样的:
function MpqExtractFile(hMpq: THandle; const szToExtract, szExtracted: PAnsiChar): BOOL; stdcall; external 'MpqLib.dll' name 'B2';
Run Code Online (Sandbox Code Playgroud)