在桌面应用程序中托管城域应用程序

Hosting a metro apps inside desktop app

本文关键字:应用程序 桌面      更新时间:2023-10-16

我是Win32 C++编程的新手。现在,我想创建一个能够托管metro(AppContainer)应用程序的应用程序。使用以下COM接口似乎是可能的:

  • IApplicationDesignModeSettings(MSDN链接)
  • IApplicationActivationManager(用于启动metro应用程序)

我可以使用IApplicationActivationManager正常启动应用程序,但要在窗口内托管应用程序,需要在设计模式下启动该应用程序。为了能够在设计模式下启动应用程序,我需要设置IApplicationDesignModeSettings,它需要初始化IInitializeWithWindow(MSDN链接)。IInitializeWithWindow的Initialize()方法需要一个"代理窗口"hwnd。这就是我的问题所在。我使用标准的CreateWindow()和一个空回调创建了一个窗口,使用该窗口HWND作为IInitializeWithWindow->Initialize()参数。但是,此方法没有返回S_OK,而是返回E_ACCESSDENIED错误。为什么会发生这种情况?"代理窗口"是什么意思?可能的解决方案是什么?

由于Windows 8沙箱模型,您无法在桌面应用程序中托管Metro应用程序。Metro应用程序由一个特殊进程(wwahost.exe)托管,该进程利用代理访问系统级资源。通过任何其他进程托管Metro应用程序意味着有人可以扮演"中间人",嗅探/操纵系统请求,这是一种不可接受的风险。另一方面,您可以通过单独的虚拟机托管Metro应用程序。

相关文章: