动态库符号导出02
这里跟原来的文章动态库符号导出一脉相承,只是补充了一些导出c++的类的最佳实践
c++里可以借助虚函数,导出的时候只要导出一个c的create当前类的实例的函数(避免name mangling), 然后通过这个函数创建实例,然后调用虚函数就可以了,外部需要知道这个抽象类的结构
使用者跟DLL提供者共用一个抽象类的头文件,使用者依赖于DLL的东西很少,只需要知道抽象类的接口,以及获取对象指针的导出函数,对象内存空间的申请是在DLL模块中做的,释放也在DLL模块中完成,最后记得要调用释放对象的函数。
上述其实能用智能指针接管,比较方便
实际的代码
1
2
3
4
5
6
7
8
9
10
// The abstract interface for Xyz object.
// No extra specifiers required.
struct IXyz
{
virtual int Foo(int n) = 0;
virtual void Release() = 0;
};
// Factory function that creates instances of the Xyz object.
extern "C" XYZAPI IXyz* APIENTRY GetXyz();
实际使用的
1
2
3
4
5
6
7
8
9
10
11
12
13
#include "XyzLibrary.h"
...
IXyz* pXyz = ::GetXyz();
if(pXyz)
{
pXyz->Foo(42);
pXyz->Release();
pXyz = NULL;
}
这个背后的想法是:
- 一个由纯虚函数组成的成员很少的类只不过是一个虚函数表,一个函数指针数组,在DLL范围内这个函数指针数组被它的作者填充任何他认为必需的东西。这样这个指针数组在DLL外部使用就是调用接口的实际上的实现。
REF
This post is licensed under CC BY 4.0 by the author.