我需要在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,这意味着字符串可以双向运行吗?
答案 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';
此方法的替代方法是使用PAnsiChar
或PWideChar
。请注意,您不能使用PChar
,因为该别名引用了不同的类型,具体取决于您使用的Delphi版本。在Delphi 7中,PChar
是PAnsiChar
的别名,而在XE2中,它是PWideChar
的别名。
使用PAnsiChar
的一大缺点是,调用者需要分配从DLL返回的字符串。但通常调用者不知道该字符串需要多大。该问题有多种解决方案,但最新的方法始终是使用共享分配器。您声明您不想依赖borlandmm.dll
,因此下一个最明显的公共分配器是COM分配器。这就是WideString
具有吸引力的原因。