COM_第四讲_保存GUID_优化使用代码
优化以前的代码,让使用者更方便
一丶 优化思路
1.我们可以将我们写的GUID(类工厂的ID)保存到注册表中,并且保存一下DLL的文件路径,遍历注册表去DLL路径即可.
2.每个类工厂我们就要使用一个GUID,而我们就要写到注册表中GUID
注册表在系统的文件夹下:
C:\\ WINDWOS \\ System32\\config下面,当然这个使我们不能删除的,也不能查看的.我们需要调用API来操作
如果要查看,可以运行CMD命令:
regedit命令来查看注册表
二丶插件注册
问题一:
当我们要把类工厂的ID写到注册表中,但是DLL的路径我们不知道,这些都是动态写入的,所以我们需要利用插件注册模式
问题二:
我们要怎么注册,要写到哪里合适,要怎么注册
1.我们要写到的是注册表的
计算机\HKEY_CLASSES_ROOT\CLSID 里面,其中项的名称就是类工厂的GUID
2.注册要调用系统的注册工具,我们需要实现3个API供他调用
HRESULT __stdcall DllCanUnloadNow() /*能否卸载*/
HRESULT __stdcall DllRegisterServer() /*是否注册*/
HRESULT __stdcall DllUnregisterServer() /*卸载插件*/
HRESULT __stdcall DllGetClassObject(const GUID& clsid, const GUID& riid, void **ppObject)(其中这个就是COM前边讲的根据类ID返回类工厂)
三丶设计注册表存储
上面已经准备好了,我们就要设计注册表了,然后依次写入到注册表
const char* g_szRegTable[][3] ={
{"CLSID\\{450A883B-F00A-46b3-AF3C-EC559997396A}", 0, "SuperMath" /*你的类工厂的GUID*/
},
{ "CLSID\\{450A883B-F00A-46b3-AF3C-EC559997396A}\\InprocServer32",
,
(const char*)-1(代表你可以动态的写入DLL路径)
},
{
"CLSID\\{450A883B-F00A-46b3-AF3C-EC559997396A}\\ 这个是可选的,因为你的GUID要存储进去,当我们取出来的时候要根据GUID查找,很麻烦,所以定义怎么一个文件夹,里面存放的就是GUID,可以直接通过他来获得GUID", , "SuperMathsrv.SuperMath.1"
(
},
{
"CLSID\\{450A883B-F00A-46b3-AF3C-EC559997396A}\\TypeLib", , "{450A883B-F00A-46b3-AF3C-EC559997396A}"
你要包含的头文件的路径,放在Typelib里面
},
{
"SuperMathsrv.SuperMath", , "SuperMath"
先定义一个目录,下面取消注册,删除插件的时候需要删除这个文件夹(也就是注册表的一项)
},
{
"SuperMathsrv.SuperMath\\CLSID", , "{450A883B-F00A-46b3-AF3C-EC559997396A}"
写入类工厂的GUID
},
{
"SuperMathsrv.SuperMath\\CurVer", , "SuperMathsrv.SuperMath.1"
写入类工厂的版本号
},
{
"SuperMathsrv.SuperMath.1", , ""
},
{
"SuperMathsrv.SuperMath.1\\CLSID", , "{450A883B-F00A-46b3-AF3C-EC559997396A}"
},
};
上面是一个二维数组里面保存了要创建注册表的信息
详解二维数组里面的文件夹:
1.SuperMath 你的类工厂的名字,要创建怎么一个文件夹
2.InprocServer32 这个是注册表标准的文件夹,这里面的默认项填写的是当前COM(也就是DLL)的路径
3.ProID 可选写入 版本
4.TypeLib 这个是使用者需要用#include,所以我们把他的路径也封装一下
5. 这个是可选的,因为你的GUID要存储进去,当我们取出来的时候要根据GUID查找,很麻烦,所以定义怎么一个文件夹,里面存放的就是GUID,可以直接通过他来获得GUID
这个是可选的,因为你的GUID要存储进去,当我们取出来的时候要根据GUID查找,很麻烦,所以定义怎么一个文件夹,里面存放的就是GUID,可以直接通过他来获得GUID,需要先定义怎么一个文件夹,我们删除的时候使用
最后一个GUID,写入的GUID
四丶在插件注册标准的函数中写注册表
for (int i = ; i < sizeof(g_szRegTable) / sizeof(g_szRegTable[]); i++)
{
const char* pszKey = g_szRegTable[i][]; /*找到数组的第第0项里面以为数组的第0项的值*/
const char* pszValueName = g_szRegTable[i][];/*一次类推*/
const char* pszValue = g_szRegTable[i][];
char szModuleName[MAX_PATH]; HKEY hKey;
if (RegCreateKeyEx(HKEY_CLASSES_ROOT, /*写入注册表*/
pszKey, NULL, NULL,
REG_OPTION_VOLATILE,
KEY_ALL_ACCESS,
NULL,
&hKey,
NULL) != ERROR_SUCCESS)
return S_FALSE; if (pszValue == (const char*)-)/*判断里面的内容是否是这个(主要是第二次循环要动态写入DLL路径)*/
{
GetModuleFileName(g_hInstan, szModuleName, sizeof(szModuleName));
/*获得DLL路径写入,g_Hinstan是从DLLmain里面保存的,是一个全局变量,因为要获取当前DLL的模块*/
pszValue = szModuleName;
} if (RegSetValueEx(hKey, pszValueName, NULL, REG_SZ, /*写入值*/
(BYTE*)pszValue, strlen(pszValue)) != ERROR_SUCCESS)
return S_FALSE; RegCloseKey(hKey); /*关闭Key*/
} return S_OK;
卸载的时候需要反向卸载
HRESULT __stdcall DllUnregisterServer()
{
int nCount = sizeof(g_szRegTable) / sizeof(g_szRegTable[]);/*获得大小*/
for (int i = nCount - ; i >= ; i--)
{
const char* pszKey = g_szRegTable[i][];/*获得第x项的第0个下标(一维数组的第一项)的内容*/
if (RegDeleteKey(HKEY_CLASSES_ROOT, pszKey) != ERROR_SUCCESS)
return S_FALSE; /*删除*/
} return S_OK;
}
解决全新的字符串格式
我们的COM组件要跨平台使用,所以这个时候不得不考虑字符串了,C语言中的字符串是\0结尾,而Pascal是前边是字符串的长度,后面是字符串
全新的字符串格式 BSTR 他是他们两个的组合 前边是长度,中间是字符串,后边是\0结尾
而COM是C/c++程序员设计的,所以使用BSTR的时候,直接使用,他会默认帮我们移动到数据位,直到遇到\0结尾
而Pascal想要使用,就要自己减去一个,得到长度,然后获得字符串,不考虑\0结尾.
COM_第四讲_保存GUID_优化使用代码的更多相关文章
- 第四讲_图像识别之图像分类Image Classification
第四讲_图像识别之图像分类Image Classification 目录 图片分类 性能指标:top1,top5 ILSVRC:每种任务数据集不一样 imageNet:根据WorldNet组织的图片集 ...
- 逆向知识第十四讲,(C语言完结)结构体在汇编中的表现形式
逆向知识第十四讲,(C语言完结)结构体在汇编中的表现形式 一丶了解什么是结构体,以及计算结构体成员的对其值以及总大小(类也是这样算) 结构体的特性 1.结构体(struct)是由一系列具有相同类型或不 ...
- PC逆向之代码还原技术,第四讲汇编中减法的代码还原
目录 PC逆向之代码还原技术,第四讲汇编中减法的代码还原 一丶汇编简介 二丶高级代码对应汇编观看. 1.代码还原解析: 三丶根据高级代码IDA反汇编的完整代码 四丶知识总结 PC逆向之代码还原技术,第 ...
- 高翔《视觉SLAM十四讲》从理论到实践
目录 第1讲 前言:本书讲什么:如何使用本书: 第2讲 初始SLAM:引子-小萝卜的例子:经典视觉SLAM框架:SLAM问题的数学表述:实践-编程基础: 第3讲 三维空间刚体运动 旋转矩阵:实践-Ei ...
- 《视觉SLAM十四讲》第2讲
目录 一 视觉SLAM中的传感器 二 经典视觉SLAM框架 三 SLAM问题的数学表述 注:原创不易,转载请务必注明原作者和出处,感谢支持! 本讲主要内容: (1) 视觉SLAM中的传感器 (2) 经 ...
- 背包四讲 (AcWing算法基础课笔记整理)
背包四讲 背包问题(Knapsack problem)是一种组合优化的NP完全问题.问题可以描述为:给定一组物品,每种物品都有自己的重量和价格,在限定的总重量内,我们如何选择,才能使得物品的总价格最高 ...
- 《ArcGIS Engine+C#实例开发教程》第四讲 状态栏信息的添加与实现
原文:<ArcGIS Engine+C#实例开发教程>第四讲 状态栏信息的添加与实现 摘要:在上一讲中,我们完成了 MapControl 和PageLayoutControl两种视图的同步 ...
- 32位汇编第四讲,干货分享,汇编注入的实现,以及快速定位调用API的数量(OD查看)
32位汇编第四讲,干货分享,汇编注入的实现,以及快速定位调用API的数量(OD查看) 昨天,大家可能都看了代码了,不知道昨天有没有在汇编代码的基础上,实现注入计算器. 如果没有,今天则会讲解,不过建议 ...
- PE格式第四讲,数据目录表之导入表,以及IAT表
PE格式第四讲,数据目录表之导入表,以及IAT表 一丶IAT(地址表) 首先我们思考一个问题,程序加载的时候会调用API,比如我们以前写的标准PE 那么他到底是怎么去调用的? 他会Call 下边的Jm ...
随机推荐
- js代码大全(各种方法、属性)《转载》
事件源对象 event.srcElement.tagName event.srcElement.type 捕获释放 event.srcElement.setCapture(); event.sr ...
- THinkPHP的认识
四中路由方式:http://网址/index.php?m=分组&c=控制器&a=操作方法(但是这个不安全,不推荐使用)http://网址/index.php/分组/控制器/操作方法(默 ...
- eric6 中 designer 无法启动的解决办法
1.安装环境:win10+python3.6+Eric6 2.问题:使用 pip install PyQt5 安装 PyQt5.9 版本后,发现 Eric6 中无法打开 designer.exe 工具 ...
- uva 1418 - WonderTeam
题意:你n支球队进行比赛,每两支队伍之间进行2场比赛,胜得3分,平得1分,输得0分,比赛后挑选出一个梦之队,要求进球总数最多,胜利场数最多,失球总数最少,并且三种都不能与其它对比列第一.问说梦之队的最 ...
- 《Linux命令行与shell脚本编程大全》第二十六章 一些有意思的脚本
26.1 发送消息 26.1.1 功能分析 1.确定系统中都有谁 $who 给出的信息包括用户名 用户所在终端 用户登入系统的时间 2.启用消息功能 用户可以禁止别人给我发消息,所以需要先检查一下是否 ...
- POJ 2828 Buy Tickets 线段树 倒序插入 节点空位预留(思路巧妙)
Buy Tickets Time Limit: 4000MS Memory Limit: 65536K Total Submissions: 19725 Accepted: 9756 Desc ...
- PHP 常用字符串函数
1.查找字符位置函数 strpos($str,search,[int]):查找search在$str中的第一次位置从int开始: stripos($str,search,[int]):函数返回字符串在 ...
- PHPstorm 函数时间注释的修改
正常的PHPstorm里面函数方法的注释是没有动态时间设置的,但是看了PHP file里面有时间日期的注释,而PHP Function Doc Comment 却没有,让很多PHPer很头疼,今天在搜 ...
- YiShop_做个网上商城系统多少钱
随着国内电商的兴起,不少企业和个人卖家都已经意识到电商的重要性,于是就开始搭建自己网上商城,但是还是有很多人对网上商城还不是很了解,今天就由YiShop小编跟大家讲解网上商城系统的一些知识一.网上商城 ...
- S2b只适合于电商吗?
万物互联时代,任何产业蓬勃发展都离不开互联网,从B2M.B2B.B2C.C2C.M2M,层出不穷的商业模式都让人眼花缭乱,最近还推出了s2b这个全新的模式. S代表着大的供应平台,它将更好地赋能给更多 ...