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. Java 中的抽象类及接口

    抽象类使用 abstract 关键字修饰,该类即为抽象类. 抽象类的作用: 1.某些情况下,父类约束子类必须包含哪些方法,但不知道子类如何去实现这些方法. 2.可以从多个具有相同特征的类中抽象出一个抽 ...

  2. [C#] Extension Method 扩展方法

    当我们引用第三方的DLL.或者Visual Studio自己的库的时候,或许会发现这样的一个情况,如果这个类型有一个XX的方法就好了.这时候我们可以用到扩展方法,是我们的代码更加灵活和高效. 这里我举 ...

  3. “Unable to resolve target 'android-9'”的问题

    SDK版本问题! 如果导入时,eclipse的console中提示信息:“Unable to resolve target 'android-9'” 可能的问题就是你安装的SDK版本高于项目的版本!( ...

  4. Android Activity生命周期以及Fragment生命周期的区别与分析

    Android Fragment生命周期图: Activity生命周期图: 对照图: Fragment生命周期分析: 1. 当一个fragment被创建的时候,它会经历以下状态. onAttach() ...

  5. Android图表

    最近需要用到Android里面的折现图,因此在这方面也去做了一些调研.总体发现Android对报表的支持还是非常好的.总体上去研究了两个实现方案,一个是利用Android提供的的AChartEngin ...

  6. IoC~高效的Autofac

    http://www.cnblogs.com/lori/archive/2012/09/05/2671724.html http://www.cnblogs.com/kissdodog/p/36114 ...

  7. 第五章 管理程序流(In .net4.5) 之 异常处理

    1. 概述 本章包括.net4.5中异常处理相关的部分. 2. 主要内容 2.1 处理异常 ① try.cahtch.finally 机制,无需多言. ② 使用 Environment.FailFas ...

  8. python Django 学习笔记(二)—— 一个简单的网页

    1,创建一个django项目 使用django-admin.py startproject MyDjangoSite 参考这里 2,建立视图 from django.http import HttpR ...

  9. Android请求返回417解决办法

    今天碰到个很奇怪的问题,APP通过代理链接服务器会收到HTTP 417错误,经过网上查找发现是由于以下代码造成: HttpParams params = new BasicHttpParams(); ...

  10. wpf的datepicker处理

    如果有2个datepicker,控制时间起和止的话,可以把第二个datepicker加一个属性,DisplayDateStart = "{Binding SelectedDate,Eleme ...