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的用法觉得更加迷茫了
(.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的用法觉得更加迷茫了
如果你实现代码里声明了stdcall,那就太奇怪了,怀疑
而且你问问题为什么不把出什么错误也说说
_stdcall_stdcall是Pascal程序的缺省调用方式,通常用于Win32 Api中,由主调用函数采用从右到左的压栈方式进行参数压栈,然后由被调用者弹栈(pop),被调用者自己在退出时清空堆栈。
_cdeclC语言调用中默认的函数修饰_cdecl,由主调用函数进行参数压栈并且恢复堆栈。实参的压栈顺序是从右到左,最后由主调函数进行堆栈恢复(弹栈)。由于主调用函数管理堆栈,所以可以实现变参函数。/****************************/_stdcall主调函数压栈,被调函数弹栈,这样被调函数只能根据他的参数表进行弹栈,所以没有办法实现变参
_cdecl主调函数压栈,主调函数弹栈,压栈时已经知道有多个参数,这样可以实现变参
{
int f=XX1+XX2;
if(f>0)
return 1;
else
return 2;
}
编译 连接都对的,不加那句的话。 提示的错误,是一个很大的错误窗口,就是有3个选择的 忽略 重试 取消。我不知道怎么更好的形容,这样说 不知道 你能不能 理解。就程序实际执行经常会遇到的。。
如果是动态加载,函数指针的调用约定有没有和DLL定义对应?
建议你写一个c的小工程来验证DLL是否正常工作,如果可以,那就是你调用方语言的问题了。
第二:删除你所有对winapi的定义,系统不是自己就有,你为什么要定义?
如果你一定要自己控制,直接在函数出现的所有地方用stdcall,不要用winapi