首页 > 代码库 > 项目分析(PLUG)
项目分析(PLUG)
plug过程1.INIT_PLUG#define INIT_PLUG Plug::InitPlug g_InitPlug(true);//共享内存数据结构struct PlugShareMemory{ void* pFirstHand; //第一个打开文件的句柄 I_PlugModuleManage* pBuffer; //共享内存};inline void CreateShareMemory(I_PlugModuleManage* pmm){ char id_name[64] = {0}; GetShareMemoryName(id_name); void* MemHand = PlugCreateFileMapping(id_name, 8); if (!MemHand) return ; void* pBuf = PlugMapViewOfFile(MemHand);//映射文件映射到进程空间中,pBuf就是映射之后的指针 //第一次打开, 保存数据 PlugShareMemory* psm = new PlugShareMemory; memcpy(pBuf, &psm, sizeof(psm));//将psm的指针的值复制到映射地址中去,看出共享的就是psm的指针的值 PlugUnMapViewOfFile(pBuf); psm->pFirstHand = MemHand;//保存映射文件的句柄 psm->pBuffer = pmm;//将pmm的值复制到共享内存中,由pmm就可以操作共享内存了,设计还是很巧妙的}inline bool __stdcall DllLoadContorl::LoadDll(std::wstring filename)//总共会加载三个目录下的DLL{ void* hInst = xLoadLibraryW((wchar_t*)filename.c_str());//加载目录下的dll,返回对应DLL的指针 if(hInst == NULL) { std::wstring mess = L"Can‘t load the dll file: "; mess += filename; PlugMessageBox(mess.c_str()); return false; } //保持它在内存中,此类退出时自动释放 m_ahDllHandle[m_dwDllCount] = hInst;//将DLL保存在m_ahDllHandle中 ++m_dwDllCount; return true;}在调用return LoadLibraryW(lpLibFileName);会自动调用PLUG_COMPONENT_AUTO_REG具体为什么会自动调用我也不明白PLUG_COMPONENT_AUTO_REG(Demo)//DO NOT EDIT THIS#define PLUG_COMPONENT_AUTO_REG(ProjectName) \ I_##ProjectName* __stdcall New##ProjectName(){ return new ProjectName();} void __stdcall Delete##ProjectName(void* p){ ProjectName* pp = static_cast<ProjectName*>((I_##ProjectName*)p); delete pp;}Plug::AutoReg ProjectName##AutoReg(#ProjectName, (void*)New##ProjectName, (void*)Delete##ProjectName); void __stdcall Reg##ProjectName(){ ProjectName##AutoReg;}看这个宏定义了创建实例和删除实例的函数指针,然后调用AutoReginline void __stdcall PlugModuleManage::push(const char* id, void* pNewInstance, void* pDeleteInstance){#ifdef _DEBUG find_overlap(id);//如果是debug版就检测有同有重复组件#endif if(id) { PlugModule module; module.id = id;//ID即名字 module.pNewInstance = pNewInstance;//新建实例函数 module.pDeleteInstance = pDeleteInstance;//删除实例函数 m_modules.push_back(module);//将实例信息保存到m_modules中 //std::sort(m_modules.begin(), m_modules.end()); }}Plug::SetApp(new AppEx());//保存一个APP的值,具体什么用,我也不太明白2.NEW#define NEW(ProjectName) (struct I_##ProjectName*)(Plug::PlugCreeateInstance(#ProjectName))根据ProjectName在保存模块的容器中查找try{ CreateInstanceFun cifun = (CreateInstanceFun)(pNewInstance); void* pInstance = (void*)cifun();//调用创建实例函数即调用构造函数 pmm->AddInstance(pInstance, pDeleteInstance);//根据指针作为KEY保存实例m_instances中m_instances[*(int*)&p] = instance; return pInstance;//返回实例的指针,相当于返回new出来的指针}3.DEL#define DEL(instance) Plug::PlugDeleteInstance(instance)同样在m_instances中根据实例指针查找,找到指针删掉fun(p);//调用实例的删除函数,即调用实例的析构函数所以在这个函数里可能还会调释放组件,这时一定把锁放开???上面一个简单的PLUG的工作流程
这个PLUG几次尝试去看,都看一半,现在终于完整的看了一下。
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。