项目分析(PLUG)
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)的更多相关文章
- iOS项目分析及优化
iOS项目分析及优化 来源:吴白的简书 从代码看一个程序员的笔力 从代码的整洁度上就可以看出一个程序员的实力,规范其实就是让你养成一种良好习惯的标杆,在此面前我们应该顺从.本篇我们以OC为例,统 ...
- 项目分析_xxoo-master
项目介绍:使用java1.5的原生xml操作类实现 对象<-->xml字符串的相互转化 项目分析:主要分为是三个部分 1.容器类:AbstractContainer 存储x ...
- poj1087 A Plug for UNIX(网络流最大流)
http://poj.org/problem?id=1087 好久没遇见过这么坑的题了这个题真是挫的够可以的.题目大意:你作为某高管去住宿了,然后宾馆里有几种插座,分别有其对应型号,你携带了几种用电器 ...
- 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 ...
- 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 ...
- CDB中plug PDB
CDB中plug PDB 先决条件: ·CDB要能够访问之前被unplugged 的pdb的xml文件.如果不能访问,需要使用dbms_pdb.recover创建一个xml文件 ·CDB要能够访问到该 ...
- 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 ...
- POJ1087 A Plug for UNIX(网络流)
A Plug for UNIX Time Limit: 1000MS Memory Limit: 65536K Total S ...
- IDE Plug
IDE Plug 使用 cnpack提供的IDE External Wizard Management 管理插件.添加插件.删除插件 Cnpack D:\Program Files (x86)\CnP ...
随机推荐
- ThinkPHP之中的getField、Find、select、返回数据类型详解(ThinkPHP之中所有数据读取了)
小李子:用于演示作用的数据库表:customers 官方解读: “ 读取数据集其实就是获取数据表中的多行记录(以及关联数据),使用select方法 ” $customers=D('customers' ...
- IOS应用程序生命周期
一.IOS应用的5种状态 Not Running(非运行状态) 应用没有运行或被系统终止. Inactive(前台非活动状态) 应用正在进入前台状态,但是还不能接受事件处理. Active(前台活动状 ...
- next permutaion算法
算法描述: Find largest index i such that array[i − 1] < array[i]. Find largest index j such that j ≥ ...
- .NET开源工作流RoadFlow-流程设计-流程步骤设置-数据设置
数据设置是控制在流程处理过程中,当前步骤的数据显示与编辑状态,控制当前步骤哪些字段为只读,隐藏或可编辑.需要配合表单设计器使用.
- oh-my-zsh配置你的zsh提高shell逼格终极选择
抱歉,这篇博文推迟发布了,人都是有惰性的...看在这个牛逼闪闪的标题就原谅我吧! 为何这篇文章要归类到 mac 下? 第一个问题,稍后我们说明下. zsh是个什么东东? 第二个问题... 你应该稍微接 ...
- <转载>编程珠玑-位排序(bitsort)
转载:http://www.cnblogs.com/shuaiwhu/archive/2011/05/29/2065039.html 维护版权 在<编程珠玑>一书上,有一题是将一堆不 ...
- [转]Squid中的日志出现TCP_CLIENT_REFRESH_MISS的问题排除
转自:http://www.php-oa.com/2008/07/15/tcp_client_refresh_miss.html 今天检查Squid发现大量的日志出现TCP_CLIENT_REFRES ...
- Uncaught TypeError: Cannot read property 'insertAdjacentHTML' of null
在开发Ext 项目中如果遇到 Uncaught TypeError: Cannot read property 'insertAdjacentHTML' of null 这个错误,检查下renderT ...
- .net mvc通过ucenter和 discuz的整合,nopcommerce ucenter 插件的方式实现
discuz无疑是目前市面上最好的论坛之一,对于大多数公司来说,用discuz搭建一个论坛肯定是最节约成本的选择,然而我们的会员想要和discuz进行整合的话,只有两种荀泽,一种直接选用discuz的 ...
- HMMPfam的安装使用手记(转载)
转载至:http://blog.sina.com.cn/s/blog_3f6403290100rb61.html(感谢原文作者) HMMPfam的安装使用手记前言 简要介绍一下 HMMPfam吧.这还 ...