版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/m0_38126105/article/details/85145575
- 导出函数
当我们需要导出函数的时候,应该考虑的是以标准调用约定(stdcall)的形式提供给用户。具体的调用约定的区别可以参考下文。
https://blog.csdn.net/chenlycly/article/details/51329886
在接口声明文件中,我们需要定义个用来做导入导出开关的宏,再做一个标准调用约定的宏。当需要导出的时候,我们只需要在前面加一个MYAPI_DLL就可以了,导入的时候,什么都不需要改变,直接使用引入接口声明文件,对应的dll,lib就可以了。
#ifdef MYAPI_DLL
#define MYAPI extern "C" _declspec(dllexport)
#else
#define MYAPI extern "C" _declspec(dllimport)
#endif
#ifdef WIN32
#define STDCALL __stdcall //需要注意的时,_stdcall是会改名的,我们是可以通过depend看出的,_cdecl不会改名的,如果不想换名的话,还需要借助.def文件
#else
#ifdef i386
#define STDCALL __attribute__((stdcall))
#else
#define STDCALL
#endif
#endif
MYAPI int STDCALL Add(int a, int b);
MYAPI int STDCALL Subtrac(int a, int b);
在建一个.def文件
LIBRARY Dll3 //导出的动态库库名
EXPORTS
Add //导出的函数名
Subtrac
需要注意的是def文件需要在配置工程里面进行设置
- 导出类
导出的类的方法和导出函数差不多.类中函数的权限依然有效
class _declspec(dllexport) A
{
};
/*需要导出只导出几个成员函数时,需要在成员函数前加上_declspec(dllexport)就可以
了,但是导出类的时候,我们需要考虑下,最好将接口和实现分离,即pImple.*/
class A;//前置声明
calss _declspec(dllexport) A
{
A:a(new A)(){} //构造时生成对应的实现类的实例
~A(){delete a} //析构时删除
void Open() { a->Open();}//本身不实现,通过实现的实例调用
void Close() {a->Close();}
private:
ImA *a;
};
calss ImA
{
publice:
void Open(){}
void Close() {}
private:
void kkkk(){}
int m_name;
}
/*这么做的好处有:一是,一个类是有权限的,这样的话我们可以将实现中的类私有权限和
保护权限的成员函数和成员不必再暴露给用户,安全和便于用户使用。二是,这样将实现进
行了屏蔽,我们实现发生了变化,不会对用户产生影响。