標籤:style blog color 檔案 資料 ar div 工作
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幾次嘗試去看,都看一半,現在終於完整的看了一下。