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