C 和C++ 对应不同的调用约定,产生的修饰符也各不相同,如下:
调用约定 extern "C" 或 .c 文件 .cpp、.cxx 或 /TP C 命名约定 (__cdecl) _test ?test@@ZAXXZ Fastcall 命名约定 (__fastcall) @test@0 ?test@@YIXXZ 标准调用命名约定 (__stdcall) _test@0 ?test@@YGXXZ
__declspec(dllexport) __declspec(dllimport)
一般也是使用宏的形式:
#ifdef ONEDLL_EXPORTS
#define ONEDLL_API __declspec(dllexport)
#else
#define ONEDLL_API __declspec(dllimport)
#endif
这样在DLL代码本身就是__declspec(dllexport)
,在使用DLL的程序中就变成了__declspec(dllimport)
,这两标志分别用来指明当前的函数将被导出,和当前函数是被导入的。
上面的两个宏结合一下就是下面这样的了:
#ifdef ONEDLL_EXPORTS
#define ONEDLL_API __declspec(dllexport)
#else
#define ONEDLL_API __declspec(dllimport)
#endif
// 此类是从 OneDll.dll 导出的
#ifdef __cplusplus
extern "C"
{
#endif
class ONEDLL_API COneDll {
public:
COneDll(void);
~COneDll(void);
// TODO: 在此添加您的方法。
int m_a;
int m_b;
int *m_p;
int m_n;
void AddValue();
};
extern ONEDLL_API int nOneDll;
ONEDLL_API int fnOneDll(void);
#ifdef __cplusplus
}
#endif