设计可远程处理的接口
随着分布式组件对象模型的出现,即使打算仅在进程内使用,自定义接口可进行远程处理也很重要。
MIDL 不仅仅是为接口生成标头文件的方法。 它是一种用于远程处理的编程语言,可用于跨计算机、进程和线程边界使用接口。 这意味着,在向客户发布程序之前,需要在这些条件下验证 MIDL 定义的接口的行为。 如果在 IDL 中犯了错误,并且接口未正确远程处理,则很难纠正该错误。 要么必须使用新的 IID 修改接口,让旧接口保持向后兼容性,要么必须同时转换任何位置的每个客户端和每台服务器计算机。
即使永远不会在进程外使用接口,也可能会跨线程使用。 对于不支持多个单线程单元的进程内服务器,可能会出现未检查 IDL 文件的最糟糕问题。 未指定线程模型的服务器是隐式单线程服务器。 所有标记为单线程的线程都会被强制使用第一个调用的 CoInitialize 或 CoInitializeEx 的线程。 如果其他线程是激活对象的线程,则该单线程服务器上的所有接口都必须经远程处理回到激活线程,这可能会导致返回REGDB_E_IIDNOTREG,以响应 QueryInterface 调用。 除非可以绝对断言接口同时处于进程内,并且始终在同一线程上调用,否则将在某个时间进行远程处理。
最后,作为接口设计人员,需要考虑客户端应用程序如何使用接口。 这两件事共同确定接口是否在进程和计算机边界之间高效:跨接口边界的方法调用频率,以及要在给定方法调用中传输的数据量。 尽管 COM 使跨进程和跨网络调用对程序透明,但它不能使高频率和高带宽调用跨地址空间高效。 在某些情况下,更适合通常将设计接口仅作为进程内服务器实现,而其他接口更适合远程使用。