plug过程
.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[] = {};
GetShareMemoryName(id_name);
void* MemHand = PlugCreateFileMapping(id_name, );
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;\
}\
看这个宏定义了创建实例和删除实例的函数指针,然后调用AutoReg
inline 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的值,具体什么用,我也不太明白 .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出来的指针
}
.DEL
#define DEL(instance) Plug::PlugDeleteInstance(instance)
同样在m_instances中根据实例指针查找,找到指针删掉
fun(p);//调用实例的删除函数,即调用实例的析构函数所以在这个函数里可能还会调释放组件,这时一定把锁放开???
上面一个简单的PLUG的工作流程

这个PLUG几次尝试去看,都看一半,现在终于完整的看了一下。

项目分析(PLUG)的更多相关文章

  1. iOS项目分析及优化

    iOS项目分析及优化  来源:吴白的简书   从代码看一个程序员的笔力 从代码的整洁度上就可以看出一个程序员的实力,规范其实就是让你养成一种良好习惯的标杆,在此面前我们应该顺从.本篇我们以OC为例,统 ...

  2. 项目分析_xxoo-master

    项目介绍:使用java1.5的原生xml操作类实现 对象<-->xml字符串的相互转化 项目分析:主要分为是三个部分 1.容器类:AbstractContainer         存储x ...

  3. poj1087 A Plug for UNIX(网络流最大流)

    http://poj.org/problem?id=1087 好久没遇见过这么坑的题了这个题真是挫的够可以的.题目大意:你作为某高管去住宿了,然后宾馆里有几种插座,分别有其对应型号,你携带了几种用电器 ...

  4. VS代码段扩展Snippet Designer is a Visual Studio plug in which allows you to create and search for snippets inside the IDE

    Snippet Designer is a Visual Studio plug in which allows you to create and search for snippets insid ...

  5. UVA 753 A Plug for UNIX(二分图匹配)

    A Plug for UNIX You are in charge of setting up the press room for the inaugural meeting of the Unit ...

  6. CDB中plug PDB

    CDB中plug PDB 先决条件: ·CDB要能够访问之前被unplugged 的pdb的xml文件.如果不能访问,需要使用dbms_pdb.recover创建一个xml文件 ·CDB要能够访问到该 ...

  7. A Plug for UNIX 分类: POJ 图论 函数 2015-08-10 14:18 2人阅读 评论(0) 收藏

    A Plug for UNIX Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 14786 Accepted: 4994 Desc ...

  8. POJ1087 A Plug for UNIX(网络流)

                                       A Plug for UNIX Time Limit: 1000MS   Memory Limit: 65536K Total S ...

  9. IDE Plug

    IDE Plug 使用 cnpack提供的IDE External Wizard Management 管理插件.添加插件.删除插件 Cnpack D:\Program Files (x86)\CnP ...

随机推荐

  1. 在 PHP 中结合 Ajax 技术进行图片上传

    前面几则日志中讲述了在 PHP 中上传文件,相信大家对 PHP 中如何进行文件上传已经初步掌握.本文来继续探讨在 PHP 中上传文件的技术,不同的是,本次上传将仅限于图片文件的上传,并且将采用 Aja ...

  2. SIMATIC PCS 7 结构图

  3. SSD1306驱动的OLED实验

    [转]http://bbs.21ic.com/icview-434543-1-1.html 前面几章的实例,均没涉及到液晶显示,这一章,我们将向大家介绍OLED的使用.在本章中,我们将使用战舰STM3 ...

  4. 安装SQL Server Management Studio遇到的29506错误

    首先要在IIS里把internet 信息哪项选上.然后在安装SQL Server, 在安装的时候一直报 29506错误,装了几次,不知道什么原因.谷歌了一下说是权限的问题. 很纳闷,我当然用的是管理员 ...

  5. kettle日志记录

    环境描述: 现在一个项目有很多个作业,需要知道每次跑批后哪些ktr跑成功,哪些失败了 问题解决: 下面是一个具体的操作流程 首先建立数据库表 CREATE TABLE test_1(id INT,NA ...

  6. CSS3设置字体

    @font-face{ font-family: myFirstFont;src: url('Sansation_Light.ttf')   ,url('Sansation_Light.eot'); ...

  7. Centos 安装 p7zip,即Linux下的7z

    Centos 无法直接通过yum安装7z,我们一般通过repoforge,rpmforge的软件包进行安装,你只需要下载一个对应的包,直接安装就可以 p7zip-9.20.1-1.el4.rf.i38 ...

  8. [转]Reed Solomon纠删码

    [转]Reed Solomon纠删码    http://peterylh.blog.163.com/blog/static/12033201371375050233/     纠删码是存储领域常用的 ...

  9. Android编程: 调试方法

    学习知识:Android的调试方法 ====调试方法==== 前提: IDE环境为Android Studio,熟悉LogCat,知道如何查看日志信息 工具: Android DDMS调试工具,一般点 ...

  10. Jquery Mobile局部刷新后js和css失效,需局部渲染

    $(function () {    $("#submit").click(function(){      var storage = window.localStorage;  ...