我写了一个dll,用来打印,此dll中的函数如下:
function print_one(printrec:Trec):integer;stdcall;
var
rec_xm:string;
rec_sex:string;
rec_id:string;
begin
rec_xm:=string(printrec.name);
rec_sex:=string(printrec.sex);
rec_id:=string(printrec.id);
//下面是一些打印操作
end;
Trec是一个结构体,内容如下:
Trec= Packed record
name:pchar;
sex:pchar;
id:pchar;
end;然后写一个程序调用此dll,调用的程序中有同样的一个结构体,调用前赋值如下:function print_one(printrec:Trec):integer;stdcall;
external 'print_one.dll';procedure TForm1.printClick(Sender: TObject);
var
rec1:Trec;
n:integer;
begin
rec1.name:=pchar('zhangsan');
rec1.sex:=pchar('男');
rec1.id:=pchar('123'); n:=print_one(rec1);end;跟踪进dll,这个赋值就出问题了
rec_xm的值为'男'
rec_sex的值为'123'
rec_id的值成乱码了,相当于整个都往上错了一行,这咋解决呢
function print_one(printrec:Trec):integer;stdcall;
var
rec_xm:string;
rec_sex:string;
rec_id:string;
begin
rec_xm:=string(printrec.name);
rec_sex:=string(printrec.sex);
rec_id:=string(printrec.id);
//下面是一些打印操作
end;
Trec是一个结构体,内容如下:
Trec= Packed record
name:pchar;
sex:pchar;
id:pchar;
end;然后写一个程序调用此dll,调用的程序中有同样的一个结构体,调用前赋值如下:function print_one(printrec:Trec):integer;stdcall;
external 'print_one.dll';procedure TForm1.printClick(Sender: TObject);
var
rec1:Trec;
n:integer;
begin
rec1.name:=pchar('zhangsan');
rec1.sex:=pchar('男');
rec1.id:=pchar('123'); n:=print_one(rec1);end;跟踪进dll,这个赋值就出问题了
rec_xm的值为'男'
rec_sex的值为'123'
rec_id的值成乱码了,相当于整个都往上错了一行,这咋解决呢
解决方案 »
- 如何使DATASET和另外一个DATASET一模样?
- fastreport 一个字段内容一页显示不下的解决
- 如何在DBGRID的各单元格,当数值发生变化时,执行一段代码呢,,不想在DataSet处理!
- QuickRep的分页问题
- 如何才能让程序自动区分繁体系统与简体系统?
- BDE与ORACLE连接
- 做Web Services的数据库访问遇到难题,搞了几天也无法解决,请大侠指点
- 求救:急!急!急!关于delphi中调用c函数的问题
- 为什么我的鼠标右键菜单在鼠标处于菜单的中间处弹出?
- 请问在Delphi中怎么调用动态生成的form?
- 关于Form关闭和调用问题
- 最后一次用Delphi,最后一次来Delphi版
PTrec=^Trec;
function print_one(printrec:Trec):integer;stdcall;
改为
function print_one(printrec:PTrec):integer;stdcall; 调用处要先分配空间
New(PTrec);
然后调用
指针我也试过,但是取出来是乱码,您能具体说清楚点吗?
name:pchar;
sex:pchar;
id:pchar;
end;
你结构体的三个元素都是指针,估计这才是问题的真正所在
Trec= Packed record
name:Array[0..10] of char;
sex:pchar[0..2] of char;
id:integer;
end;
这样操作起来可能更方便些,
不过赋值,取值可能稍麻烦点
你写Delphi程序的时候,尤其在DLL里面Borland是有说明不要再DLL文件中使用String类型
name:String[10];
sex:String[2];
id:String[10];
再传替指针试下
我把结构体中的类型全部改成integer,然后再试还是串行
DLL和调用程序中的Trec结构体肯定是一致的,我都是写一个,然后copy一个,你测的时候没往前串一个?
结构体成员数量是否一致。比如:调用程序中是这样申明的:
Trec= Packed record
name:pchar;
sex:pchar;
id:pchar;
end; 而DLL中是这样申明的:
Trec= Packed record
XXX: Pchar; //这里比调用程序中多了一个结构体成员
name:pchar;
sex:pchar;
id:pchar;
end; 那么,DLL中的XXX的值就是调用程序中的name, DLL中的name值就是调用程序中的sex, DLL中的sex是调用中的id, DLL中的id则未赋值(值为内存中的原值,可视为随机值),这样就会出现你所说的现象了。
由于实际的dll的函数有很多个入口参数,我刚开始把结构体放在最后面,
导致串行,我刚把结构体放在参数的第一个,传入的就不会有串行了,也不知道是怎么回事。