参见http://expert.csdn.net/Topic/13385.shtm

解决方案 »

  1.   

    Vc++ 中的数据定义和VB中的不一样. 
    比如: VC++ Int var,   VB byval var as long
         VC++ Double fun(), VB fun() as double
    所以你需要确认他们的长度(int 8 byte in win32) 和 传递方式. byval or byref
    如果是指针, 一般是 4个字节 所以VB中使用  as long 来代替.
      

  2.   

    这个问题和我遇到的一样,要在编译时将VC编译器的__cdecl调用约定改为__stdcall调用
    约定,编译后马上可以搞定。
      

  3.   

    其实不仅是VB会这样,VC编译的DLL在很多语言中调用均会出现这种问题,因为VC中默认的__cdecl调用是调用者清除堆栈,而__stdcall调用则是函数自己清除,用于其他语言应该用后者。
      

  4.   

    通常使用动态连接库中的输出函数都应该使用标准调用约定;
    __stdcall由调用者清栈,
    __cdecl由被调函数清栈,
    函数调用完成后检查esi和esp是否相等,如果不相等,则说明调用约定有误