很有可能是调用约定的问题。把导出函数的调用约定改为WINAPI试试。

解决方案 »

  1.   

    所谓的调用约定其实就是约定由谁清栈.VBVM在调用函数后比较调用前后的栈指针是否相等,如果不等那运行下去肯定会出问题,所以这时候他会报告一个调用约定错误然后退出运行.一般c编译器支持3种调用约定:
    1.c调用约定.这种调用约定由调用者(caller)清栈,VC生成的项目默认为这种方式.
    2.标准调用约定.这种调用约定由被调用者(callee)清栈,VBVM只支持这种方式.实际上windows API和所用想在大多数运行环境下使用的动态连接库导出函数都是用这种方式.
    3.快速调用约定.编译器为这种调用约定函数尽量使用寄存器传递参数.如果你的函数要在VB中使用那你应该使用标准调用约定:
    void __stdcall yourfunction();
    而实际上WINAPI被定义为__stdcall.你的导出函数肯定没使用标准调用约定,这种情况下编译不会有任何问题,直到被VB程序调用时才会出毛病.
      

  2.   

    一定是你的VC的DLL写的有问题,没有按照标准DLL的格式,另外还有可能是你的参数声明不正确先检查这两个地方吧!
      

  3.   

    原因是编译器会修改函数名,在前面加下划线,在后面加@符号何传给该函数的参数的字节数。而在种格式VB是不认的。这也就是没有参数不会出问题的原因。要避免这种情况可在文件中加入
    EXPORT
      ;MyFunc为你的函数名
      MyFunc  
      

  4.   

    加上__declspec(dllexport)就不会改名了 :)