由于是半路出家,写起代码来比较随性。每次在写dll传递字符串时需要费很大的劲。
在这里来一个Demo演示一下:
dll代码:
library dlltest1;
uses
SysUtils,
Classes;
{$R *.res}
procedure fun1(p1: pchar; var p2: pchar); stdcall;
var
str: string;
begin
str:= p1;
p2:= PChar(str+str);
end;
procedure fun2(p1, p2: pchar); stdcall;
var
str: string;
begin
str:= p1;
StrCopy(p2,PChar(str+'#'+str));
end;
procedure Test(p: PChar); stdcall;
const
Title = 'Title ';
var
str: string;
begin
str := p;
StrCopy(p, Title);
StrCat(p, PChar(str));
end;
exports
fun1,
fun2,
Test;
begin
end.
测试程序代码:
procedure fun1(p1: pchar; var p2: pchar); stdcall; external 'dlltest1.dll';
procedure fun2(p1, p2: pchar); stdcall; external 'dlltest1.dll';
procedure Test(p: PChar); stdcall; external 'dlltest1.dll';
procedure TForm1.btn1Click(Sender: TObject);
var
p: pchar;
begin
fun1(PChar('123'),p);
ShowMessage(p);
end;
procedure TForm1.btn2Click(Sender: TObject);
var
arr: array of char;
str: string;
begin
SetLength(arr,100);
fun2(PChar('123'),@arr[0]);
str:= StrPas( @arr[0]);
showmessage(str);
setlength(arr,0);
end;
procedure TForm1.btn3Click(Sender: TObject);
var
p: PChar;
begin
Inc(num);
p := StrAlloc(255);
StrCopy(p, PChar(IntToStr(num)));
Test(p);
Text := p;
StrDispose(p);
end;
MoveMemory原型;
procedure MoveMemory(Destination: Pointer; Source: Pointer; Length: DWORD);
重点理解,string是字符数组,转化为指针的方式与一般数组一样:
procedure TForm1.btn2Click(Sender: TObject);
var
str,str2: string;
arr: array of char;
begin
str:= '123465';
SetLength(arr,length(str));
MoveMemory(@arr[0],@str[1],6);
str2:= StrPas(@arr[0]);
ShowMessage(str);
end;