VC++作的dll,为什么在delphi中不用调用?(200分)

  • 主题发起人 主题发起人 screen
  • 开始时间 开始时间
S

screen

Unregistered / Unconfirmed
GUEST, unregistred user!
错误提示是:
不能连接myexe.exe 到vc++.dll中的myfunction.
保证不会有myfunction名字写错等弱智问题.
而且新建一个vc工程就能调用那个dll.
 
参数传递方式可能不一致。stdcall---->winapi
 
Example:
int stdcall FAR PASCAL sub(int);
 
Delphi缺省是用的fastcall,所以最好在引用时加上stdcall
 
1、将多Dll文件拷到Systems下;
2、在Implementation后调用就可以了例如:
Function CAN_Open():Integer;stdcall;external 'Win32can.dll' ;
3 、Delphi 支持五种调用模式:register、cdecl、pascal、stdcall和safecall。根据调用模式的不同,参数可以通过CPU的寄存器或堆栈传递给函数和过程。register模式使用CPU的三个寄存器传递参数,而其它模式则用堆栈来传递参数。在register和pascal模式下从左至右传递参数,即参数表中最左边的参数最先被求值并传递,而最右边的参数最后求值并传递。另三种模式cdecl、stdcall和safecall则从右至左传递参数。这些模式中除了cdecl外,都是由过程和函数在返回时清除堆栈中的参数,而对于cdecl模式,需由调用者在调用结束时清除堆栈中的参数。
  如何选择调用模式,有以下三条规则:
  1.Delphi 3.0使用register模式作为缺省调用模式以提高运行效率。
  2.如果有调用关系的几个模块是用不同语言编写的,其接口应使用stdcall模式。
3.如果要实现双界面函数和过程,应使用safecall模式。
  所以解决我们的问题只要选用stdcall模式即可,Schlumberger公司的《编程指南》上在Microsoft C环境下的DLL函数说明(仅举两例)为:
  void(FAR PASCAL *Imp_ Connect)(unsigned short far*,short far*);
  void(FAR PASCAL *Imp_ Init)(short far*,short far*);
  相应的在Delphi 3.0下DLL函数引入说明为:
  procedure Imp_ Connect(var CardAddress:word;var CardHandle:smallint);stdcall;
  procedure Imp_ Init(var Poll_Tab:smallint;var ErrorFlag:smallint;var CardHandle:smallint);stdcall;
 
应该是VC++做的DLL没有相应的MYFUNCTION输出,
如有条件可查DLL源码
或用其他开发工具(如VB)试一下能否正确调用,
如果能,则肯定是DELPHI中接口函数写错。
 
如果你用静态调用那么VC的lib在Delphi下不可用,必须用implib重新生成一个
lib,并且在dpr文件中在ALLLIB中加入此文件名。在调用时必须用__stdcall方式。
如果用动态调用那直接用就行了。
LoadLibrary---GetProcAddress----FreeLibrary。
 
各位所提问题我都注意了
可是奇怪的事情太多了
今天我重新编译了一下这个dll
然后运行我的程序,居然就可以了!!!!!!!
多谢各位捧场
 
后退
顶部