如何通过Dll传递string类型的值。。。

dead_lee 2002-11-13 01:44:48
希望用Pchar实现,不过我写的几个测试程序出现错误
...全文
147 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
dead_lee 2002-11-13
  • 打赏
  • 举报
回复
我修改程序成这个样子...
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的那一句,会出'不正确的指针操作'这样的错误.
newyj 2002-11-13
  • 打赏
  • 举报
回复
getmem(PStr,256);
StringTest(PStr);

newyj 2002-11-13
  • 打赏
  • 举报
回复
Str := 'leetest'+#0;
for i:=1to Length(Str) do
begin
Chars[i-1] := Str[i];
end;
dead_lee 2002-11-13
  • 打赏
  • 举报
回复
我想写一个dll供其他程序调用,其中需要传递字符串出来,由于pascal对于string的处理
方式,我想传递出一个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.
现在想知道到底如何是正确的做法.
sunon 2002-11-13
  • 打赏
  • 举报
回复
我也有这样的问题.

5,388

社区成员

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

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