在MSVC中创建一个ATL项目似乎创建的不是一个而是两个项目;后者的名称与前者相同,但名称后附加了 PS。第二个项目的目的是什么?我如何判断我是否需要它?
COM 支持跨两个不同的线程、两个不同的进程或两台不同的机器进行接口方法调用。这就是所谓的编组。两个不同的线程是最常见的情况,COM 服务器通常不是线程安全的。 COM 通过将来自“错误”线程的调用编组到创建服务器的线程来为此类单线程组件类实现线程安全。当您编写进程外服务器时,进程之间会发生封送处理。不同机器之间跨网络的称为DCOM。
这是通过创建一个看起来像的接口实例来实现的exactly就像原来的一样。但接口的所有方法实际上都是替代品,它们负责编组调用的工作。这是代理。电线的另一端有一个替代品,看起来exactly类似于界面,但做相反的工作。这是存根。代理和存根协同工作,营造出您正在程序中进行简单方法调用的错觉。
代理的主要工作是将方法调用的参数序列化到内存缓冲区或网络数据包中。这可能非常简单,尤其是当您使用指向可变大小结构的指针时。 COM 需要帮助才能做到这一点,这就是 FooPS 项目的工作。当您在 .idl 文件上运行 midl.exe 时,midl 会根据接口定义自动生成代码以实现代理和存根。这通常已经足够好了,但如果 IDL 中的内置关键字不足以描述您的数据,您可能需要实现自己的关键字。
最后但并非最不重要的一点是,Windows 提供了一个标准的编组器,可以编组简单的接口。旨在支持 COM 自动化定义的 COM 子集。换句话说,从 IDispatch 派生并且仅使用自动化兼容类型的接口。您只需要正确获取注册表项即可启用它,否则不需要 midl 生成的代理/存根。当然,如果您只在一个线程上进行简单的进程内调用,那么您也不需要它。这很常见。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)