VS制作动态库注意事项

  1. 导出函数
    当我们需要导出函数的时候,应该考虑的是以标准调用约定(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文件需要在配置工程里面进行设置
在这里插入图片描述

  1. 导出类
    导出的类的方法和导出函数差不多.类中函数的权限依然有效
	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;
}
/*这么做的好处有:一是,一个类是有权限的,这样的话我们可以将实现中的类私有权限和
保护权限的成员函数和成员不必再暴露给用户,安全和便于用户使用。二是,这样将实现进
行了屏蔽,我们实现发生了变化,不会对用户产生影响。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值