在Windows 10中,OLE和COM的底层实现可以通过系统文件、注册表项和实际应用场景直观体现。以下是具体案例:
1. 系统文件中的COM组件:COMDLG32.OCX
- 文件路径:C:\Windows\System32\comdlg32.ocx
- 作用:提供通用对话框(如“打开文件”“保存文件”对话框)。
- 技术本质:
- 这是一个COM组件文件(通过ocx扩展名标识)。
- 它实现了IFileDialog等接口,供应用程序调用。
- 与OLE的关系:
- OLE的早期功能(如对象嵌入)需要调用这类通用对话框,但对话框本身是纯COM实现,不依赖OLE。
2. OLE的注册表标识:CLSID {00000300-0000-0000-C000-000000000046}
- 注册表位置:
- HKEY_CLASSES_ROOT\CLSID\{00000300-0000-0000-C000-000000000046}
- 作用:标识OLE 1.0的根对象(Root Object)。
- 技术本质:
- 这是OLE 1.0时代遗留的COM类标识符(CLSID)。
- 其注册表项下的InProcServer32指向C:\Windows\System32\ole32.dll,表明OLE功能由COM组件ole32.dll实现。
- 实际表现:
- 当你在旧版软件中触发OLE 1.0对象时(如嵌入文档),系统会通过此CLSID加载ole32.dll。
3. 实际应用场景:Word文档中的Excel表格嵌入
- 操作步骤:
- 在Word中插入一个Excel表格(通过“插入”→“对象”→“Excel工作表”)。
- 双击表格进入编辑模式,Word会调用Excel的功能。
- 底层实现:
- OLE层:负责界面交互(如双击激活、窗口嵌入)。
- COM层:Word通过Excel的COM接口(如Excel.Application的CLSID {00024500-0000-0000-C000-000000000046})调用其功能。
- 对应文件:
- Excel的COM实现位于C:\Program Files\Microsoft Office\root\Office16\EXCEL.EXE。
- 注册表中该CLSID的LocalServer32键值指向此EXE文件。
4. 系统级COM组件:ole32.dll和combase.dll
- 文件路径:
- C:\Windows\System32\ole32.dll
- C:\Windows\System32\combase.dll
- 作用:
- ole32.dll:提供OLE和COM的基础API(如CoCreateInstance)。
- combase.dll:Windows Runtime(WinRT)和现代COM的核心实现。
- 技术本质:
- 这些DLL是COM架构的核心运行时库,OLE功能依赖它们实现跨进程通信和接口调用。
4.如何验证?
1.通过注册表查看CLSID:
- 使用注册表编辑器(regedit),搜索Excel.Application或{00000300-...}等CLSID,观察其指向的文件路径。
2.通过任务管理器查看进程加载的模块:
- 在Word中嵌入Excel表格后,打开任务管理器→“详细信息”选项卡→右键列标题勾选“命令行”。
- 可看到EXCEL.EXE进程的命令行参数中包含-Embedding,表明它是作为COM组件被调用的。
3.使用Process Monitor工具跟踪调用链:
- 运行Process Monitor,筛选EXCEL.EXE或ole32.dll的文件操作,观察Word如何通过COM接口加载Excel。
5.贴切的比喻:COM是“乐高积木”,OLE是“搭建说明书”
-
COM(乐高积木):
乐高积木的特点是每一块都有标准化的凸起和凹槽(类似COM的二进制接口),不同颜色、形状的积木可以按统一规则拼接。- 核心特性:跨语言、跨进程的通用性。
- 例:COM组件像一块积木,无论用C++、C#还是VB编写,都能被其他程序调用。
-
OLE(搭建说明书):
说明书指导你如何用积木拼出特定模型(如一辆汽车或一座城堡),但说明书本身不提供积木,而是依赖积木的标准化接口。- 核心特性:解决具体问题(如文档嵌入),但需通过COM实现。
- 例:在Word中插入Excel表格时,OLE定义交互逻辑(如双击编辑),而COM负责加载Excel组件。
总结:文件中的OLE与COM关系
- COM是基础设施:所有COM组件的实现文件(如EXCEL.EXE、comdlg32.ocx)和系统库(ole32.dll)是技术落地的实体。
- OLE是应用场景:OLE功能(如文档嵌入)通过调用COM接口实现,但自身不单独存在实体文件。