在直接使用类型库时,应首先将类型库装载到内存,这可以通过多种方式进行。对于已注册到注册表中的类型库,可以使用LoadRegTypeLib()装载。 如果知道类型库的准确路径也可以通过LoadTypeLib()函数直接从磁盘装载,并在装载成功后需要调用RegisterTypeLib()完成在注册表中的注册。有时为了发布、安装方便而将类型库文件作为资源打包进dll或exe文件中,对于这种情况,可以使用LoadTypeLibFromResource()函数。在类型库装载成功后,将得到一个ITypeLib接口指针,通过该指针调用GetTypeInfoOfGuid()并将所要使用的某组件或接口的CLSID或IID作为参数传入,可以得到相关的ITypeInfo指针。通过该指针即可获取类型库中组件、接口、方法和属性等对象的全部信息。
图1 OLE文档服务体系结构
OLE文档是以结构存储方式保存对象的复合文档,它包含两方面的内容:OLE文档服务器和包容器。前者用来创建能够为包容器程序所使用的OLE文档对象,而包容器程序则采取链接或嵌入的方式将服务器合并到自己的文档。对于OLE文档服务器,可分为全服务器和小型服务器。全服务器即可以独立运行,也可以通过链接或嵌入在包容器程序中运行。小型服务器则不能独立运行,且不支持链接,只能以嵌入的方式在包容器程序中运行。包容器程序通过站点对象对这些链接或嵌入的每一个服务器对象进行管理。OLE文档主要包括现场激活、链接与嵌入等主要技术。为便于直观理解,在图1中给出了OLE文档服务体系结构的基本框架。其中主要用到了永久对象、结构化存储(structured storage)、拖放、统一数据传输以及命名与绑定等基本技术。
结构化存储机制是COM的数据存储的基础,其核心思想是在一个文件内部建立一个类似于文件系统的完整的存储结构,并以存储对象或流对象构成了此类文件系统中树状结构的各个节点,这个包含了类似于文件系统的存储结构的文件也被称为复合文件。存储对象并不存储数据信息,只记录了子存储对象和子流对象的有关信息,其关键接口为IStorage接口,客户程序可以通过该接口对存储对象进行操作。流对象则是进行数据存取的基本对象,通过流对象可以存储各种类型的数据。