2008年7月9日星期三

关于在procedure中的Pchar参

Pchar是一个指针类型,他指向一个Char类型的指针相当于C语言中的 *Char类型。
pinteger也同样是指向一个整数的指针

前段时间,公司里面要使用一个用PB写的DLL,而他公开的参数是一个Pchar类型的,而且该参数的值需要返回。
但是他的声明类型中既没有加 Var也没有加Out来指定其为输出参数。现在我们来讨论一下,如何使Pchar类型的参数将使用后的值返回出来。
先看一个例子:
我们写一过程:
procedure SetInteger(ss: pinteger);
begin
ss^ := 3;
end;
然后我们调用
procedure Button1Click(Sender: TObject);
var
i: pinteger;
begin
SetInteger(@i); //设置i对应地址中的值为3了,此时i的值就为3了
end;
那么是否Pchar参数一样的返回呢?
我们写过程如下:
procedure SetPchar(p: pchar)
begin
p := '不得闲测试';
end;
然后同样的方法调用之,你会发现他并没有将结果 返回来,这是因为,你传递的时候指针指向一个地址,而当你使用了
p := '不得闲测试';
这个语句之后则p的指向为该字符串地址(他只是为地址赋值,却并没有复制值到该地址中来),但他本身地址并没有得到值,但程序返回的时候,其内部的字符串会自动释放的,所以在程序返回的时候,他本身指向的地址中的值并没有变,所以我们得不到正确的值。
此时我们如果能够将要返回的值复制到 P进入的时候的地址中的话,那么就能够得到正确的值了。此时最简单的一个方法就是使用StrLCopy函数。
所以函数改写如下:
procedure SetPchar(p: pchar)
begin
StrLCopy(p,'不得闲测试',10);
end;

此时我们在调用方式如下
var
p: pchar
begin
setPchar(p);
//此时的p则可以返回一个正确的值了.
end;

没有评论: