我用vc++中写的一个简单的dll,但在delphi中调用时总是出现找不到入口点的错误,我用delphi写了相同的dll,调用时就没有任何问题。函数声明为:
 function add (x:integer;y:integer):integer;stdcall;external 'math.dll'调用为: Total := add(a,b)为什么?

解决方案 »

  1.   

    改成
    function add (x:integer;y:integer):integer;cdecl;external 'math.dll'
    试试
      

  2.   

    function add (x:integer;y:integer):integer;safecall;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了。
      

  3.   

    两位说的我试过了,不可以,出现同样的错误。事实上,在VC++中定义了一个宏。
    在VC++中,函数是这样写的:MATH_API int add(int x, int y)
    {
      int num;
      num = x + y;
      return num
    }