分享
 
 
 

用ATL建立轻量级的COM对象(七)

王朝vc·作者佚名  2006-01-17
窄屏简体版  字體: |||超大  

用ATL建立轻量级的COM对象

第七部分

作者:赵湘宁

第一部分:为什么要使用ATL。

第二部分:起步篇。

第三部分:实现IUnknown。

第四部分:实现接口。

第五部分:不要过分抽象。

第六部分:输出你的类。

ATL和注册表

CComModule 提供了两个方法用于自注册:一个是RegisterServer,另外一个是 UnregisterServer。这两个方法使用传递到

Init 例程的对象映射来完成实际的工作。正像我前面所提到的那样,每一个对象映射入口都包含

pfnUpdateRegistry

函数指针,这个指针必须由类实现者提供。ATL最初的版本所提供的例程为

CLSID 自动添加标准注册入口,从而使缺省行为的实现很容易。可惜这些例程不具备很好的可扩展性,而且如果服务器的需求超过了正常

InprocServer32 入口所包含的内容的话,就必须自己用手工来编写注册代码。

随着组件种类(categories)和 AppIDs 概念的出现,几乎就再没有服务器能认可由ATL1.0提供的标准注册入口。在ATL1.1及以后的版本中,首选的自注册技术是使用注册脚本,它非常灵活。这个技术需要

IRegistrar 接口的COM实现,它既可以静态链接以降低依赖性,也可以用

CoCreateInstance 动态绑定来最小化代码尺寸。

注册脚本只是个文本文件,它列出必须为给定的 CLSID

添加什么入口。注册脚本文件默认的扩展名为RGS,并作为定制的

REGISTRY 类型资源被添加进可执行文件。注册脚本的语法十分简单,归纳起来为:

[NoRemove|ForceRemove|val] Name [ = s|d ''''Value'''']

{

... 用于子键的脚本条目

}

NoRemove 前缀表示在进行注销时不删除这个键。ForceRemove 前缀表示在写这个键之前删除当前的键和子键。Val

前缀表示这个入口是个命名的值,而不是一个键。s和d值前缀分别表示REG_SZ

或 REG_DWORD。ATL的解析机制既可以识别 HKEY_CLASSES_ROOT 等标准的注册表键,也能识别HKCR之类的缩写表示。

下面是个脚本注册的例子:REGEDIT4

REGEDIT4

[HKEY_CLASSES_ROOT\CLSID\{XXX}]

@=My Class

[HKEY_CLASSES_ROOT\CLSID\{XXX}\InprocServer32]

@=C:\foo\bar.dll

ThreadingModel=Free

其对应的注册脚本如下:

HKCR {

NoRemove CLSID {

ForceRemove {XXX} = s ''''My Class'''' {

InprocServer32 = s ''''%MODULE%'''' {

val ThreadingModel = s ''''Free''''

}

}

}

}

在使用资源脚本的时候,你的类 UpdateRegistry 方法可以轻松地通过DECLARE_ REGISTRY_RESOURCEID宏定义,它有一个资源ID(通常在resource.h中定义)作为参数:

class CPager : public

CComObjectRoot,public

IPager

CComCoClass {

DECLARE_REGISTRY_RESOURCEID(IDR_PAGER)

};

这个宏仅仅定义了 UpdateRegistry 方法,它调用内建在 CComModule

中的方法UpdateRegistryFromResource。这个方法有调用资源脚本的解析机制。

在上面显示的注册脚本中,所有出现 %MODULE% 的地方将被实际的

GetModuleFileName 调用结果所代替。如果你需要根据动态运行值添加额外的注册条目,可以添加其它的在注册之前能被置换的串,而不是用

%MODULE%。为此,首先要选用一个新的置换变量,用百分符号限定变量名。例如:

DateInstalled = s ''''%CURRENTDATE%''''

然后丁一个定制的UpdateRegistry方法代替使用DECLARE_REGISTRY_ RESOURCEID宏,在你的方法中,建立一个名字-值对置换表,提供给模块的注册引擎。

下面是用包含当前日期的串来替换%CURRENTDATE%变量的一个例子:

static HRESULT WINAPI

CPager::UpdateRegistry(BOOL b) {

OLECHAR wsz [1024]; SYSTEMTIME st;

GetLocalTime(&st);

wsprintfW(wsz, L"%d/%d/%d", st.wMonth, st.wDay,

st.wYear);

_ATL_REGMAP_ENTRY rm[] = {

{ OLESTR("CURRENTDATE"), wsz}, { 0, 0 },

};

return _Module.UpdateRegistryFromResource(IDR_PAGER,b, rm);

}

这个代码和注册脚本最后的运行结果是注册键 DateInstalled

将包含安装时的日期。(待续)

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有