我用vc++中写的一个简单的dll,但在delphi中调用时总是出现找不到入口点的错误,我用delphi写了相同的dll,调用时就没有任何问题。函数声明为:
function add (x:integer;y:integer):integer;stdcall;external 'math.dll'调用为: Total := add(a,b)为什么?
function add (x:integer;y:integer):integer;stdcall;external 'math.dll'调用为: Total := add(a,b)为什么?
function add (x:integer;y:integer):integer;cdecl;external 'math.dll'
试试
VC++5.0支持的函数调用约定有多种,在这里仅讨论以下三种:__stdcall调用约定
、C调用约定和__fastcall调用约定。
__stdcall调用约定相当于16位动态库中经常使用的PASCAL调用约定。在32位的VC+
+5.0中PASCAL调用约定不再被支持(实际上它已被定义为__stdcall。除了__pascal外,
__fortran和__syscall也不被支持),取而代之的是__stdcall调用约定。两者实质上是
一致的,即函数的参数自右向左通过栈传递,被调用的函数在返回前清理传送参数的内
存栈,但不同的是函数名的修饰部分(关于函数名的修饰部分在后面将详细说明)。
C调用约定(即用__cdecl关键字说明)和__stdcall调用约定有所不同,虽然参数传
送方面是一样的,但对于传送参数的内存栈却是由调用者来维护的(也正因为如此,实
现可变参数的函数只能使用该调用约定),另外,在函数名修饰约定方面也有所不同。
__fastcall调用约定是“人”如其名,它的主要特点就是快,因为它是通过寄存器
来传送参数的(实际上,它用ECX和EDX传送前两个双字或更小的参数,剩下的参数仍旧
自右向左压栈传送,被调用的函数在返回前清理传送参数的内存栈),在函数名修饰约
定方面,它和前两者均不同。
关键字 __stdcall、__cdecl和__fastcall可以直接加在要输出的函数前,也可以在
编译环境的Setting...\C/C++ \Code Generation项选择。当加在输出函数前的关键字与
编译环境中的选择不同时,直接加在输出函数前的关键字有效。它们对应的命令行参数
分别为/Gz、/Gd和/Gr。缺省状态为/Gd,即__cdecl。
顺便说明一下,要完全模仿PASCAL调用约定首先必须使用__stdcall调用约定,至于
函数名修饰约定,可以通过其它方法模仿。还有一个值得一提的是WINAPI宏,Windows.
h支持该宏,它可以将输出函数翻译成适当的调用约定,在WIN32中,它被定义为__stdc
all。
建议:使用WINAPI宏,这样你就可以创建自己的APIs了。
在VC++中,函数是这样写的:MATH_API int add(int x, int y)
{
int num;
num = x + y;
return num
}