用vb写了个dll(mydll.dll),其中有个export 的函数是
Public Function FunA(
    a As Integer,
    b As Integer
) As Long我用vc编程调用这个函数,
         HINSTANCE hDll=NULL,                               \\1
hDll=::LoadLibrary("mydll.dll");           \\2
typedef long (*pFun)(int a ,int  b  );        \\3
pFun Fun =(pMTAPIConnect)::GetProcAddress(hDll,"FunA");   \\4        long asd=0;       \\5
        asd=Fun(1,1);      \\6就在最后一步第六步 asd=Fun(1,1); 的时候出错了,调试的时候,前面 1-5部都正确,加载dll文件也成功,hdll也成功的分配到了地址,得到函数的地址也没有问题,就是在最后一部出错了,报错的提示是:
  The value of ESP wan not properly saved across a function call, This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention我想我C里面的声明并没有错啊!
请高手赐教!
另外,不是我不想给分啊,我实在是没有什么分了! 谢谢摆脱了!@@@@@@!!!!!!!

解决方案 »

  1.   

    typedef long (__stdcall *pFun)(int a, int b);
      

  2.   

    注意函数调用方式:
    typedef long (__stdcall *pFun)(int a, int b);
    或者
    typedef long (WINAPI *pFun)(int a, int b);
      

  3.   

    楼上两位正解,C语言下调用函数时,存在两种参数入栈方法。vc默认是__cdecl。
      

  4.   

    VB6还是VB.net记得VB6是不能导出函数的
    VB.net也不能导出函数的。
      

  5.   

    VB6还是VB.net 记得VB6是不能导出函数的 
    VB.net也不能导出函数的。楼上~~~~~~~~~~~~
    你直接说VB不能导出函数不就行了?
      

  6.   

    VB导出函数需要特殊处理,印象中在VB内部调用不会产生问题,但是外部调用还是或多或少会有一些问题。不知道楼主有没对这些函数做“预处理”,如果没有,那就只能按COM来调用。
      

  7.   

    果然用typedef long (WINAPI *pFun)(int a, int b)  就没有错误了,非常感谢啊!
    另外想问一下3楼的,__cdecl 和 WINAPI 有为什么不同吗?
      

  8.   

    WINAPI就是__stdcall,与__cdecl的区别在于前者是在函数返回的时候清栈,后者是函数返回后由调用者清栈。这个地方如果函数声明与实际代码不同,就会导致函数调用后栈指针(ESP)出错。