我写了一个DLL文件,里面调用了一个用C写的DLL
function CreateCard(cardNo,CustomNo,AppVer,startdate,enddate:pchar):integer;stdcall;
var
ret : integer;
srCardMK:string;
begin
  srCardMK:=‘000’;
  ret:=HDAPP_CreateCard_USER(CardNo,CustomNo,AppVer,StartDate,EndDate,srCardMK);//这个就是用VC写的
  srCardMK:=inttostr(ret);
  showmessage(srCardMK);
  result:=38684;
end;exports
  CreateCard;调用CreateCard.dll的时候执行到end;的时候,就报错了,

解决方案 »

  1.   

    HDAPP_CreateCard_USER的原型是什么样子的?我看你传入的都是PChar类似的参数,那么,开辟缓冲和释放缓冲这些工作调用者做了吗?
      

  2.   

    你的这个srCardMK参数,是string的,你跟vc写的dll穿str,他当然不认的.你有没有注意到dll向导里的那段注释的话
      

  3.   


        ret:=HDAPP_CreateCard_USER(CardNo,CustomNo,AppVer,StartDate,EndDate,pchar(srCardMK));//这个就是用VC写的 
    这个调用的时候都对的
    返回也对,一直执行到end;的时候,才报错
      

  4.   

    HDAPP_CreateCard_USER是别人写的,我没有原码。
      

  5.   

    改成 ret:=HDAPP_CreateCard_USER(CardNo,CustomNo,AppVer,StartDate,EndDate,PChar(srCardMK));试试,因为C++写的HDAPP_CreateCard_USER,字串参数不可能有Delphi的string字串!
      

  6.   

    function   CreateCard( var cardNo,CustomNo,AppVer,startdate,enddate:pchar):integer;stdcall;
    你可以试试看 
      

  7.   

     ret:=HDAPP_CreateCard_USER(CardNo,CustomNo,AppVer,StartDate,EndDate,PChar(srCardMK)); 
    我已经改成这样了,这个调用没有问题,因为已经有返回值了,我单步执行,一直到end;结束的时候,才报错。爱若琴弦说的方法我也试了,还不是行,晕啊。。
      

  8.   


    很久之前写一个网络方面的DLL,这个DLL动态库的作用也只是去把ws2_32.dll,Iphlpapi.dll
    等动态库中的一些好用的API提出来。那时候也有遇见这样的问题,到最后退出时才报错。最后解决的方法就是变量不要定义在函数的VAR下,而是定义成全局的,就解决了楼主不防把
       var
         srCardMK:string; 
    这个变量不要定义在函数中,而是定到到全局中。
    Syant J. Wang
      

  9.   

    Syant   J.   Wang
    我也放在全局了,还是不行是不是需要释放一下?对DLL不是太明白。
      

  10.   

    静态调用DLL不用你释放的,动态才需要释放。
    感觉应该还是在string上面,应该使用PChar,还有你主程序是怎么调用的?是不是调用的时候出现问题了,你把调用的代码也贴出来看看
      

  11.   

    procedure TForm1.Button1Click(Sender: TObject);
    var
    cardNo,CustomNo,AppVer,startdate,enddate:string;
    ret:integer;
    begin
        CardNo := '01234567890123456789' ;
        CustomNo :='123456';
        AppVer :='01';
        startdate := '20091010' ;
        enddate := '20091010' ;
        ret:=CreateCard(pchar(CardNo),pchar(CustomNo),pchar(AppVer),pchar(StartDate),pchar(EndDate));
        showmessage(inttostr(ret));
    end;主调用程序
      

  12.   

    function CreateCard(var cardNo,CustomNo,AppVer,startdate,enddate:pchar):integer;stdcall;
    var
    ret : integer;
    LibHandle:thandle;         //句柄
    DelPath   : TDllProc;      //定义过程入口指针
    begin
      LibHandle:=LoadLibrary('D:\test\WangCardApp.dll');   //装载WangCardApp.DLL文件
      if   LibHandle> 0   then
      begin
       try
         DelPath := GetProcAddress(LibHandle,PChar('HDAPP_CreateCard_USER'));
         srCardMK:='11330770015069761900291808985888';
         ret:=HDAPP_CreateCard_USER(CardNo,CustomNo,AppVer,StartDate,EndDate,srCardMK);
       finally
         FreeLibrary(LibHandle);   //释放WangCardApp.DLL文件
       end;
     end;
     result:=234;end;//输出函数card
    exports
      CreateCard;
    DelPath   ,指针在这个程序里有什么用?
    怎么执行到最后还是报错?