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

1 楼ly_liuyang(Liu Yang LYSoft http://lysoft.7u7.net)回复于 2006-12-23 14:20:00

PCHAR就一般不需要VAR修饰  
  Array   Of   是动态数组,本质上是指针,是Delphi的语法特征~用做DLL接口当然不行的  
   
  另外注意指针操作~  
  显然你这个错误就是指针用错所致Top

2 楼wlfc(tongan)回复于 2006-12-23 14:30:13

这台机器上没有装delphi,我只能回家时试一下,但家里的机器没上网,太不方便了.  
  不过程序能运行,就是释放空间时出错.下面是c++头文件,大家再帮忙看一下.  
  另:不知道c++中的"void   *"用delphi怎样表示?  
   
  ////////             FORCAL7.h             ///////////////////  
   
  ///////         常量及数据类型       ///////////////////  
   
  typedef   long   fcINT; //FORCAL的整数定义;  
   
  #define   FC_Key_User 256 //用户键值最小值;  
   
  #define   Key_IntFor 1 //整数表达式标志;  
  #define   Key_RealFor 2 //实数表达式标志;  
  #define   Key_ComplexFor 3 //复数表达式标志;  
  #define   Key_IntFunction 4 //整数函数标志;  
  #define   Key_RealFunction 5 //实数函数标志;  
  #define   Key_ComplexFunction 6 //复数函数标志;  
  #define   Key_IntArray 7 //整数数组标志;  
  #define   Key_RealArray 8 //实数数组标志;  
  #define   Key_ComplexArray 9 //复数数组标志;  
  #define   Key_Str 10 //字符串标志;  
  #define   Key_IntConst 11 //整数常量标志;  
  #define   Key_RealConst 12 //实数常量标志;  
  #define   Key_ComplexConst 13 //复数常量标志;  
   
  typedef   long   (_stdcall   *   fcIntFun)(fcINT   ,long   *,void   *); //FORCAL标准整数二级函数;  
  typedef   double   (_stdcall   *   fcRealFun)(fcINT   ,double   *,void   *); //FORCAL标准实数二级函数;  
  typedef   _complex   (_stdcall   *   fcComplexFun)(fcINT   ,_complex   *,void   *);//FORCAL标准复数二级函数;  
   
  //////////         输出函数       ///////////////////  
   
  //FORCAL版本信息  
  typedef   const   char   *   (_stdcall   *   fcForcalVer)   (void);  
  //初始化FORCAL  
  typedef   bool   (_stdcall   *   fcInitForcal)   (void);  
  //释放FORCAL动态库  
  typedef   void   (_stdcall   *   fcFreeForcal)   (void);  
  //获得FORCAL运行错误;执行了该函数后,将FORCAL恢复为无错状态  
  typedef   void   (_stdcall   *   fcGetRunErr)   (int   &,char   *&,int   &);  
  //测试是否有运行错误  
  typedef   int   (_stdcall   *   fcTestRunErr)   (void);  
  //设置FORCAL运行运行错误;字符串指针指出出错函数名  
  typedef   void   (_stdcall   *   fcSetRunErr)   (int   ,char   *,int   );  
   
  //编译实数表达式  
  typedef   int   (_stdcall   *   fcRealCom)   (char   *,fcINT   ,void   *&,fcINT   &,double   *&,fcINT   &,fcINT   &);  
  //计算实数表达式的值  
  typedef   double   (_stdcall   *   fcRealCal)   (void   *,double   *);  
   
  //编译整数表达式  
  typedef   int   (_stdcall   *   fcIntCom)   (char   *,fcINT   ,void   *&,fcINT   &,long   *&,fcINT   &,fcINT   &);  
  //计算整数表达式的值  
  typedef   long   (_stdcall   *   fcIntCal)   (void   *,long   *);  
   
  //编译复数表达式  
  typedef   int   (_stdcall   *   fcComplexCom)   (char   *,fcINT   ,void   *&,fcINT   &,_complex   *&,fcINT   &,fcINT   &);  
  //计算复数表达式的值  
  typedef   _complex   (_stdcall   *   fcComplexCal)   (void   *,_complex   *);  
   
  //设置外部二级函数  
  typedef   int   (_stdcall   *   fcSetFunction)   (int   ,char   *,void   *,fcINT   );  
  //设置常量  
  typedef   int   (_stdcall   *   fcSetConst)   (int   ,char   *,void   *);  
  //删除常量或二级函数  
  typedef   void   (_stdcall   *   fcDeleteConstOrFunction)   (int   ,char   *);  
   
  //根据表达式名称获得表达式信息  
  typedef   bool   (_stdcall   *   fcGetFor)   (char   *,int   ,void   *,void   *&,void   *&,fcINT   &);  
  //获得表达式中的所有字符串  
  typedef   void   (_stdcall   *   fcGetForStr)   (void   *,char   *&,fcINT   &);  
  //根据数组名称获得数组信息  
  typedef   bool   (_stdcall   *   fcGetArray)   (int   ,char   *,void   *&,long   &);  
   
  //删除一个表达式  
  typedef   void   (_stdcall   *   fcDeleteFor)   (int   ,void   *);  
   
  //用户插入一个键  
  typedef   int   (_stdcall   *   fcInsertKey)   (char   *,int   ,void   *,void   (_stdcall   *)(void   *),void   *&);  
  //用户查找一个键  
  typedef   void   *   (_stdcall   *   fcSearchKey)   (char   *,int   );  
  //用户删除一个键  
  typedef   void   (_stdcall   *   fcDeleteKey)   (char   *,int   );  
  Top

3 楼wlfc(tongan)回复于 2006-12-23 14:46:27

那位能将以下c++函数声明转换为delphi语法说明。先谢谢了。  
   
  typedef   long   fcINT;  
   
  bool   (_stdcall   *   fcInitForcal)   (void);  
   
  void   (_stdcall   *   fcGetRunErr)   (int   &,char   *&,int   &);  
   
  int   (_stdcall   *   fcRealCom)   (char   *,fcINT   ,void   *&,fcINT   &,double   *&,fcINT   &,fcINT   &);  
   
  double   (_stdcall   *   fcRealCal)   (void   *,double   *);Top

4 楼wlfc(tongan)回复于 2006-12-26 08:17:19

ly_liuyang(Liu   Yang   LYSoft   http://lysoft.7u7.net)   说得正确:  
   
      “Array   Of   是动态数组,本质上是指针,是Delphi的语法特征~用做DLL接口当然不行的”  
   
  就这一个错误,改了之后,程序能正常运行了。Top