从Delphi XE调用Delphi 7 DLL

时间:2012-07-24 03:25:24

标签: delphi dll interface delphi-7 delphi-xe2

我需要在Delphi 7中包含一些遗留代码,以便在Delphi XE2中使用。我的问题似乎很简单,但我尝试了所有我能找到的例子,但都失败了。基本上,我需要能够在D7和DXE2之间传递字符串,据我所知,最安全的方法是使用pchar(因为我不想运送borlandmm dll)。 所以用D7编写的DLL,由Delphi XE2调用

我的界面需要

在我的DLL中:

function d7zipFile(pFatFile,pThinFile : PChar) : integer; stdCall;
function d7unzipfile(pThinFile,pFatFile : PChar) : integer; stdCall;

我需要在unzipfile函数中传递BACK pFatFile名称。

在我的主叫代码中:

function d7zipFile(pFatFile,pThinFile : PChar) : integer; external 'd7b64zip.dll';

function d7unzipfile(pThinFile,pFatFile : PChar) : integer; external 'd7b64zip.dll';

有人可以协助实施这些方法的最佳方法吗?

显然我不是在寻找实际的zip / unzip代码 - 我在D7中工作正常。我想知道如何声明和使用字符串/ pchar参数,因为我尝试的各种类型(PWideChar,WideString,ShortString等)都会出错。

所以我很乐意能够在d7zipFile函数中为两个文件名执行showMessage。 然后能够在pFatFile变量上的delphiXE2中执行showMessage,这意味着字符串可以双向运行吗?

1 个答案:

答案 0 :(得分:6)

到目前为止,最简单的方法是使用WideString。这是围绕COM BSTR类型的Delphi包装器。使用共享COM分配器完成字符串有效负载的动态分配。由于Delphi RTL管理它,它对您来说是透明的。

在Delphi 7代码中,您声明了这样的函数:

function d7zipFile(const FatFile, ThinFile: WideString): integer; stdcall;
function d7unzipfile(const ThinFile: WideString; var FatFile: WideString): 
    integer; stdcall;

在你的调用代码中,你声明了这样的函数:

function d7zipFile(const FatFile, ThinFile: WideString): integer; stdcall; 
    external 'd7b64zip.dll';
function d7unzipfile(const ThinFile: WideString; var FatFile: WideString): 
    integer; stdcall; external 'd7b64zip.dll';

此方法的替代方法是使用PAnsiCharPWideChar。请注意,您不能使用PChar,因为该别名引用了不同的类型,具体取决于您使用的Delphi版本。在Delphi 7中,PCharPAnsiChar的别名,而在XE2中,它是PWideChar的别名。

使用PAnsiChar的一大缺点是,调用者需要分配从DLL返回的字符串。但通常调用者不知道该字符串需要多大。该问题有多种解决方案,但最新的方法始终是使用共享分配器。您声明您不想依赖borlandmm.dll,因此下一个最明显的公共分配器是COM分配器。这就是WideString具有吸引力的原因。