4

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

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

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

4

1 回答 1

0

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

于 2013-10-09T04:30:16.540 回答