希望用Pchar实现,不过我写的几个测试程序出现错误
解决方案 »
- 助记码代码咋写,想到就提问
- delphi中数据库中相关项目用treeview来显示?????或者是treeviw的一般用法
- 请高手指教,感激不尽!!!!!!!
- 大家觉的InterBase的库怎么样?
- strtocurr函数转化问题
- Fastreport中如何显示sql2000中的jpg格式图片字段?我已经将格式(btJpg)和字段设好,还是出错,听说要改个地方,不知在哪里?
- 请问:能这样使用参数吗?
- delete from tt where 编号='0001'怎么不能删除该条记录
- 今年想考个认证考试,大家给推荐推荐。
- 在delphi中怎么把一个长整型的数设为颜色值?我从其它非delphi控件获得的颜色值是长整型,但delphi的颜色值显然不是用长整型表示,请问这时候我怎样把这个长整型的数作为delphi中控件的背景色。
- ????怎么搞定????我在窗体外单击一下,窗体仍然具有焦点?
- DBNavigator1
方式,我想传递出一个pchar出来,程序如下
dll中的函数
function StringTest(out Pstr: Pchar): integer;
var
Str: string;
Chars: array[0..255] of char;
i: integer;
begin
for i:=1 to 255 do
begin
Chars[i] := #0;
end; Str := 'leetest'+#0;
for i:=0 to Length(Str) do
begin
Chars[i] := Str[i];
end; Pstr := @Chars;
end;
宿主程序部分:
procedure TForm1.Button1Click(Sender: TObject);
var
Msg: string;
PStr: Pchar;
begin
PStr := nil;
StringTest(PStr);
Msg := PStr;
ShowMessage(Msg);
end;
程序出现非法访问错误,经察看帮助得知是因为不能将函数中的局部变量的地址返回所至
帮助信息如下
A common error when working with PChars is to store in a data structure, or
return as a value, a local variable. When your routine ends, the PChar will
disappear because it is simply a pointer to memory, and is not a reference
counted copy of the string. For example:function title(n: Integer): PChar;
var
s: string;
begin
s := Format('title - %d', [n]);
Result := PChar(s); // DON'T DO THIS
end;This example returns a pointer to string data that is freed when the
title function returns.
现在想知道到底如何是正确的做法.
for i:=1to Length(Str) do
begin
Chars[i-1] := Str[i];
end;
StringTest(PStr);
dll的函数
function StringTest(out Pstr: Pchar): integer;
var
Str: string;
i: integer;
begin
Str := 'leetest';
StrPCopy(Pstr, Str);
end;
宿主程序部分
procedure TForm1.Button1Click(Sender: TObject);
var
Msg: string;
PStr: Pchar;
begin
getmem(PStr, 256);
StringTest(PStr);
Msg := PStr;
ShowMessage(Msg);
// FreeMem(Pstr, 256);
end;
现在的依然会有内存错误,不过变成了第1,3,5次点击会出错,第2,4,6次能显示数据,但是
只显示了'est',请继续指教,谢谢...
另外,如果加上FreeMem的那一句,会出'不正确的指针操作'这样的错误.