VC做的DLL。然后用MFC来试用为了让这个DLL其他的比如VB也可以用如下!!~
 (.h文件)
#ifdef  LS_EXPORTS
#define LS_API __declspec(dllexport)
#else
#define LS_API __declspec(dllimport)
#endif
//////////////////***DEFINE***///////////////////////////////////////////
#define LS_STATUS int
#define WINAPI   __stdcall
#define LS_DOUBLE double
///////////////////////////////////////////////////////////////
#ifdef __cplusplus
#define WINAPI   __cdecl(!!!!就这一句上。。如果我不加这个后面调用ADD1这个函数的时候,竟然提示错误。加了后就万事太平)
extern "C" {
#endif
LS_API
   LS_STATUS   WINAPI ADD1
   (
   LS_STATUS XX1,
   LS_STATUS XX2);#ifdef __cplusplus
}
#endif
然后网上我搜索了 __cdecl与__stdcall的用法觉得更加迷茫了
        

解决方案 »

  1.   

    那就要看你ADD1到底怎么定义得了,你只贴了头文件,没有实现代码看不出
    如果你实现代码里声明了stdcall,那就太奇怪了,怀疑
    而且你问问题为什么不把出什么错误也说说
      

  2.   

    应该声明为_stdcall_stdcall 和 __cdecl 都属于调用方式一般我们在声明函数时都没有显示的说明调用方式,因为不同语言都有不同的默认调用方式//******************************//
    _stdcall_stdcall是Pascal程序的缺省调用方式,通常用于Win32 Api中,由主调用函数采用从右到左的压栈方式进行参数压栈,然后由被调用者弹栈(pop),被调用者自己在退出时清空堆栈。
    _cdeclC语言调用中默认的函数修饰_cdecl,由主调用函数进行参数压栈并且恢复堆栈。实参的压栈顺序是从右到左,最后由主调函数进行堆栈恢复(弹栈)。由于主调用函数管理堆栈,所以可以实现变参函数。/****************************/_stdcall主调函数压栈,被调函数弹栈,这样被调函数只能根据他的参数表进行弹栈,所以没有办法实现变参
    _cdecl主调函数压栈,主调函数弹栈,压栈时已经知道有多个参数,这样可以实现变参
      

  3.   

    ADD1的实现函数:LS_STATUS WINAPI ADD1(LS_STATUS XX1,LS_STATUS XX2)
    {
       int f=XX1+XX2;
    if(f>0)
         return 1;
    else
      return 2;
    }
    编译 连接都对的,不加那句的话。 提示的错误,是一个很大的错误窗口,就是有3个选择的 忽略 重试 取消。我不知道怎么更好的形容,这样说 不知道 你能不能 理解。就程序实际执行经常会遇到的。。
      

  4.   

    调用时候怎么调用的?动态加载还是静态加载?
    如果是动态加载,函数指针的调用约定有没有和DLL定义对应?
      

  5.   

    调用约定的问题。不要把WINAPI重定义为__cdcel。
    建议你写一个c的小工程来验证DLL是否正常工作,如果可以,那就是你调用方语言的问题了。
      

  6.   

    第一:你做的红色修改到底是在dll中还是在exe中。如果是在dll中,说明你exe中没有做类似声明,如果是在exe中,说明你dll中没有做声明,肯定有不一致的地方
    第二:删除你所有对winapi的定义,系统不是自己就有,你为什么要定义?
    如果你一定要自己控制,直接在函数出现的所有地方用stdcall,不要用winapi