=======Pchar!!!!!!!!!!!I 服了 YOU============

lovefox_zoe 2005-07-21 02:12:18
今天改写一个DLL里面的string成pchar,痛苦啊!!!!!!!
于是开始研究,测试代码如下:

测试环境:D6
操作系统:WIN 2000 SP4

//传递pchar参数,然后返回pchar参数!!!
function TForm1.test(const str: PChar): Pchar;
var
s:string;
begin
s:=str;
result:=Pchar(s+#0);
//result:=Pchar(s);
end;

//测试功能1
procedure TForm1.Button2Click(Sender: TObject);
var
ss:string;
begin
ss:='11100';
E_Enc.Text:=test(Pchar(ss));//
E_Dec.Text:=test(Pchar(ss));//
end;


procedure TForm1.Button3Click(Sender: TObject);
var
sd:Pchar;
ss:string;
begin
ss:='22200';
sd:=test(Pchar(ss));
//ss:=sd;
E_Enc.Text:=sd;//
E_Dec.text:=sd;//
end;

测试1:
先点击Button2,编辑框E_Enc和E_Dec都是11100。这个结果正确。
然后点击Button3,怪事就来了。E_Enc显示22200--正确,E_Dec显示1110--错误。
再点击Button3,依然奇怪,E_Enc显示22200--正确,E_Dec显示2220--错误

===================
测试2:
pchar应该是一个指针,以0结尾,会不会把最后的0当成结束符号去掉了啊!我继续测试
把BUTTON2里面的SS修改为'111000',BUTTON3的SS修改为'222000'。

先点击Button2,编辑框E_Enc和E_Dec都是111000。这个结果正确。
然后点击Button3,怪事就来了。E_Enc显示222000--正确,E_Dec显示111000--错误。
再点击Button3,依然奇怪,E_Enc显示222000--正确,E_Dec显示222000--正确

我要抓狂了。难道奇数个字符就会错误,偶数个就不会?
还是PCHAR我没有管理好内存???于是我决定在一个函数的入口和出口的时候,
使用PCHAR,在内部处理使用STRING。

继续测试
=================================

测试3:
修改BUTTON3函数如下
procedure TForm1.Button3Click(Sender: TObject);
var
sd:Pchar;
ss:string;
begin
ss:='22200';
sd:=test(Pchar(ss));
ss:=sd;
E_Enc.Text:=ss;//
E_Dec.text:=ss;//
end;

这下E_Enc和E_Dec都显示正确了。

分析测试2和测试3的不同。在于使用PCHAR和STRING上。但既然SD是PCHAR类型,应该是指针,为什么赋值
两个edit后,会有不一样呢?原因一直分析不出来。

================================
求救:哪位大哥可以帮我分析PCHAR和string在使用上的不同和注意点,包括
把string类型的字符串转换为pchar作为参数传递进函数内部,并作为参数传递出来,
再转换为string有什么要注意的地方。

...全文
615 40 打赏 收藏 转发到动态 举报
写回复
用AI写文章
40 条回复
切换为时间正序
请发表友善的回复…
发表回复
lovefox_zoe 2005-07-26
  • 打赏
  • 举报
回复
那是不是每个dll里面都必需这样成对的使用GetMem和FreeMem的定义啊。

如果有多个dll程序A和B,其中A定义了FreeMem的过程B没有定义,在主程序
是不是A和B分配的内存,都可以调用A的FreeMem进行释放啊?????????
lovefox_zoe 2005-07-26
  • 打赏
  • 举报
回复
收到。感谢大哥。我再试试。
alphax 2005-07-26
  • 打赏
  • 举报
回复
//这段是你的加密dll的
////////////////////////-->
procedure FreeString(str: PChar); stdcall;
//这是释放函数
begin
FreeMem(Str);
end;

function Test(str: PChar): PChar; stdcall;
var
Len: Integer;
begin
Len := StrLen(str) + 1;
GetMem(Result, Len);
Move(str^, result, Len);
end;
////////////////////////<---


//这段是你的主程序的
//////////////////////////-->
procedure TForm1.Button2Click(Sender: TObject);
var
s: PChar;
begin
s := Test(E_Key.txt);
E_Enc.Txt := s;
FreeString(s);
end;

其他语言的情况,只要能支持stdcall调用约定就ok,释放的时候则必须调用Dll提供的释放函数
lovefox_zoe 2005-07-26
  • 打赏
  • 举报
回复
收到。多谢。揭帖。大哥,留个QQ给我吧。以后有问题多多指教啊。
alphax 2005-07-26
  • 打赏
  • 举报
回复
这样给你说吧,简单的情况,就是空间从谁那里分配来的,就调用谁的释放函数,

也就是你说的不对,A和B都应该提供释放函数,并且配对调用
lovefox_zoe 2005-07-25
  • 打赏
  • 举报
回复
楼上大哥,看到你的例子了。如果不同的开发程序如何释放DELPHI创建的内存空间?
alphax 2005-07-25
  • 打赏
  • 举报
回复
耶?前面我不是给你例子了么
lovefox_zoe 2005-07-25
  • 打赏
  • 举报
回复
楼上,这也可以?
小呆之家 2005-07-25
  • 打赏
  • 举报
回复
真是不服不行啊。嘎嘎....

//传递pchar参数,然后返回pchar参数!!!
function TForm1.test(const str: PChar): Pchar;

//var
//s:string;
begin

//s:=str;
result:=str;//----我认为就可以搞定了。^_^
//result:=Pchar(s);

end;
lovefox_zoe 2005-07-25
  • 打赏
  • 举报
回复
哪位大哥给个完整的例子,要求不能内存泄漏
lovefox_zoe 2005-07-25
  • 打赏
  • 举报
回复
Result:=SysGetMem(Length(str));

修改为:Result:=SysGetMem(Length(str)+1);
lovefox_zoe 2005-07-25
  • 打赏
  • 举报
回复
再次改进程序,但关键是,由delphi编写的dll程序创建的内存空间,其他开发工具比如vb、vc如何释放啊。能正确释放么?

=====================================
procedure TForm1.Button2Click(Sender: TObject);
var
ss: string;
p: PChar;
begin
ss := '测试';
p := Test(PChar(ss));
E_Enc.Text := p;
SysFreeMem(p);
end;

function TForm1.Test(lpInput: PChar): PChar;
var
s: PChar;
str:string;
begin
str:=lpInput;
str:=str + '我爱老婆d' + PARAM_FLAG + CMD_FLAG;
Result:=SysGetMem(Length(str));
strpCopy(result,str);

end;
Dalchemist 2005-07-24
  • 打赏
  • 举报
回复
看不懂
lovefox_zoe 2005-07-24
  • 打赏
  • 举报
回复
楼上,那会不会有内存泄漏啊。
弘石 2005-07-24
  • 打赏
  • 举报
回复
procedure TForm1.Button3Click(Sender: TObject);
var
////sd:Pchar;
ss,sd:string;
begin
ss:='22200';
sd:=test(Pchar(ss));
//ss:=sd;
E_Enc.Text:=sd;//
E_Dec.text:=sd;//
end;

这样就不会有错了,即在使用时先把pchar转换成String的,这样就不会每次使用时都进行转换而使结果发生变化
ahjoe 2005-07-24
  • 打赏
  • 举报
回复
楼主,我服了U
lovefox_zoe 2005-07-24
  • 打赏
  • 举报
回复
如何调用pchar有什么好的方法,大侠们给个例子吧。DLL啊。DLL,写DLL的pchar好痛苦~~~~~~~
lovefox_zoe 2005-07-23
  • 打赏
  • 举报
回复
继续学习中……
lovefox_zoe 2005-07-22
  • 打赏
  • 举报
回复
代码改进为这样,高手帮我看看使用的正确否

procedure TForm1.Button2Click(Sender: TObject);
var
ss:string;

begin
ss:='测试';
E_Enc.Text:=test(@ss[1]);//

end;

function TForm1.test(str: PChar): Pchar;
var
s:string;
begin
s:=str;
s:=s+'我爱老婆'+#0;
result:=pchar(s);
end;
Dainy 2005-07-22
  • 打赏
  • 举报
回复
关注。
加载更多回复(20)

5,392

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧