在程序里调用了一个DLL,DLL一出错误程序就自动关闭了.用try....except好像也不可以,请知道的朋友指导下,谢谢了.

解决方案 »

  1.   

    DLL没有错误,可能是调用的问题
      

  2.   

    估计是调用规范(Call Convention)不“配套”的原因。多数Dll里的函数用的都是 stdcall,而Delphi默认的是
    register,这样必然导致进、出栈不对称。
      

  3.   

    调用方法,在dll程序的 run中打开,parameters  然后
      在host application中,选择要调用此动态连接库德程序可执行文件。
    在程序中就可以直接用F4   F7  F8  察看当前的调试位置,的错误,也可能是在调用是参数不对,或申明不对,仔细检查
      

  4.   

    zhengji(看雨飞) 用的就是stdcall调用的.
    还有其它的方法吗?
      

  5.   

    >>在程序里调用了一个DLL
    dll是不是你自己編的???如果是,不要引用主程序的 application.handle
      

  6.   

    一个新的问题,回答任何一个都可得分。
    在UNIT 名为:Upubic中定义了
    几个record大体情况如下:
    type
      DeliverStr = packed record
        .........   
     end;
    type
      MTRespStr = packed record
      .......
    end;
    type
      ReportStr = packed Record
        ......
    end;
    type
      MTErrStr = packed record
        .....
    end;
    还定义了一下出错信息提示....主程序UNIT 名为
    uses UPUBLIC;
    此程序调用DLL
    type TDeliverStr =^DeliverStr;
    type TReportStr  =^ReportStr;
    type TMTRespStr  =^MTRespStr;
    type TMTErrStr   =^MTErrStr;function Deliver
    (PackageType:PInteger;DeliverMessage:TDeliverStr;DeliverReport:TReportStr;DeliverResp:TMTRespStr;MTErrorStr:TMTErrStr):integer;stdcall;external '**.DLL' name 'Deliver';在TIMER事件中不断调用Deliver
    VAR
    nRet : integer;
    n:PInteger;
    test1:TDeliverStr;
    test2:TReportStr;
    test3:TMTRespStr;
    test4:TMTErrStr;
    begin
         Timer1.Enabled:=false;
         getmem(n,sizeof(n));
         getmem(test1,sizeof(DeliverStr));
         getmem(test2,sizeof(ReportStr));
         getmem(test3,sizeof(MTRespStr));
         getmem(test3,sizeof(MTErrStr));
         nRet:=Deliver(n,test1,test2,test3);
         FREEMEM(n,sizeof(n));
         FREEMEM(test1,sizeof(DeliverStr));
         FREEMEM(test2,sizeof(ReportStr));
         FREEMEM(test3,sizeof(MTRespStr));
         FREEMEM(test3,sizeof(MTErrStr));
    end;
    编译通过,但是调用Deliver提示信息为:Invailid Pointer operation.不知道参数定义哪里有问题请大家帮忙解决,这几天就要用的.谢谢大家了
    说下DELIEVER的函数情况:
    int  Deliver(int *type,DeliverStr* DeliverStruct,ReportStr* ReportStruct,MTRespStr* RespStruct,MTErrorStr* MTErrorStruct)
      

  7.   

    楼主带着眼镜??这样的错误都没看出来??     getmem(n,sizeof(n));
         getmem(test1,sizeof(DeliverStr));
         getmem(test2,sizeof(ReportStr));
         getmem(test3,sizeof(MTRespStr));
         getmem(test3,sizeof(MTErrStr));    《《《《----- 错了吧!!!
         nRet:=Deliver(n,test1,test2,test3);应该是:getmem(test4,sizeof(MTErrStr));
      

  8.   

    调Deliver调得也不对,少了一个参数,你怎么可能编译通过?怪了。nRet:=Deliver(n,test1,test2,test3, test4);
      

  9.   

    哦,以上是我写错了的.程序上是对的
          getmem(n,sizeof(n));
         getmem(test1,sizeof(DeliverStr));
         getmem(test2,sizeof(ReportStr));
         getmem(test3,sizeof(MTRespStr));
         getmem(test4,sizeof(MTErrStr));    
        nRet:=Deliver(n,test1,test2,test3,test4);
      

  10.   

    那个DLL不是你自己写的吗,可以在DLL里控制异常。
      

  11.   

    dll 不是自己写的,所以麻烦啊,请大家再次帮忙
      

  12.   

    折腾来折腾去,或许是那个 dll 本省就是错的吧,楼主看着办吧。有的错误,纵使 catch 住了,又有什么用? 难道是提示“对不起,程序编得不对”?