这是一个 DLL 的调用问题:/*********************************************定义 comm_value 结构
  type
      comm_value=packed record
      com_port:array [0..0] of char;
      dis_value:array [0..39] of char;
  end;
//********************************************* 定义 comm_value 结构//*********************************************定义 keyset_value 结构
  type
      keyset_value=packed record
      keyset:array [0..0] of char;
  end;
//********************************************* 定义 keyset_value 结构
//*********************************************定义 zone_value 结构
  type
      zone_value=packed record
      zone:array [0..1] of char;
  end;
//********************************************* 定义 zone_value 结构
//*********************************************定义 key_value 结构
  type
      key_value=packed record
      key:array [0..11] of char;
  end;
//********************************************* 定义 key_value 结构
//*********************************************定义 card_value 结构
  type
      card_value=packed record
      card_no:array [0..7] of char;
  end;
//********************************************* 定义 card_value 结构function  c_mread_card(var comm:comm_value;var keyset_info:keyset_value;
var zone_info:zone_value):smallint;stdcall; //读卡procedure TForm1.Button2Click(Sender: TObject);var
     i:integer;
     s1:string;
     s2:string;
     s3:string;
     comm_va:comm_value;
     keyset_va:keyset_value;
     zone_va:zone_value;
     ss:string;
begin
     s1:='4';
     s2:='0';
     s3:='04';     move(s1[1],comm_va.com_port[0],length(s1));
     move(s2[1],keyset_va.keyset[0],length(s2));
     move(s3[1],zone_va.zone[0],length(s3));
     i:=c_mread_card(comm_va,keyset_va,zone_va);
     ss:='123';end;可是单击 Button2 有错误,错误是在 ss:='123'处,去掉 ss:='123'; 就可以,
不过我想应该是 调用 i:=c_mread_card(comm_va,keyset_va,zone_va); 时引起了
地址错误,各位大哥是 dll 不行,还是我上面的调用语句不行啊?我是非常非常急啊,恳请各位大哥帮忙!谢谢!

解决方案 »

  1.   

    各位大哥在调用了 i:=c_mread_card(comm_va,keyset_va,zone_va); 后//************************会员卡充值***********************************
    ADOStoredProc1.Close;
    ADOStoredProc1.ProcedureName:='Pro_Cz_MemberCoin_MemberMessageTable';
    ADOStoredProc1.Parameters.Clear;
    try
       DataModuleForm.ADOStoredProc1.ExecProc;
       showmessage('ok');
    except
       showmessage('no');
    end;
    ****************************
    执行 上面的程序会有内存地址错误
    而 如果不用 try except end //************************会员卡充值***********************************
    ADOStoredProc1.Close;
    ADOStoredProc1.ProcedureName:='Pro_Cz_MemberCoin_MemberMessageTable';
    ADOStoredProc1.Parameters.Clear;
    DataModuleForm.ADOStoredProc1.ExecProc;****************************则没有上面的错误。各大哥,我都快要疯了啊~~到底哪里的问题啊?谢谢!
      

  2.   

    ?
    你的ss 在程序中并未用到啊!
    在你的工程文件中引用 ShareMem 试试哪个DLL参数太晦涩了...
      

  3.   

    可能性一: DLL里面访问     zone_va:zone_value;这个参数时,访问越界.
       造成内存中旁边的SS变量出错.
    可能性二: DLL调用约定没搞对...同样是影响堆栈...
      

  4.   

    先去检查DLL编写的代码吧.
    给你一个馊主意:
    如果下面这样还会出那样问题,估计就是你调用约定不对....仔细检查吧.
    如是不出问题,则是DLL代码里访问参数内存不对.var
    //因为这块内存是连续存放,于是在内存块两端放BUF1,BUF2隔离,可以保护访问越界不至于
    破坏其它部分.     buf1:array[1..1024]of char;
         comm_va:comm_value;
         keyset_va:keyset_value;
         zone_va:zone_value;
         buf2:array[1..1024]of char;procedure TForm1.Button2Click(Sender: TObject);
    var
         i:integer;
         s1:string;
         s2:string;
         s3:string;
         ss:string;
    begin
      

  5.   

    halfdream 大哥
    还是不行啊?
    还有什么办法吗?
    谢谢!
      

  6.   

    那多半是DLL库函数调用约定不对了.DLL里面,c_mread_card的函数声明是什么?