在桌面应用程序中托管Metro应用程序

4

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

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

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


我不太确定这是否可能。 - Andy
你提到的接口,我推测是Visual Studio和Blend用于构建Windows Store应用的,因此设计模式 - 你是在构建某种类型的附加组件/测试框架吗? - Jim O'Neil
这个项目的主要目的是满足我的好奇心 :D。 我知道这是可能的,因为像stardock的start8和RetroUI pro这样的软件已经实现了这一点。 - jamestut
如果您展示实际的代码可能会有所帮助。我注意到IApplicationDesignModeSettings只允许每个进程调用一次Initialize(),所以您的应用程序中是否有其他东西已经在您之前调用了Initialize()?或者您的应用程序需要以管理员身份运行,或者需要对代码进行签名,才能让IApplicationDesignModeSettings允许您的应用程序托管Metro应用程序? - Remy Lebeau
@RemyLebeau 这是代码链接。我调用了一次,我的应用程序处于提升模式(管理员)。是的,该应用程序未经签名。 - jamestut
@RemyLebeau 在签名exe之后,E_ACCESSDENIED问题仍然存在。 - jamestut
1个回答

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接