WinRT/Metro 风格应用程序中基于 ATL 的 COM 对象

Posted

技术标签:

【中文标题】WinRT/Metro 风格应用程序中基于 ATL 的 COM 对象【英文标题】:ATL-based COM objects in WinRT/Metro Style App 【发布时间】:2012-07-11 07:17:22 【问题描述】:

场景: 我正在尝试将 C++ 应用程序迁移到 WinRT/Metro 样式。此应用程序使用 ATL/COM 对象,该对象通过使用类 IDispatchImpl 实现 IDispatch 接口,但是,根据 MSDN,IDispatchImpl 不适用于 Metro 风格应用程序。

我的 ATL/COM 类如下所示:

class MyATLClass :
    public IDispatchImpl<IMyDispInterface, &IID_IMyDispInterface, &LIBID_MYLIB, 1, 0>, 
    public CComObjectRoot,
    public CComCoClass<MyATLClass,&CLSID_MyATLClass>

    ...

问题: 在 WinRT 中是否有 IDispatchImpl 的替代品?

例如,替换可能涉及从不同的类派生并丢弃我的 IDL 文件。我的最终目标只是能够在 MyATLClass 的实例上执行 QueryInterface 并通过 IMyDispInterface 获得引用。我还可以将我的所有文件(库和应用程序)包含在一个项目中,但如果可能的话,我确实希望避免更改使用 IMyDispInterface 引用的代码。

【问题讨论】:

WinRT 应用程序中允许的 COM 和 winapi 子集相当小。不只是 IDpatchImpl,对 IDispatch 的支持完全消失了。当然,您的 ATL 项目还会进行许多其他 winapi 调用。您可以通过查看 SDK 头文件 Windows Kits/8.0/shared 子目录来大致了解支持的内容。 um 中的任何内容都是禁止的。将此类应用程序移植到 Metro 通常并不容易,甚至是不可能的。 @Hans Passant 感谢您的评论。对于这个特定的库,它并没有过多地依赖 Win32,但是它的功能被暴露为一个 COM 接口。我目前正在尝试找到一种方法来定义从 IUnknown 派生的相同接口,以便我可以对其执行 QueryInterface,但到目前为止我还没有成功。 你打算如何处理你的 COM 对象?如果它是从 C++ 中使用的,则不需要 IDispatch。如果它是从 C# 中使用的,则应将其重写为 C++/CX 组件或基于 WRL 的组件。 【参考方案1】:

将我的 COM/ATL 类重新实现为基于 WRL 的组件可能是这种情况下的最佳选择(感谢 Larry)。这些视频帖子提供了更多信息:

Porting a desktop app to a Metro style app

The Windows Runtime Library (WRL)

【讨论】:

以上是关于WinRT/Metro 风格应用程序中基于 ATL 的 COM 对象的主要内容,如果未能解决你的问题,请参考以下文章

如何在基于 ATL 的服务器中正确转换和使用本机 COM 类型?

点击事件处理程序

C++基于ATL工程编写ActiveX控件步骤

向 VBScript (ATL) 公开 COM 事件

ATL(COM) 开发下 -- VS2010

构建 ATL 项目