Author Archive

COM笔记(一)

星期一, 5 9 月, 2011

COM组件对象模型提供了组件之间交互的规范,不依赖于任何特定的语言,它提供了一种规范、标准。

OLE(对象链接和嵌入)以COM规范为基础,继OLE后Microsoft推出的以COM规范为基础的技术统称ActiveX技术。

组件软件的关键是接口,因此,软件组件应遵从统一标准。COM就是一套公用标准,COM标准包括规范和实现两部分,规范定义了组件间的通信规则,实现则是COM库。

接口是一组逻辑上相关的函数(接口成员函数)的集合。

在COM模型中,对象本身对于客户来说是不可见的,只能通过接口请求服务。

每个接口由一个128位的GUID来标识:客户—>GUID—>接口指针—>接口成员函数。

每个对象也由一个GUID来标识,称为CLSID:客户—>CLSID—>对象的某个接口指针。可以从某个接口指针得到该对象的任意其它接口。

COM组件本身是位置透明的,即只需要调用接口,组件的加载,对象的创建由COM库完成。

COM中包容模式是对象1传递调用给对象2;聚合模型是虽然也不知道对象2的存在,但是直接返回对象2的接口给用户使用。

COM对象为什么要使用引用计数?因为客户个数及什么时候请求服务是不确定的,直接delete释放对象是不安全的。

IDL(接口描述语言)提供了一种不依赖于任何语言的接口描述方法。在VC++中使用IDL其实是MIDL工具将.idl文件编译成C/C++兼容的接口描述头文件。

接口只是一种定义,并不包括实现,具体的实现是在COM对象中,因此,接口继承只继承了成员函数的说明。

接口继承只允许单继承,为什么?因为接口的内存模型中只有一个虚指针,多重继承会出现多个!

接口原则中有一点:对于同一个对象的不同接口指针查询到的IUnkown接口必须相同。这是因为一个COM对象实现了多个接口时,其虚指针会有多个,且虚表中的IUnkown(保存其成员函数地址的位置)会有多份!

Dynamic Data Exchange

星期一, 5 9 月, 2011

DDE是一种动态数据交换机制(Dynamic Data Exchange,DDE)。

使用DDE通讯需要两个Windows应用程序,其中一个作为服务器处理信息,另外一个作为客户机从服务器获得信息。客户机应用程序向当前所激活的服务器应用程序发送一条消息请求信息,服务器应用程序根据该信息作出应答,从而实现两个程序之间的数据交换。

DDE(Dynamic data exchange)的工作原理是:
甲方申请一块全局内存,然后把内存指针PostMessage到乙方,乙方根据收到的指针访问那块全局内存。

有几个API函数是做这种事的,你在MSDN里查一下 Dde 打头的函数全都出来了。因为是已经淘汰的技术,连MFC都没对它进行封装。很难保证它同样会出现在以后的Windows API中。

Dynamic Data Exchange

PEParser

星期六, 3 9 月, 2011

PEParser的存档,至于是什么,以后再补文。

PEParser

成员们的初始化队伍

星期三, 3 8 月, 2011

下列情况必须使用member initialization list:

1. 当初始化一个reference member时;

2. 当初始化一个const member时;

3. 当调用一个base class的constructor,而它拥有一组参数时;

4. 当调用一个member class的constructor,而它拥有一组参数时。

编译器会一一操作initialization list,以适当次序在constructor之内安插初始化操作,并且在任何explicit user code之前。事实上,有一些微妙的地方要注意:list中的项目次序是由class中的members声明次序决定,不是由initialization list中的排列次序决定。

Hello, kernel!

星期三, 3 8 月, 2011

hello,Kernel!

注意几处:

1. Linux是大小写敏感的,文中的Makefile文件不能写成makefile。

2. 安装命令 sudo insmod HelloKernel.ko,卸载命令sudo rmmod HelloKernel.ko。

3. 查看内核输出命令应该是dmesg,而不是dmsg。