Registering COM Applications

注册表包含安装到系统中的COM对象的信息。COM组件例现化的时候需要查询注册表,将CLSID或ProgID转化为具体的DLL或EXE的路径。

随后,系统要么将COM服务端加载到请求端的进程地址(in-process),或者加载到一个新的进程中(local and remote servers)。

剩余略。

Error Handling in COM (COM)

几乎所有的COM函数返回值类型都是HRESULT,其值可以是成功、提醒或者错误。

winerror.h定义了很多错误相关的信息。

Structure of COM Error Codes

阐述HRESULT的结构。

Using Macros for Error Handling

错误码相关的宏。

Error Handling Strategies

有一些不同facility间公共的错误码

  • E_ABORT
  • E_ACCESSDENIED

8007开头的错误指示一个系统或者网络的错误。可以使用net helpmsg <decimal_code>来查看。

比如对于8007054B,可以将054B转为十进制的1355,然后通过net helpmsg 1355查看,得到的信息是:

The specified domain either does not exist or could not be contacted.

Handling Unknown Errors

对于接口中不应该产生的未知错误,可以当作E_UNEXPECTED处理。

如果只需判断有没有错误的话,可以使用xxMethod() == NOERROR

Type Library Viewers and Conversion Tools https://docs.microsoft.com/en-us/windows/win32/com/type-library-viewers-and-conversion-tools

小结

COM主要还是一种ABI级别的组件化技术。让不同语言编写的,以及运行在不同区域的COM对象的例现,能够通过同一套ABI进行通信。

COM对象间的交互可以在同进程(分源码交互,和DLL交互两种),也可以在异进程(需要全局信息做中间人,可以本地、也可以远程)。

交互性是通过稳定的ABI保证的,ABI是对接口的一个描述,而接口又是由其中的函数布局构成。 一个函数的地址和其接受的参数构成这个函数的签名,把这些函数签名排布在接口中,让交互的双方知晓,那么就可以进行相互调用。 函数签名在接口中的位置作为交互的前提保证,不能够随便变化。 至于如何编写接口,每种语言可以有自己的做法,只要保持接口中的函数签名可以被交互方理解。

(完)