我认为,去掉程序中所有的@那么就对了。
procedure TForm1.Button1Click(Sender: TObject);
var
pS : PChar;
Str : string;
begin
try
try
pS := StrAlloc(100);
StrPCopy(pS,'ABCDEF');//必须这样写,不能去掉'@'
Str := PChar(pS);
ShowMessage(Str);
except end;//except
finally
StrDispose(pS);
end;//finally
end;
procedure TForm1.Button1Click(Sender: TObject);
var
pS : PChar;
Str : string;
begin
try
try
pS := StrAlloc(100);
StrPCopy(pS,'ABCDEF');//必须这样写,不能去掉'@'
Str := PChar(pS);
ShowMessage(Str);
except end;//except
finally
StrDispose(pS);
end;//finally
end;
解决方案 »
- windows路由NAT功能中 远程访问客户端的获取办法
- 请教关于多线程与图象处理的问题?
- 出了奇怪的事了,不知道是什么原因,请高手相助,谢谢
- sql server2000 导出数据到excel时数据类型的控制问题!!!在线高分等!!!
- sql语法求助
- 有武汉愿意交流的程序员吗?有空成立组织或工作室吧
- 关于delphi的ide的一个小bug?
- c/s数据库mis制作安装盘时,数据库里的存储过程,触发器什么的,怎么版?倒出来?怎么到?
- 是不是我的regsvr32出了问题?
- 征求关于“DELPHI6新特性”、“DELPHI6的IDE”、“DELPHI的历史”的稿件
- 高手请进,有分送!!!!!
- 请教高手三个问题!!!
StrPCopy(pS,'ABCDEF');//必须这样写,不能去掉'@'
Str := pS;
ShowMessage(Str);
WinPath: PChar;
begin getmem(WinPath,256);//获得内存,没有使用StrAlloc();
.....
freemem(WinPath,256);//释放内存
end;
你试试看
procedure test(var S :pchar);
begin
strpcopy(s,'ABCD')
//关键在这句,如果这样写,D5,VB都可以得到正确的返回值,但PB得不到正确结果,
//修改成 strpcopy(@s,'ABCD')PB就对了,但D5 在释放的时候就出错了
end;
就是这样一个问题
希望大虾们多多帮助,谢谢
因为,过程和函数的局部变量是在堆栈中的,你这样直接改指针的内容,就把堆栈给改了,而且改写字节数是字符串长度+1,运行时就不能找到返回地址,当然要出错了。是不可能运行正确的。
StrPCopy(@pS,'ABCDEF')改变了指针的指向的值,已出现越界。
后面释放当然有问题。
StrAlloc申请的内存还是用StrDispose释放吧。
“我做的东东必须这样写”,我不知道你到底要干吗,明显是错的嘛。
这个函数是给PB使用的。而PB在传S参数时,应该传给一个已经分配了空间的指针。所以,DELPHI中最好不用分配和释放空间。如果你分配了空间,而在没有返回前就释放掉,PB使用这个值将是很危险的,会产生奇怪的结果。如果PB部分也是你做,就好说了。
to disney(编程乐园),hellion:
难没什么好办法了吗,我也不想这样用strpcopy可没办法,我写的Dll最终是要由pb调用的,别的方法我都试过了,好象只能这样写
Dll中的代码如下
procedure Test(Var s :pchar); stdcall;
begin
//一个最简单的例子,返回一个串
strpcopy(s,'ABCDEF');//D5,Vb对,PB接收不到返回值
//修改成strpcopy(@s,'ABCDEF');PB 对了,VB,D5 出错
end;
我的Dll是为PB程序编写的,只要PB能用就行。我明天就要交工了,大家救命啊!
哪位用过PB的高人遇到过这种情况?
听我一句话,千万别用。
管理内存,最好用C。
回复人: victorlee_lq(victor) (2001-9-13 15:22:37) 得0分
我在这里大声疾呼 "PB 是垃圾!!!"
去掉这句的@
getmem(P,256);
strcopy(P,pchar('hdfdgdf'));
freemem(P)
这不是用什么工具的问题,c的程序员用不好也会出错。指针内存的操作在于程序员的水平不在于工具,pascal操作内存不比c差。
myrec=record
buff:array[1..n] of char;
end;
procedure test(var S :myrec);
begin
strmove(@s.buff,'ABCD',sizeof('abcd'));
end;