Dll中的Pchar(50分)

  • 主题发起人 主题发起人 hzjzxp
  • 开始时间 开始时间
H

hzjzxp

Unregistered / Unconfirmed
GUEST, unregistred user!
Dll中
function GetContent(handle:integer; buffer512:pchar):integer;
begin
{应该怎么对buffer512处理才能正常返回}
end;
在程序中调用
var
buffer :array [0..512]of char;
begin
GetContent(handle,buffer);
edit1.text:=StrPas(@buffer);
end;
我想用buffer存取Dll处理后的结果,
我在Dll中处理后,主程序老是不能正确返回,
还有就是我把主程序和Dll放到一个项目组里面,也不能在Dll中设断点!请问应该怎么做!
 
edit1.text := strpas(buffer);
edit1.text := strpas(@buffer);
都可以

处理的话,直接当作数组用啊

buffer512[0] := #10;
buffer512[1] := buffer512[10] ;
buffer512[2] := 'a';

最小 := low(buffer512);
最大 := high(buffer512);
 
你Dll中的buffer512要返回值,必须加var吧
function GetContent(handle:integer; var buffer512:pchar):integer;
begin
// 处理buffer512
end;
 
按楼上说的不行!
在Dll中对数组进行了赋值,但是strpas(@buffer)为空
 
var
buffer :array [0..512]of char;

修改为:
var
buffer : Pchar;
begin
GetMem(buffer, 513);
..........
freeMem(buffer);
end;
 
还是不行!老报错!!!!!
 
报什么错误, 请详细说说??
 
我把源代码放到网上了
delphi.ys168.com
Temp目录下的Dll压缩包!
谢谢!
 
LZ 在做广告 ...... 晕
 
To hzjzxp:
1、下载了楼主的程序,看完后一个感觉......
2、你在主程序中对 GetContent 的声明是:
procedure GetContent(buffer512: PChar); stdcall; external 'DllTest.dll';
而你在 uProc.pas 中实现 GetContent 时的声明却是:
procedure GetContent(var buffer512: PChar);
一个加了 stdcall,一个没加 stdcall,能对么??你要么两个声明都加 stdcall,要么都不加,两种方法都可以。不要以为那个什么狗屁 stdcall 是什么高科技,它仅仅告诉 windows 从右至左传递参数,没别的意思,不是说凡是用到 dll 就必须得加 stdcall。
3、至于楼上某位仁兄告诉你在 buffer512 加什么狗屁 var,你还真信了!加上 var 表示进行参数传递时只传递参数地址,而不传递参数的内容;你那个 buffer512 本身就是指针,你加个 var 表示把指针的地址传过去,修改的是指针本身而不是指针所指的内容,那能对么???
4、如果用不到 string,请把那些个狗屁 ShareMem 去掉,谢谢!
5、其它单元不用动,把 uProc.pas 单元改成下面的样子,就 OK 了:

unit uProc;

interface

procedure GetContent(buffer512: PChar); stdcall;

implementation

procedure GetContent(buffer512: PChar);
begin
buffer512[0] := '0';
buffer512[1] := '0';
buffer512[2] := '1';
buffer512[3] := '2';
buffer512[4] := '3';
end;

end.

6、另外,实际调用的时候,记得把申请的内存清零,如果内存不为零,很可能导致因为找不到以 0 结尾的字符串而无限制地读下去。
GetMem(buffer, 513);
FillChar(buffer^, 513, 0);
Edit1.Text := buffer;
FreeMem(buffer);
 
to:vvyang
谢谢你!经过你指点后,我知道了错误的所在!
 
多人接受答案了。
 
后退
顶部