gpt4 book ai didi

从 Delphi XE 调用 Delphi 7 DLL

转载 作者:行者123 更新时间:2023-12-03 15:48:39 25 4
gpt4 key购买 nike

我需要在 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';

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

显然我不是在寻找实际的压缩/解压缩代码 - 我在 D7 中工作得很好。我想知道如何声明和使用 string/pchar 参数,因为我尝试的各种类型(PWideChar、WideString、ShortString 等)都会出错。

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

最佳答案

到目前为止,最简单的方法是使用 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 有吸引力的原因。

关于从 Delphi XE 调用 Delphi 7 DLL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11623707/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com