此问题是 接口调用对方程序的 DLL 文件代码一执行到这里
       sucess := ExpenseCalc(YJtype, chr_lb
                            ,pchar(rq)
                            ,pchar(cb_name)
                            ,pchar(xulh)
                            ,pchar(card)
                            ,pchar(invono)
                            ,AppCode,DataBuffer);
就提示 external exception c0000008 这个错误
第一部分是 对方DLL 文件 函数的原型
第二部分是我声明的函数 和过程 问题是代码一运行到下面是对方DLL函数原型Syntax:
             Int  ExpenseCalc(int TransKind,
                              int MedKind,
                      char* SysDate,
                      char* UserName,
                      char* BillNo,
                      char* MedCardNo,
                      char* InHosNo,
               int* AppCode, 
                      char* DataBuffer)
Function ExpenseCalc(TransKind, MedKind : Integer; SysDate,UserName,BillNo, MedCardNo, InHosNo :Pchar;
              AppCode:PInteger;DataBuffer :Pchar):Integer;export;stdcall;far;external DllName name 'ExpenseCalc';procedure TFrmmin.GetYBExpenseCalc(YJtype,yb_lb: integer; HeadInfo: TTable; var sucess: Integer; var omt_msg: wideString);
var
  DataBuffer  :pchar;
  AppCode     :PInteger;
  s_str :String;
  chr_lb : integer;
  rq ,cb_name,xulh,card,invono  :String;begin
  try
     if yb_lb=0 then  chr_lb :=1
      else  chr_lb :=3;
     sucess := -1;
     GetMem(DataBuffer,8000);
     GetMem(AppCode,8);
     try             //  
      rq := formatdatetime('yyyymmddhhnnss',now);
      cb_name := HeadInfo.FieldByName('CB_NAME').AsString;
      xulh := HeadInfo.FieldByName('XULH').AsString ;
      card := HeadInfo.FieldByName('IC_CARD').AsString;
      invono := HeadInfo.FieldByName('InvoiceNo').AsString;
       sucess := ExpenseCalc(YJtype, chr_lb
                            ,pchar(rq)
                            ,pchar(cb_name)
                            ,pchar(xulh)
                            ,pchar(card)
                            ,pchar(invono)
                            ,AppCode,DataBuffer);       if  sucess =-1 then
       begin
          omt_msg := inttostr(AppCode^)+ strpas(DataBuffer)  ;
          DM_POS.InsertLogREcord(DM_POS.CHeadInfo.FieldByName('DKTID').asstring ,
                 DM_POS.CHeadInfo.FieldByName('xulh').asstring ,
                 '结获取信息',
                 strpas(DataBuffer) ,
                 'ExpenseCalc',
                 DM_POS.CHeadInfo.FieldByName('RIQI').asstring );
       end
        else  omt_msg := inttostr(AppCode^)+ strpas(DataBuffer);
     except
        omt_msg := '失败,请检查网络是否正常!:'+ strpas(DataBuffer);     end;
  finally
     FreeMem(DataBuffer,8000);
     FreeMem(AppCode,8);
  endend;

解决方案 »

  1.   

    我现在把这部分过程 改成这样子 还是提示 C0000008 的那个错误procedure TFrmPOS.GetYBExpenseCalc(YJtype,yb_lb: integer; HeadInfo: TTable;
      var sucess: Integer; var omt_msg: wideString);
    var
      DataBuffer,prq,pcb_name,pxulh,pcard,pinvono  :pchar;
      AppCode     :PInteger;
      s_str :String;
      chr_lb : integer;
      rq ,cb_name,xulh,card,invono  :String;begin
      try
         if yb_lb=0 then  chr_lb :=1
          else  chr_lb :=3;
         sucess := -1;
         GetMem(DataBuffer,8000);     GetMem(AppCode,8000);
         GetMem(prq,4000);
         GetMem(pcb_name,2000);
         GetMem(pxulh,2000);
         GetMem(pcard,5000);
         GetMem(PINVONO,4000);
         try             //  医疗类别--1 门诊 、2  住院、3 门诊慢性病(规定病种)、
          prq := pchar(formatdatetime('yyyymmddhhnnss',now));
          pcb_name := pchar(HeadInfo.FieldByName('CB_NAME').AsString);
          pxulh := pchar(HeadInfo.FieldByName('XULH').AsString) ;
          pcard := pchar(HeadInfo.FieldByName('IC_CARD').AsString);
          pinvono := pchar(HeadInfo.FieldByName('InvoiceNo').AsString);
           sucess := ExpenseCalc(YJtype, chr_lb
                                ,prq
                                ,pcb_name
                                ,pxulh
                                ,pcard
                                ,pinvono
                                ,AppCode,DataBuffer);
           if  sucess =-1 then
           begin
              omt_msg := inttostr(AppCode^)+ strpas(DataBuffer)  ;
              DM_POS.InsertLogREcord(DM_POS.CHeadInfo.FieldByName('DKTID').asstring ,
                     DM_POS.CHeadInfo.FieldByName('xulh').asstring ,
                     '结获取信息',
                     strpas(DataBuffer) ,
                     'ExpenseCalc',
                     DM_POS.CHeadInfo.FieldByName('RIQI').asstring );
           end
            else  omt_msg := inttostr(AppCode^)+ strpas(DataBuffer);
         except
            omt_msg := '发起结算交易失败,请检查网络是否正常!:'+ strpas(DataBuffer);     end;
      finally
         FreeMem(DataBuffer,8000);
         FreeMem(AppCode,8000);
         FreeMem(prq,4000);
         FreeMem(pcb_name,2000);
         FreeMem(pxulh,2000);
         FreeMem(pcard,5000);
         FreeMem(PINVONO,4000);
      endend;
      

  2.   

    1.没用过export这种写法,楼主去掉试试。
    2.stdcall=》cdecl试试
      

  3.   

    并且这个错误 只在 代码环境中运行提示  如果编译成EXE程序 就都正常
      

  4.   

    定義的有問題,一般在調用外部提供(比如說接口程序DLL或WEBSERCIVE...)一定約定好規則,這個DLL的聲明和調用是很簡單的,它最終返回了一個INT值而已可參考一下以下我定義的一個外部設備備口DLL聲明及定義,照著例子把自己的定義的修改一下試試看(一定要多動動手,我一下把定義的結果寫給你,你永遠都不會知道程序為什麼會這樣做?實際操作才能達到融匯貫通...function SDT_ReadBaseMsg(iPort:Integer;pucCHMsg:PChar;puiCHMsgLen:Integer;pucPHMsg:PChar;puiPHMsgLen:Integer;iIfOpen:Integer):Integer;stdcall;external 'sdtapi.dll';
      

  5.   

    引用到程序中定義大概是這樣:function Call_ExpenseCalc(TransKind:integer;MedKind:integer;SysDate:Pchar;UserName:Pchar;BillNo:Pchar;MedCardNo:Pchar;InHosNo:Pchar;AppCode:Pinteger;DataBuffer:Pchar):ingeger;stdcall;external 'ExpenSeCalc.dll';
      

  6.   

    D7 中 tools-> debugger options ->language exceptions 将stop on delphi exceptions 的对勾去掉 试试 呵呵