3

我需要在 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 函数中传回 pFatFile 名称。

在我的调用代码中:

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

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

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

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

所以我很高兴能够简单地在 d7zipFile 函数中为两个文件名做一个 showMessage 。然后能够在 delphiXE2 中对 pFatFile 变量执行 showMessage,这意味着字符串双向都可以吗?

4

1 回答 1

6

到目前为止,最简单的方法是使用WideString. 这是 COMBSTR类型的 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';

这种方法的替代方法是使用PAnsiCharor PWideChar。请注意,您不能使用PChar,因为该别名根据您使用的 Delphi 版本引用不同的类型。在 Delphi 7PChar中是 的别名PAnsiChar,在 XE2 中是 的别名PWideChar

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

于 2012-07-24T08:41:48.547 回答