c++ - 我的 $Foo ATL 解决方案中的 ($Foo)PS 项目有什么用?

标签 c++ visual-studio com atl

在 MSVC 中创建 ATL 项目似乎创建的不是一个而是两个项目;后者与前者命名相同,但在其名称后附加了 PS。第二个项目的目的是什么?如何判断我是否需要它?

最佳答案

COM 支持跨两个不同的线程、两个不同的进程或两台不同的机器进行接口(interface)方法调用。这称为编码。两个不同的线程是最常见的情况,一个 COM 服务器通常不是线程安全的。 COM 通过将来自“错误”线程的调用编码到创建服务器的线程来为此类单线程 coclass 实现线程安全。当您编写进程外服务器时,会发生进程之间的编码。跨网络的不同机器之间称为 DCOM。

这是通过创建一个与原始界面完全相似的接口(interface)实例来实现的。但是接口(interface)的所有方法实际上都是完成调用编码(marshal)工作的替代品。这是代理。在电线的另一端,有一个替代品,它看起来完全 像界面,但功能相反。这是 stub 。代理和 stub 一起工作,营造出您正在程序中进行简单方法调用的错觉。

代理的主要工作是将方法调用的参数序列化到内存缓冲区或网络数据包中。这可能非常不重要,尤其是当您使用指向可变大小结构的指针时。 COM 需要帮助才能做到这一点,这就是您的 FooPS 项目的工作。当您在 .idl 文件上运行 midl.exe 时,midl 会从接口(interface)定义中自动生成代码以实现代理和 stub 。这通常已经足够好,但如果 IDL 中的内置关键字不足以描述您的数据,您可能需要自己实现。

最后但同样重要的是,Windows 提供了一个标准编码器,可以编码简单的接口(interface)。旨在支持 COM 自动化定义的 COM 子集。换句话说,从 IDispatch 派生且仅使用自动化兼容类型的接口(interface)。您只需要正确获取注册表项即可启用它,否则不需要 midl 生成的代理/ stub 。当然,如果您只在一个线程上进行简单的进程内调用,那么您也不需要它。这很常见。

关于c++ - 我的 $Foo ATL 解决方案中的 ($Foo)PS 项目有什么用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9582733/

相关文章:

c++ - 如何使用 libfacerec Opencv 库获得相似度百分比

c++ - 将变量导入 DLL

c++ - 我可以像在 C++ 中那样在 R 中拥有多个独立的随机数生成器吗?

c# - 在 Visual Studio 中运行 PowerShell 脚本时无法获取 Active Directory 终端服务属性

c++ - vs c++ dll - 标量删除析构函数

c - 在 C 中检索数组的用户输入

asp.net - ASP.NET处理程序,手动线程和COM服务器

c++ - 重载 Iostream C++

c# - 将 NULL 传递给 COM 接口(interface)方法的 ref/out 参数

c++ - "pure"IDispatch 接口(interface)是否需要代理/ stub DLL?