delphixe3调用C语言开发的dll接口中参数之间数据类型转换及处理

写这篇博客的原因:之前我是用delphi7开发,在调用c版的dll接口时从没有出现过问题,后来升级为delphixe3版本开发时,出现一些令人头疼的问题,我费了很大劲才解决。

Delphixe3出现如下问题:

delphixe3调用C语言开发的dll接口中参数之间数据类型转换及处理_第1张图片

举个例子:dll文件接口定义如下

int testDLLfun(unsigned char*a,unsigned long aLen,  unsigned char* b, unsigned long * bLen);

当Delphi调用该函数时,若在delphi7中char*对应的是pchar类型(delphi7中默认的pchar就是PAnsichar类型),而从delphi2010版本以上pchar类型默认指的是PWidechar,因此在delphixe3中我们要定义成PAnsichar类型,在这里我用的是静态调用dll的方式。

function  testDLLfun(a:PAnsiChar;aLen:Integer; b:PAnsiChar;bLen:pInteger):Integer;stdcall;  external'dllName.dll' name  'testDLLfun';

具体实现调用delphi中的testDLLfun方法如下

function test(const  aStr: AnsiString): String;
var aStr1:AnsiString;
bLen,retcode:Integer;
b:PAnsiChar;
bMemoryStream:TMemoryStream;
aBytes:TBytes;
begin
bMemoryStream:=TMemoryStream.Create;
try
bLen:=2048;
SetLength(aBytes,1024);
aBytes:= DecodeBase64(aStr);//base64解码
SetString(aStr1,PAnsiChar(aBytes),length(aBytes));//将解码的字节数组转成字符串
GetMem(b,  bLen);    
retcode:=testDLLfun(PAnsiChar(aStr1),Length(aStr1),b,@bLen);
bMemoryStream.Write(b^,blen);//将dll接口中的输出参数写入流里作为返回值输出
bMemoryStream.Position:=0;
Result:= bMemoryStream.DataString;
finally
Finalize(aBytes);
FreeMem(b);
bMemoryStream.Free;
end;
end;

由于我实现的功能中必须要经过base64解码后的参数传入testDLLfun中,我试了多种的delphi中自带的解码方法,出现乱码或字符长度不对的问题,导致调用testDLLfun失败,经过测试,只有DecodeBase64方法是可以成功,先转成字节数组,在转成string,但具体的原因我也解释不清,如果大家知道原因的,欢迎指教。

第一次发博,如有表达的不对或者想的不周到的,欢迎大家指出,我们一起进步。

你可能感兴趣的:(delphi)