我用vc设计了一个dll,vc和vb能正常调用该库,delphi调用时老出错,请大家帮忙看看.

                            
我的delphi代码如下,愿意帮忙的朋友留下E-mail或QQ,我给发过去。先谢谢了。   
  我的E-mail:forcal@sina.com   ,QQ:630715621    
   
  unit   Unit1;  
   
  interface  
   
  uses  
      Windows,   Messages,   SysUtils,   Variants,   Classes,   Graphics,   Controls,   Forms,  
      Dialogs,   StdCtrls;  
   
  type  
      Doubuf=array   of   double;  
      //动态调用动态库的函数类型声明  
      fcInitForcal=function:boolean   ;   stdcall;  
      fcGetRunErr=procedure(var   i:integer;var   str:Pchar;var   k:integer);   stdcall;  
      fcRealCom=function(a:Pchar;m:Longint;var   hFor:Longint;var   npara:Longint;var   para:Doubuf;var   ii:Longint;var   jj:Longint):integer;   stdcall;  
      fcRealCal=function(hFor:Longint;a   :DouBuf):double;   stdcall;  
      fcFreeForcal=procedure;   stdcall;  
  type  
      TForm1   =   class(TForm)  
          Memo1:   TMemo;  
          Memo2:   TMemo;  
          Button1:   TButton;  
          Button2:   TButton;  
          procedure   FormCreate(Sender:   TObject);  
          procedure   FormDestroy(Sender:   TObject);  
          procedure   Button2Click(Sender:   TObject);  
          procedure   Button1Click(Sender:   TObject);  
      private  
          {   Private   declarations   }  
      LibHandle:THandle;  
      public  
          {   Public   declarations   }  
      end;  
   
  var  
      Form1:   TForm1;  
   
      //定义要用到的函数,通过LoadLibrary   实现动态调用  
      InitForcal:fcInitForcal;  
      GetRunErr:fcGetRunErr;  
      RealCom:fcRealCom;  
      RealCal:fcRealCal;  
      FreeForcal:fcFreeForcal;  
   
  implementation  
   
  {$R   *.dfm}  
   
  //输出编译错误信息。  
  procedure   OutErr(iCode:Integer;ii,jj:Longint);  
  begin  
      case   iCode   of  
          1:Form1.Memo2.Text   :='内存分配失败!';  
          2:Form1.Memo2.Text   :='括号不成对!';  
          3:Form1.Memo2.Text   :='(等号后)没有表达式!';  
          4:Form1.Memo2.Text   :='复数表达式中不能使用i作为参数!';  
          5:Form1.Memo2.Text   :='字符串中转义字符错误!';  
          6:Form1.Memo2.Text   :='字符串无效,即"..."不匹配!';  
          7:Form1.Memo2.Text   :='不可识别字符!';  
          8:Form1.Memo2.Text   :='表达式名称定义错误!';  
          9:Form1.Memo2.Text   :='不可识别的自变量,自变量只能以字母或下画线开头!';  
          10:Form1.Memo2.Text   :='不可识别的自变量定义方法,“(,:,:,:,:,...)”冒号过多!';  
          11:Form1.Memo2.Text   :='自变量定义错误!';  
          12:Form1.Memo2.Text   :='continue()函数只能有0个参数!';  
          13:Form1.Memo2.Text   :='只能在while,until中使用continue函数!';  
          14:Form1.Memo2.Text   :='break()函数只能有0个参数!';  
          15:Form1.Memo2.Text   :='只能在while,until中使用break函数!';  
          16:Form1.Memo2.Text   :='if,while,until,which中的参数个数至少为2个!';  
          17:Form1.Memo2.Text   :='表达式中的数字错误!';  
          18:Form1.Memo2.Text   :='&单目取地址运算符只能用于单独的变量!';  
          19:Form1.Memo2.Text   :='单目运算符++、--错误!';  
          20:Form1.Memo2.Text   :='括号内没有数字!';  
          21:Form1.Memo2.Text   :='单目运算符+、-、!错误!';  
          22:Form1.Memo2.Text   :='赋值“=”错误!';  
          23:Form1.Memo2.Text   :='不正确的运算方式或其他语法错误!';  
          24:Form1.Memo2.Text   :='不可识别变量名!';  
          25:Form1.Memo2.Text   :='不可识别函数名!';  
          26:Form1.Memo2.Text   :='一级函数只能有一个参数!';  
          27:Form1.Memo2.Text   :='二级函数参数不匹配!';  
          28:Form1.Memo2.Text   :='模块中的表达式的自变量不能重新赋值!';  
          29:Form1.Memo2.Text   :='(模块中)表达式有重名!';  
          30:Form1.Memo2.Text   :='***未定义***!';  
          31:Form1.Memo2.Text   :='***未定义***!';  
          32:Form1.Memo2.Text   :='调用整数表达式时参数不匹配!';  
          33:Form1.Memo2.Text   :='调用实数表达式时参数不匹配!';  
          34:Form1.Memo2.Text   :='调用复数表达式时参数不匹配!';  
          35:Form1.Memo2.Text   :='自变量重名!';  
          36:Form1.Memo2.Text   :='其他错误!';  
          -1:Form1.Memo2.Text   :='在共享版中,编译表达式的长度受到限制!';  
      end;  
   
      //确定出错位置。  
      Form1.Memo1.SelStart:=   ii   -1;  
      Form1.Memo1.SelLength:=   jj   -   ii   +1;  
      Form1.Memo1.SetFocus;  
  end;  
   
  procedure   TForm1.FormCreate(Sender:   TObject);  
  begin  
   
      LibHandle:=LoadLibrary('forcal.dll');  
      if   LibHandle   =   0   then  
      begin  
          Button1.Enabled:=False;  
          Button2.Enabled:=False;  
          ShowMessage('找不到forcal.dll,请将该库放到Windows的搜索路径内。');  
          exit;  
      end;  
   
      //动态调用时得到函数地址  
      @InitForcal:=GetProcAddress(LibHandle,'InitForcal');  
      @GetRunErr:=GetProcAddress(LibHandle,'GetRunErr');  
      @RealCom:=GetProcAddress(LibHandle,'RealCom');  
      @RealCal:=GetProcAddress(LibHandle,'RealCal');  
      @FreeForcal:=GetProcAddress(LibHandle,'FreeForcal');  
   
      //判断这些函数指针是否有效。  
      if   ((@InitForcal=nil)   or   (@GetRunErr=nil)   or   (@RealCom=nil)   or   (@RealCom=nil)   or   (@RealCal=nil))   then  
      begin  
          FreeLibrary(LibHandle);  
          LibHandle:=0;  
          Button1.Enabled:=False;  
          Button2.Enabled:=False;  
          ShowMessage('forcal.dll中没有有效的输出函数!');  
          exit;  
      end;  
   
      if   InitForcal()=False   then  
      begin  
          FreeLibrary(LibHandle);  
          LibHandle:=0;  
          Button1.Enabled:=False;  
          Button2.Enabled:=False;  
          ShowMessage('forcal.dll初始化失败!');  
          exit;  
      end;  
   
      Memo1.Text:='请在此输入表达式!只能计算20个实数表达式!'+Chr(13)+chr(10)+  
                              '可在多行中输入表达式,表达式之间用分号“;”分隔。'+Chr(13)+chr(10)+  
                              '只计算无参表达式。有参数的表达式,只编译,不计算。'+Chr(13)+chr(10)+  
                              '重新初始化将清除以前的编译结果。'+Chr(13)+chr(10)+  
                              '注意:该示例程序较简单,不能退出无限循环!';  
      Memo2.Text:='在这里输出计算结果!';  
   
  end;  
   
  procedure   TForm1.FormDestroy(Sender:   TObject);  
  begin  
      if   LibHandle   <>   0   then  
      begin  
          FreeForcal();  
          FreeLibrary(LibHandle);  
      end;  
  end;  
   
  procedure   TForm1.Button2Click(Sender:   TObject);  
  begin  
      //重新初始化Forcal。  
      if   InitForcal()=False   then  
          begin  
              Button1.Enabled:=False;  
              Button2.Enabled:=False;  
              ShowMessage('重新初始化Forcal失败!');  
          end  
      else  
          begin  
              Memo2.Text   :='重新初始化成功!以前的编译结果已全部清除!';  
          end;  
  end;  
   
  procedure   TForm1.Button1Click(Sender:   TObject);  
  var  
      bEnd:Boolean;  
      iCode,iErr:integer;  
      i,j,ii,jj,lFor:Longint;  
      pch:Pchar;  
      perr:Pchar;  
      hFor:array[0..20]   of   Longint;  
      lPara:array[0..20]   of   Longint;  
      d:array[0..1]   of   double;  
      pD:Doubuf;  
  begin  
      pch:=Pchar(Memo1.Text);  
   
      //编译由分号隔开的各个实数表达式(最多20个)。  
      i:=0;   lFor:=-1;   bEnd:=False;  
      while   (bEnd=False)   and   (lFor<19)   do  
      begin  
          j:=i;  
          while   (pch[j]<>';')   and   (pch[j]<>Chr(0))   do   j:=j+1;  
          if   pch[j]=Chr(0)   then   bEnd:=True;  
          if   i=j   then  
          begin  
              i:=j+1;  
              continue;  
          end;  
          pch[j]:=Chr(0);  
          lFor:=lFor+1;  
          //先清除以前的运行错误。  
          GetRunErr(iErr,   perr,   iCode);  
          //编译表达式。  
          iCode:=RealCom(@pch[i],   0,   hFor[lFor],   lPara[lFor],pD,   ii,   jj);  
          if   bEnd=False   then   pch[j]:=';';  
          //输出编译错误。  
          if   iCode<>0   then  
          begin  
              OutErr(iCode,i+ii+1,i+jj+1);  
              exit;  
          end;  
          i:=j+1;  
      end;  
   
      Memo2.Text   :=   '';  
   
      //计算各个表达式,仅计算无参表达式:lPara(i)   =   -1。  
      For   i   :=   0   To   lFor   do  
      begin  
          If   lPara[i]   =   -1   Then  
          begin  
              d[0]:=RealCal(hFor[i],@d);  
              Memo2.Text   :=   Memo2.Text+Chr(13)+chr(10)+FloatToStr(d[0]);  
          end;  
      end;  
      //检查运行错误。  
      GetRunErr(iErr,   perr,   iCode);  
      If   iErr   <>   0   Then  
      begin  
          Memo2.Text   :=   Memo2.Text   +Chr(13)+chr(10)+  
                                      '出现运行错误!'+Chr(13)+chr(10)+  
                                      '函数名:'+perr+Chr(13)+chr(10)+  
                                      '错误代码:'+IntToStr(iCode);  
      end;  
   
  end;  
   
  end.  
 

查看回复