一般在业务开发中,要分很多个模块来进行协作,模块多了之后就会有依赖问题,包括模块的启动顺序,统一初始化,释放资源等等,所以就需要一个来管理模块的框架,插件框架。
外部接口:
插件管理启动所有注册插件,并初始化
//启动框架
#define STARTCOMPONENTSERVICE StartComponent();
注册模块(dll), 并在dll中实现以下虚接口供插件管理调用
const std::wstring components[] = {
L"Update_d.dll"
};
#endif
struct IComponent
{
virtual bool Start() = 0;
virtual bool Stop() = 0;
};
extern "C" __declspec(dllexport) IComponent* GetComponent();
IComponent::Start用于插件内部的一些初始化
Stop用于插件卸载时的一些资源释放
插件管理模块启动实现:
typedef IComponent*(*GetComponentFunc)();
void StartComponent()
{
for (auto x : components)
{
HMODULE hMod = ::LoadLibrary(x.c_str());
if (hMod)
{
GetComponentFunc pFunc = (GetComponentFunc)GetProcAddress(hMod, "GetComponent");
if (pFunc)
{
IComponent* pComponent = pFunc();
if (nullptr != pComponent)
{
pComponent->Start();
}
}
}
}
}