天啊!!这个问题居然还没有收场???我本来这些天不打算在这儿回答问
题,因为我在做我的MainPage,更糟糕的是,我的系统受到网络Hacker攻击,
Format C:了。忙于整理系统的时候,还是被这200分给吸引了,毕竟,有银
子可拿是无比爽快的事啊!
======================================
1. 如果你的确可以用 acAddress: array[0..20] of Char;来传参数,那
么就可以肯定,你没有为pChar分配内存。
2. GetPrivateProfileString()的第四个参数是lpReturnedString,用于
返回结果串。如果你没有给这个LPTSTR(Delphi中用pChar)分配内存,则返
回为空,如果分配内存不足,将导致结果串不全。
3. 问题是为什么呢?pChar的定义只是一个Pointer!!这意味着,除一个地
址外,pChar本身不用于存放任何东西,也不存放字符串。要不你用sizeof(pChar)
看看就明白了。那可只有4个byte呀!!
4. 那么,pChar的字符串在那儿呢?它事实上被存放在以pChar指向的一个
不定长内存块中。以#0为这个串的结束标志。如果没有特殊指定,Windows
只在找到#0时就认为串结束,而不会如得到一个你所期望的字符串。
5. 我们致少有以下三种解决方法:
(1)在使用pAddress前分配内存,使用后释放内存。
StrSize := 20;
GetMem(pAddress,StrSize);
... //GetPrivateProfileString()调用
FreeMem(pAddress,StrSize);
(2)使用字符数组
const StrSize = 20;
var pAddress : pChar;
chrArr : Array [0..StrSize] of Char;
begin
...
pAddress := @chrArr;
... //GetPrivateProfileString()调用
end;
//这种用法中,Delphi会自动释放掉chrArr所用内存
(3) 直接使用字符串
在Delphi 3及以上版本中,支持Huge String,你可以直接将String
用成pChar(D2是否可以,我没有试过)。但是,你也要先给String指定一个长度。如下:
var sAddress : String;
StrSize : Integer;
begin
StrSize := 20;
SetLength(sAddress,StrSize);
GetPrivateProfileString('Host', 'Address', '127.0.0.1',
pChar(sAddress), StrSize, 'tPing.ini');
end;
6. 关于建议:
在上述三种方法中,第一种最安全,第三种是最方便的(因为你可以有一个
动态的buffer,并且,可以象String一样方便的用它),我推荐使用第三种方法。
WritePrivateProfileString()中的使用同上。但如果你采用第三种方法,
则只需要将字符串写到Host串中,用pChar(Host)作为入口参数就成了。不需要
再用SetLength()来指定串长。
使用第三种方法如果编译时提示字符串类型转换错误,则是因为你没有将"Huge
String"编译选项打开,可使用{$H+}编译符指定,或设置Project的Option。