我写了一个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的值成乱码了,相当于整个都往上错了一行,这咋解决呢

解决方案 »

  1.   

    传递指针
    PTrec=^Trec;
    function print_one(printrec:Trec):integer;stdcall; 
    改为
    function print_one(printrec:PTrec):integer;stdcall; 调用处要先分配空间
    New(PTrec);
    然后调用
      

  2.   

    回复bdmh
    指针我也试过,但是取出来是乱码,您能具体说清楚点吗?
      

  3.   

    Trec= Packed record
        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; 
    这样操作起来可能更方便些,
    不过赋值,取值可能稍麻烦点
      

  4.   


    你写Delphi程序的时候,尤其在DLL里面Borland是有说明不要再DLL文件中使用String类型
      

  5.   

    在结构休中要指定长度,
       name:String[10]; 
        sex:String[2]; 
        id:String[10];
    再传替指针试下 
      

  6.   

    回sonicer
    我把结构体中的类型全部改成integer,然后再试还是串行
      

  7.   

    测试了一下楼主的代码, 未发现楼主所说现象。建设检查一下DLL和调用程序中的Trec结构体申明是否一致, 结构体成员数量、成员申明的先后顺序都要一致。
      

  8.   

    回jadeluo
    DLL和调用程序中的Trec结构体肯定是一致的,我都是写一个,然后copy一个,你测的时候没往前串一个?
      

  9.   


    结构体成员数量是否一致。比如:调用程序中是这样申明的:
    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则未赋值(值为内存中的原值,可视为随机值),这样就会出现你所说的现象了。
      

  10.   

    感谢大家的回帖,特别谢谢jadeluo,
    由于实际的dll的函数有很多个入口参数,我刚开始把结构体放在最后面,
    导致串行,我刚把结构体放在参数的第一个,传入的就不会有串行了,也不知道是怎么回事。