COM中关于使用DLL的一些知识点
我们知道:COM有一个特性,就是动态链接,而动态链接,在windows中是靠DLL来实现的。为什么可以使用DLL来实现组件呢?其原因是DLL可以共享它们所链入的应用程序的地址空间。
客户和组件是通过接口进行交互的。一个接口就是一个指向函数指针的指针列表(vtbl),组件将为vtbl分配内存并用每个函数的地址来初始化此表格。为使用vtbl,客户应该能够访问组件为其vtbl分配的内存。同时它还必须能理解组件放到vtbl中的各个地址。在windows中,由于DLL与客户使用的是同一地址空间,因此访问此vtbl是没有任何问题的。
当客户得到组件的一个接口指针时,连接客户和组件的唯一中介就是接是接口的二进制结构。当客户查询某个组件的接口时,它所请求的实际上就是具有特定格式的一块内存。当组件返回接口指针时,它告诉客户的实际上就是此块内存的地址。
------------------------------------------------
不止讲DLL
------------------------------------------------
关于IID,UUID,CLSID
当初微软设计规范的时候,有两种选择来保证用户设计的组件可以全球唯一,第一种是采用和地址一样的管理方式,成立一个管理机构,用户如果想开发一个组件的时候需要向该机构提出申请,并交一定的费用。第二种是发明一种算法,每次都能产生一个组件标识符,很显然第一种方法,用户使用起来太不方便,所以微软采用第二种方法,并发明了一种算法,这种算法用来标识组件,是一个128位长的数字,一般用16进制表示。算法的核心思想是结合机器的网卡、当地时间、一个随即数来生成。从理论上讲,如果一台机器每秒产生10000000个,则可以保证(概率意义上)3240年不重复。
客户和组件是通过接口进行交互的。一个接口就是一个指向函数指针的指针列表(vtbl),组件将为vtbl分配内存并用每个函数的地址来初始化此表格。为使用vtbl,客户应该能够访问组件为其vtbl分配的内存。同时它还必须能理解组件放到vtbl中的各个地址。在windows中,由于DLL与客户使用的是同一地址空间,因此访问此vtbl是没有任何问题的。
当客户得到组件的一个接口指针时,连接客户和组件的唯一中介就是接是接口的二进制结构。当客户查询某个组件的接口时,它所请求的实际上就是具有特定格式的一块内存。当组件返回接口指针时,它告诉客户的实际上就是此块内存的地址。
------------------------------------------------
不止讲DLL
------------------------------------------------
关于IID,UUID,CLSID
当初微软设计规范的时候,有两种选择来保证用户设计的组件可以全球唯一,第一种是采用和地址一样的管理方式,成立一个管理机构,用户如果想开发一个组件的时候需要向该机构提出申请,并交一定的费用。第二种是发明一种算法,每次都能产生一个组件标识符,很显然第一种方法,用户使用起来太不方便,所以微软采用第二种方法,并发明了一种算法,这种算法用来标识组件,是一个128位长的数字,一般用16进制表示。算法的核心思想是结合机器的网卡、当地时间、一个随即数来生成。从理论上讲,如果一台机器每秒产生10000000个,则可以保证(概率意义上)3240年不重复。
下面是一个GUID的例子:
{54BF6567--1007--11D1--B0AA--444553540000}
在微软的COM中GUID和UUID、CLSID、IID是一回事,只不过各自代表的意义不同:
UUID : 代表COM组件
CLSID : 代表COM组件中的类
IID : 代表COM组件中的接口