項目分析(PLUG)

來源:互聯網
上載者:User

標籤: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幾次嘗試去看,都看一半,現在終於完整的看了一下。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.