在delphi中调用dll后 显示成功,但运行到该函数的结尾end时 报错。

解决方案 »

  1.   

    附该函数源码:
    function gf_WritePurchase_Ex(iMode:integer;
      iDataFormat:integer;
      szID:string;
      dkWh:double;
      iTimes:integer;
      szDatetime:string;
      iParamFlag:integer;
      dPrewarningkWh:double;
      dWarningkWh:double;
      dCornerkWh:double;
      dMinUsekWh:double;
      dMaxOverDraftkWh:double;
      dMaxTickkWh:double;
      dMaxLoadkW:double;
      iMaxTripTimes:integer;
      iPTCT:integer;
      szPassword:string;
      dTickLoadThreshold:double;
      isw:integer;szmetermodel:string):integer;
    var
      ir:integer;
    begin
    try
      if (iMode=$D0) or (iMode=$B0) then begin
        if szmetermodel ='S' then
          ir:=IC_Purchase_D0_Ex(giPort,iDataFormat, PChar(szID), dkWh, iTimes , PChar(szDatetime),
                           iParamFlag, dPrewarningkWh, dWarningkWh, dCornerkWh, dMinUsekWh,
                           dMaxOverDraftkWh, dMaxTickkWh, dMaxLoadkW, iMaxTripTimes, iPTCT,PChar(szPassword), iMode, dTickLoadThreshold, isw)
        else
          ir:=IC_WritePurchase_D0_PS01(giPort,iDataFormat, PChar(szID), dkWh, iTimes , PChar(szDatetime),
                           iParamFlag, dPrewarningkWh, dWarningkWh, dCornerkWh, dMinUsekWh,
                           dMaxOverDraftkWh, dMaxTickkWh, dMaxLoadkW, dTickLoadThreshold,iMaxTripTimes,  PChar(szPassword), iMode,  isw);
      end else
        ir:=IC_Purchase_Ex(giPort,iDataFormat, PChar(szID), dkWh, iTimes , PChar(szDatetime),
                           iParamFlag, dPrewarningkWh, dWarningkWh, dCornerkWh, dMinUsekWh,
                           dMaxOverDraftkWh, dMaxTickkWh, dMaxLoadkW, iMaxTripTimes, iPTCT,PChar(szPassword), iMode, dTickLoadThreshold, isw);
      except
        ir:=-1;
      end;
      result:=ir;
    end;
      

  2.   

    什么样的错呢?很怀疑是string类型的形参造成的。加ShareMM
      

  3.   

    这段代码执行是可以正确执行的。但只要改动就会报错。即使你的改动完全没有意义。比如在此函数加一个参数。但我不用它执行ir:=IC_WritePurchase_D0_PS01就一定报错 执行 ir:=IC_Purchase_D0_Ex却不会。
    但ir:=IC_WritePurchase_D0_PS01执行是成功的 需运行到end.的时候才报错
    Access   violation   at   address   0x000000   in   module   'star.exe '.   Read   
      

  4.   

    请问下你调用dll的调用方式是什么你都没有写 当然在释放的时候就会报指针错误了 加上stdcall或是cdecl就可以了
      

  5.   

    LZ不要被报错的位置迷惑了,感觉问题应该出现在内存的使用上,使用了不该使用的内存等,这些问题在dll释放时暴露出来,所以才会在end时弹出错误,还是把主要代码贴出来看看吧
      

  6.   

    代码太多 我吧调用方式发出来
    function IC_WritePurchase_D0_PS01(iport: Longint; iDataFormat:integer; pszID:PCHAR; dkWh:double; iTimes:integer; pszDateTime:PCHAR; iParamFlag:integer; dPrewarnningkWh:double; dWarnningkWh:double; dCornerkWh:double; dDayFee:double; dMaxOverDraftkWh:double; dMaxTickkWh:double; dMaxCurrent:double; dSpecialMaxCurrent:double;iMaxTripTimes:integer;  pszPassword:PCHAR; iCalcuMode:integer;  var isw:integer): Longint;
                                stdcall; external 'starcpu2.dll';
      

  7.   

    问题在于它本身是可以的。现在这个函数所在的unit 我改变了另外一个函数一样执行到这里也出错啊。
    郁闷得想死。
      

  8.   

    当然我改变的那个函数在此函数前被调用了。这个unit 全部都存放的调用该dll的函数。问题是我只是做一个完全不影响现在执行环境的改动。就如加一个参数,却不用它。而且我是改变另外一个函数哦。而且一旦出错。我改回去。让代码完全和以前一样。还出错。 只能说太诡异。