Pchar 与String(50分)

  • 主题发起人 主题发起人 sess
  • 开始时间 开始时间
S

sess

Unregistered / Unconfirmed
GUEST, unregistred user!
PChar和String有什么不同,如何互相转换,动态连接传输字符串
建议用什么?
 
var
s:string;
p:pchar;
begin
s := 'test';
p := PChar(s);

p := 'test2';
s := strpas(p);
end;

动态连接强烈建议用pchar。要注意的是,这是传了一个地址,
最好是一个全局变量的地址,这样不会很快破坏掉,在dll中
接收的时候拷贝到自己分配的空间中。反之也一样。

 
pchar是c,c++里指向以空结尾的字符串的指针,如: 'aaaaa空'
string是pascal里的字符串类型,和pchar结构不同.
可以通过pchar(string)转换到pchar类型,pchar多用于调用windows api函数
 
做DLL,COM最好不要用String,
PCHAR在Windows中才是标准
 
//Pchar to string :
s:=StrPas(p)


//string to pchar :
p:=pchar(s);//进行强制转换。
//建议用:
getmem(p,length(s));
StrPCopy(p,s);
 
DFreamTiger:对不起,我昨天晚上发完,MAIL后就下班啦。请问,调用DLL和DLL程序中要不要对PCHAR重新分配内存?急!谢谢!
 
你可以看看:
http://www.gislab.ecnu.edu.cn/delphibbs/dispq.asp?LID=207101
这是我以前提的一个问题,里面有比较好的回答。
我当时是在dll中调用主程序中的函数,在主程序中调用dll函数也一样。
 
Pchar只是一个指针,如果只定义了一个Pchar变量,是不会分配内存的。
一般都将其指向一个字符数组来使用。
调用DLL传递的只是这个指针,当然不要重新分配内存。
 
:snowman2000:分配内存是不是在主程序分配的?
 
PChar就是个指针,String使用了引用计数技术,而且在首字节里有字符
串长度信息
 
>>分配内存是不是在主程序分配的?
>>调用DLL和DLL程序中要不要对PCHAR重新分配内存?
一个DLLs拥有自己的数据段(DS),因而它声明的任何变量都为自己所私有。调用它的模块不能直接使用它定义的变量。要使用必须通过过程或函数界面才能完成。而对DLLs来说,它永远都没有机会使用调用它的模块中声明的变量。

  一个DLLs没有自己的堆栈段(SS),它使用调用它的应用程序的堆栈。因此在DLL中的过程、函数绝对不要假定DS = SS。一些语言在小模式编译下有这种假设,但使用Delphi可以避免这种情况。Delphi绝不会产生假定DS = SS的代码,Delphi的任何运行时间库过程/函数也都不作这种假定。需注意的是如果读者想嵌入汇编语言代码,绝不要使SS和DS登录同一个值。

主程序的变量(包括全局变量),DLL是不能共享的,
但变量可以通过外部过程映入(Exports).
如果一定要主程序与DLL间共享变量,需要使用内存映射
(Memory ???)

另外,希望你给我加分(即使一分也好,我想留个纪念
毕竟,我打了非常多的字)
 
多人接受答案了。
 
后退
顶部