windows-8 - WinRT/Metro 应用程序限制如何实现?

标签 windows-8 microsoft-metro windows-runtime executable

Windows 8 中的新 Metro 风格/WinRT 应用对于可以调用的 API 有一定的限制。另外,您必须使用异步技术,并且您的应用程序必须可暂停,等等。我想知道如何以及是否强制执行所有这些。

新的 Metro 应用程序只是可执行程序,还是其他东西(例如,更像 COM 控件,具有一组定义的接口(interface))? API 限制是如何在编译时、运行时(通过沙箱等)或仅通过 Windows 应用商店策略(类似于 iOS 中的情况)实现的?如果我感觉不诚实,我可以吗?获取屏幕句柄并操作界面、在顶部添加 float 窗口、在后台启动某些内容,或者以其他方式突破 Metro 的限制?

我问这个问题的一个原因是我正在考虑为 Python 创建一个 WinRT 库,以便人们可以使用它来编写 Metro 应用程序。然而,Python 核心显然使用了大量非 WinRT API 调用,因此这可能从一开始就注定了。我还想了解一下 Metro 应用程序的总体结构。


编辑:根据this thread ,您可以使用 C 运行时的所有功能。看起来你可以编译调用禁止函数的东西,但“应用程序验证器”提示。我想知道如果您不关心商店,您是否可以运行这样的混合应用程序(也许以后可以通过为禁止的功能编写解决方法来使其与商店兼容)...

最佳答案

对于 Metro 风格 Windows 应用商店应用程序的功能,存在(至少)两组独立的技术限制。

首先是一组安全限制:Windows 应用商店应用程序以低权限运行,因此与系统其余部分交互的方式受到限制。例如,Windows 应用商店应用程序无法访问文件系统中的任意位置,它只能访问一组预定义位置中的文件以及系统明确授予访问权限的文件。您不能违反这些安全限制(如果可以,那将是一个相当有问题的操作系统错误)。

第二组限制是API 分区。 Windows 应用商店应用程序只允许调用应用程序分区中存在的系统函数。 MSDN 上每个系统功能的文档指定了该功能是否存在于应用程序分区中。您还可以通过查看定义函数的头文件来找到答案:函数是根据项目目标的 API 分区有条件地定义的:WINAPI_FAMILY 宏对此进行控制(请参阅 Windows 中的 winapifamily.h SDK 了解更多信息)。

如果您调用“未经批准”的函数,则结果是不确定的。它可能看起来有效;它可能会发生灾难性的失败。它可能今天工作正常,但明天就会发生灾难性故障(或者在应用 Windows 更新后,或者使用下一版本的 Windows)。

API 分区以多种方式强制执行。 header 的构造使得调用未经批准的函数困难。如果您自己定义该函数或更改 WINAPI_FAMILY,您的应用将无法通过 Windows 应用认证工具包 (WACK) 流程。我的理解是,CLR 禁止在运行时调用未经批准的 .NET 功能,尽管我不太熟悉 .NET 限制。无论如何,我的理解是,如果您的应用程序调用未经批准的函数,则无法根据 "Windows 8 app certification requirements" 将其提交到商店。 (不过,请您自己阅读这些要求;我还没有详细阅读它们,我当然无法为您解释它们)。

如果您不关心将应用程序提交到 Windows 应用商店,或者只是想编写一些测试应用程序或使用 WinRT,那么没有什么可以阻止您尝试调用未经批准的函数。例如,我发现create a console window for debugging purposes很有用。 。这看起来工作正常,而且我不太关心它是否未通过 Windows 应用商店认证,因为它仅用于调试和测试。

关于windows-8 - WinRT/Metro 应用程序限制如何实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12040390/

相关文章:

c - 应用程序关闭时保存参数

java - Windows 8 - 退出 Java 应用程序/进程而不停留在后台

named-pipes - Windows 8 命名管道创建

windows-8 - XAML 在本地命名空间中找不到引用

visual-c++ - 如何在 Metro 应用程序中写入控制台/登录 VC++?

xaml - ElementName 绑定(bind)不解析属性

c++ - 以编程方式在正确位置显示主音量控制 slider (sndvol.exe)

c# - 数组影响其他数组值C#

c# - 将元素添加到 ListView 时如何设置动画/过渡?

c# - 如何在 Windows Phone 8.1 中使用 ThemeResources 更改主题?