dll中定义
extern "C" __declspec(dllexport) double __stdcall Calculate(
        char *expression,double *parameter, char *ParaName,
        int size, int &error);
调用定义
typedef double (WINAPI Calculate)(char *,double *,char *, int,int&);
Calculate *pCalculate;引用
VERIFY(m_hInstance=::LoadLibrary("Calculate.dll"));
VERIFY(pCalculate=(Calculate*)::GetProcAddress(m_hInstance,"Calculate"));在这里出现错误,不能引出dll函数。但如果dll中函数定义改为
extern "C" __declspec(dllexport) double Calculate(
        char *expression,double *parameter, char *ParaName,
        int size, int &error);
去掉__stdcall,运行正常。为什么?我必须要用__stdcall,因为dll要有Dephi调用

解决方案 »

  1.   

    Dephi俺不懂,摘录点冬冬你看看:__stdcall调用约定相当于16位动态库中经常使用的PASCAL调用约定。在32位的VC++5.0中PASCAL调用约定不再被支持(实际上它已被定义为__stdcall。除了__pascal外,__fortran和__syscall也不被支持),取而代之的是__stdcall调用约定。两者实质上是一致的,即函数的参数自右向左通过栈传递,被调用的函数在返回前清理传送参数的内存栈,但不同的是函数名的修饰部分(关于函数名的修饰部分在后面将详细说明)。_stdcall是Pascal程序的缺省调用方式,通常用于Win32 Api中,函数采用从右到左的压栈方式,自己在退出时清空堆栈。VC将函数编译后会在函数名前面加上下划线前缀,在函数名后加上"@"和参数的字节数。
      

  2.   

    o_racle(璐璐) ( ) 
    你说的我也看过,关键是不能引出dll函数。
    dll函数要用__stdcall调用才能由其他语言调用。我的dll是用VC做的,测试TestDll也是用VC做的。
    dll函数用__stdcall,测试的TestDll就不能引出dll函数。如果dll函数没有用__stdcall,使用C的__cdecl,测试的TestDll就可以引出dll函数。
      

  3.   

    默认的调用约定是_cdecl
    delphi默认调用约定是_stdcall
    同样的调用约定就没问提
      

  4.   

    是VERIFY(pCalculate=(Calculate*)::GetProcAddress(m_hInstance,"Calculate"));
    发现pCalculate=0x00000000;
    是这里就有问题了。
    用__cdecl就没有问题。我觉得是没有找到dll中函数名.
      

  5.   

    用DUMPBIN.exe这个工具查一下
    dumpbin your.dll
    看是否dll中有这样的入口地址表
      

  6.   

    dumpbin 怎么用啊?我在开始菜单中的运行出键入dumpbin calculate.dll找不到文件"dumpbin"(或它的组件之一)。请确定路径和文件名是否正确,而且所需的库文件可用    //错误信息。我用的是W2k。