VB中调用VC编写的DLL函数参数类型不匹配错误!VC程序如下:/***********//Test1.cpp/*********** #include "stdafx.h"#include "Test1.h" TEST1_API int Max(int a,int b){       return (a>b)?a:b;} TEST1_API int test(){       return 56;}/***********//Test1.h/***********#ifdef TEST1_EXPORTS#define TEST1_API extern "C" __declspec(dllexport)#else#define TEST1_API extern "C" __declspec(dllimport)#endif TEST1_API int Max(int a,int b);TEST1_API int test(); 在工程设置的预编译里定义TEST1_EXPORTS VB程序如下:Module文件:Public Declare Function Max Lib "Test1.dll" (ByVal a As Long, ByVal b As Long) As IntegerPublic Declare Function test Lib "Test1.dll" () As Integer 正文程序:Private Sub Command1_Click()Dim c As Integerc = Max(25, 36)End Sub 运行时产生如果调用Max()函数产生Run-Time error'49': Bad DLL calling convention的错误。但调用test函数则正常。用depends工具能看到导出的函数,并且DLL文件也已经放到windows目录下 请问是哪里出问题了?曾经把(ByVal a As Long, ByVal b As Long)这里换成了好几种数据类型都不行,真是没办法了!

解决方案 »

  1.   

    还有就是在VC中导出DLL函数时还是不明白什么时候要加_stdcall??extern "C"和_stdcall分别是怎么用的?举例比如在VC里面定义的DLL函数在VC和VB中调用是否都要加这个?还有加了_stdcall后函数的名字跟原来不同了,函数名字多了一些-@类似的修饰,在调用的时候还是直接写函数名么?
      

  2.   

    TEST1_API int Max(int a,int b)
    =>
    Public Declare Function Max Lib "Test1.dll" (ByVal a As Long, ByVal b As Long) As LongTEST1_API int test()
    =>
    Public Declare Function test Lib "Test1.dll" () As Long导出函数的时候建议还是用.def文件,这样就不必担心那些c编译器自己加修饰符的问题了.__stdcall修饰符可以表明函数的调用模式,一般api都是用__stdcall的
      

  3.   

    TEST1_API int Max(int a,int b)
    =>
    Public Declare Function Max Lib "Test1.dll" (ByVal a As Long, ByVal b As Long) As Long这样还是不行啊,还是提示同样的错误!!!但那个不带参数的函数
    TEST1_API int test()
    =>
    Public Declare Function test Lib "Test1.dll" () As Long
    调用就正常。还是找不出原因!!!!
      

  4.   

    @是VC编译器添加的。通过DEF修正后,调用直接写原来名称就行。VC中默认采用__cdecl,建议
    采用__stdcall方式,这样Delphi等可正常调用...
      

  5.   

    __cdecl、__stdcall、__fastcall等等属于函数调用约定,用VC编写的DLL,只有符合__stdcall调用约定的函数,才可以被VB调用。我BLOG上的两篇文章可能会对楼主有些帮助:剖析VC++函数调用约定
    http://blog.csdn.net/goodname008/archive/2004/07/24/50662.aspx利用底层键盘钩子拦载任意按键(回调版)
    http://blog.csdn.net/goodname008/archive/2005/01/18/258215.aspx
    [这是一个很好的VB调用VC编写的DLL的例子]
      

  6.   

    出现错误调用约定是由于你参数的类型与声明的不符,或者是返回类型与声明有出入,再或者是调用约定修饰符没有加对而造成的函数调用前后堆栈位置错误,针对前面两种情况你只要把类型对好了就没有问题,而后面的情况,你要么修改源程序加上__stdcall修饰符,要么就折腾vb