【发布时间】: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 的组件。
标签: c++ com microsoft-metro windows-runtime atl