COM编程深入解析:从基础到高级应用
1. COM概述与错误处理
将COM描述为面向对象(OO)存在一定争议,因为其基本形式不支持实现继承,而很多人认为这是面向对象的基本特性。不过,只要API想基于对象工作,就会使用COM。
大多数COM API在成功时返回标准的S_OK返回码(值为0),所以多数情况下,HRESULT仅在错误时才有用。但如果遇到特殊情况,最好如实表示签名。
使用Win32 API时,多数采用不同的错误处理方式:
- 很多Win32 API通过返回true或false来报告成功或失败,有些则通过返回表示无效句柄的特殊值来指示失败。
- 若要了解操作失败的原因,可调用Win32的GetLastError方法获取每个线程的错误值。在C#中,可调用Marshal类的GetLastWin32Error方法获取该错误。
- 需要注意的是,当你调用GetLastWin32Error时,CLR可能已代表你进行了其他API调用,可能会覆盖之前的错误码。因此,若要获取错误信息,需将DllImport属性的SetLastError字段设置为true。
2. COM互操作性
CLR的互操作服务支持COM,COM长期以来一直是Windows上本地代码的语言无关、面向对象API的基础。COM互操作不是一个独立的特性,任何方法都可以接受或返回COM对象。
2.1 运行时可调用包装器(RCW)的生命周期
当本地代码首次将特定的COM对象传递给托管代码时,CLR会为其创建一个运行时可调用包装器(RCW)。CLR会先检查是否已有该对象的包装器,如果有且未被垃圾回收,则会重用它,以确