自已写DLL及调用DLL的程序,DLL的一个函数有一个输入参数和一个PCHAR型输出参数,下面是我写的,我的本意是按下按键后显示27个“t”,(但调用部分的函数输出参数P1不用VAR关键字)。怎么不成功?我对指针不熟,请大家帮试一下。
//DLL 部分:---------------
procedure getp(aa:integer;var p1: pchar);
var
i: integer;
//mybytearray: array [0..27] of char;
begin
{for i := 0 to 27 do
mybytearray[i] := 't';
p1 := @mybytearray; 这样也不行}
for i := 0 to 27 do
p1[i] := 't';
end;
exports
getp;
//调用DLL 部分:---------------
procedure getp(aa:integer;p1: pchar); stdcall;external 'dllf.dll'; //此处不用VAR p1:Pchar
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
i: integer;
array2: array [0..27] of char;
begin
getp(2,array2); //请不要改变array2的定义及此句
label1.Caption := '';
for i := 0 to 27 do
label1.Caption := label1.Caption array2[i];
end;
gzmhero(hihihi) 于 2005-3-4 12:37:58getp函数中:
for i := 0 to 27 do
mybytearray := 't';
// p1 := @mybytearray;////这里不对,mybytearray是函数的局部变量,函数返回,变量会释放.而这里的赋值是把指针p1指向了mybytearray。改成下面这样把变量mybytearray的内容拷贝到指针p1指向的空间里,就可以了。
copymemory(p1,@mybytearray,27);
end;
stall(蜡笔小新) 于 2005-3-4 13:06:36试了一下gzmhero的方法,好像编译通过了,但按下按键后系统提示出错。
(另外补充一下,在前面我的意思可能没讲清楚,我是想调用函数的程序不变,改DLL来实现我的功能。谢了)
xwhope(烟火) 于 2005-3-4 13:10:24getp里的那个参数,aa是整什么用呢?
wuyu1981(方圆) 于 2005-3-4 13:14:52copymemory(p1,@mybytearray,27);=> copymemory(p1,@mybytearray,28);
gzmhero(hihihi) 于 2005-3-4 13:39:02对,没看,长度有问题,应该拷贝28个字节的数据就可以了。
stall(蜡笔小新) 于 2005-3-4 14:06:28已经试过了,用28也不行呀。另外AA是另一个输入变量,为了方便,用到它的地方我没贴上来。
gzmhero(hihihi) 于 2005-3-4 14:33:44dll做修改就行了:
procedure getp(aa:integer;var p1: pchar);
var
----------------------->>>>>>>>>>>>>>>>
procedure getp(aa:integer;var p1: pchar);stdcall;
var
gzmhero(hihihi) 于 2005-3-4 14:35:50或者改成:关键是stdcall,参数的顺序要和调用的函数一致,否则会地址异常。
procedure getp(aa:integer;p1: pchar);stdcall;
var
i: integer;
mybytearray: array of char;
begin
setlength(mybytearray,28);
for i := 0 to 27 do
mybytearray[i] := 't';
copymemory(p1,mybytearray,28);
end;
stall(蜡笔小新) 于 2005-3-4 15:20:26成了,多谢gzmhero,
另外:但不知为何
var
i: integer;
mybytearray: array [0..27] of char; 编译却通不过
gzmhero(hihihi) 于 2005-3-4 15:25:21那就要
copymemory(p1,@mybytearray,28);
caiso(十年磨一剑) 于 2005-3-4 15:30:15顶一下