WinRT:Win32的面向对象替代品

WinRT作为Win32的面向对象替代品,直接位于内核之上,为Windows带来了全新的应用程序执行环境。WinRT采用C++编写,支持反射机制,并提供统一的对象模型。本文还介绍了WinRT下C++、C#、VB和JavaScript的开发特点,以及应用程序容器和权限管理等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

WinRT:Win32的面向对象替代品

转载: http://www.infoq.com/cn/news/2011/09/WinRT-API

作者 Jonathan Allen 译者 高翌翔 发布于 2011年9月18日


WinRT不是另一个抽象层;它就像Win32 API一样,直接驻留在内核之上。自从1993年Win32伴随Windows NT被引入以来,这标志着对于Windows核心的首次重大突破。WinRT与Win32截然不同,它代表了新的语义学应用程序执行环境。

Win32是按照C语言思想设计的,而WinRT API与之不同,它是用C++编写的,并且从设计之初就运用了面向对象的思想。一致性、易用性、以及性能都是新的运行时API的重要方面。WinRT API中的每个对象都支持反射,以便甚至连诸如JavaScript等动态语言都可有效地使用它们。随之而来还有统一对象模型,这对于基于库的C++而言是个稀罕物。

附注:Win32 API并未被移除,而且那些使用传统应用程序执行环境的较早的应用程序将继续按预期方式工作。

C++开发

在C++中编写用户界面将首选XAML。所有与XAML一起使用的库都已被移植到C++,并且被编译为本地x86版本。使用XAML和C++编写的Metro风格应用程序并不运行在.NET之上,它们就像其他任何Visual C++应用程序一样,被直接编译为x86版本。

调用UI控件的方法就像在C++中调用任何其他对象的方法一样。在机器码级别上,某个指令将this指针推送到堆栈上,然后通过虚函数表(v-table)调用相应函数。这使得即使在低功耗设备上也能达到最优的性能。

支持一些现代的C++应用程序所用的库,例如Boost。

重叠窗口不复存在

对话框是来自上一版Windows的核心概念,而在WinRT中它将不复存在。对于微软而言,性能成本和可用性问题已不再是理所当然的。希望使用这种模式的应用程序将要开发其他的方式来传递信息,例如消息框的方式。

另一并未纳入WinRT的库是GDI。如果某个应用程序要使用Metro风格界面,那么它需要按自上而下的方式来做,将Metro风格与经典用户界面相混合的情况是不可能出现的。

PlayTo契约

另一被公开的契约是PlayTo(由……发挥)。这使得应用程序可发送如音频及视频等媒体文件到某个charm[1]。然后那个charm将允许用户选择某个他们想用的应用程序来查看该文件。据推测,媒体文件不仅限于物理文件,而是任何可表示为数据流的媒体形式。

C#/VB:平台调用(P/Invoke)之终结

从.NET中调用本地函数通常涉及建立结构和操纵指针。而在WinRT环境下,所有的API被公开为许多可通过C#及VB直接使用的对象。这把.NET开发者置于与C++开发者平等的层面上。

应用程序的响应速度对于微软而言是非常重要的。所有耗时超过50毫秒的操作系统级别的API调用将被公开为异步操作,正是为了向开发者传递这种价值观。

JavaScript

对于Windows 8而言,第四大语言就是JavaScript。尽管它不使用XAML,但它就像本地及.NET应用程序一样,拥有对底层WinRT API的直接访问权。这不仅是个像PhoneGap一样的容器,JavaScript开发者还可获得与其他开发者所使用的同样丰富的API。

由于是JavaScript,因此所选择的UI工具包是HTML和CSS而非XAML。IE 10及Metro风格的JavaScript应用程序使用的是同一渲染引擎,尽管那些应用程序实际并不运行在浏览器中。JavaScript应用程序看起来就像任何其他Metro风格应用程序一样。

JavaScript中的用户控件几乎与C++及.NET中的控件不相上下。有些控件对于HTML渲染引擎而言是固有的,而另外一些控件则是用JavaScript编写的。这些基于JavaScript的控件都是基于div的,非常像那些使用jQuery创建的控件。

应用程序容器和应用程序权限

Metro风格应用程序运行在被称为“应用程序容器”(app container)的环境中。这似乎取代了由基于Win32应用程序所使用的窗体环境。

大多数API调用被直接发送给底层内核。然而,有些调用将被通过系统代理(system broker)路由。系统代理确保应用程序只能访问那些经用户已批准的功能。例如,当某个应用程序首次尝试访问摄像头时,服务代理(service broker)将提示用户以获取他们的批准。应用程序必须包括一份清单,其中注明该应用程序可能需要的所有限制服务。这种模式对于移动设备开发者而言将是非常熟悉的。

所有Metro风格应用程序都会运行在WinRT的应用程序容器中,而且会受到系统代理的监控,甚至连那些用C++编写的应用程序也不例外。该思想是为了限制应用程序破坏系统的能力。虽然也许并不是不可能的,但是在WinRT下创建恶意软件与在Win32中相比将会难得多。

所有Metro风格应用程序必须进行数字签名

不允许匿名应用程序。应用程序为了测试可进行自签名,但是当它们出现在应用商店里时,它们就必须使用真实证书进行签名。

译注

[1] charm,微软已将“CHARM”注册为计算机、软件产品、电气和科学产品类商标。微软将CHARM描述为计算机程序、图形用户界面软件和操作系统程序。在触摸版Windows 8中,charms在屏幕右侧;在传统版(使用鼠标和键盘)Windows 8中,charms出现在屏幕左侧。charms包括:Search(搜索)、Share(分享)、Start(开始)、Devices(设备)、Settings(设置)。详见微软申请Windows 8功能charm注册商标(图)

查看英文原文: WinRT: An Object Orientated Replacement for Win32

译者 高翌翔 基于.NET平台进行Web应用程序设计、开发,关注敏捷开发和架构设计,及各种提高代码可维护性的最佳实践。


WinRT 平台下 Qt 无法正确访问设备原生服务接口:正在搜索蓝牙设备... qt.bluetooth.winrt: Worker started qt.bluetooth.winrt: BTLE scan completed qt.bluetooth.winrt: onBluetoothLEDeviceFound: No device given qt.bluetooth.winrt: Discovered BTLE device: "79413831028628" "Bluetooth 48:39:f9:30:4f:94" Num UUIDs 0 RSSI: -62 Num manufacturer data 0 qt.bluetooth.winrt: Discovered BTLE device: "248235452300580" "AL_WBP" Num UUIDs 1 RSSI: -52 Num manufacturer data 0 qt.bluetooth.winrt: Updating data for device "AL_WBP" "E1:C4:D1:F4:7D:24" qt.bluetooth.winrt: Discovered BTLE device: "135407187949798" "Bluetooth 7b:26:f1:56:78:e6" Num UUIDs 0 RSSI: -68 Num manufacturer data 1 qt.bluetooth.winrt: Updating data for device "AL_WBP" "E1:C4:D1:F4:7D:24" qt.bluetooth.winrt: Updating data for device "AL_WBP" "E1:C4:D1:F4:7D:24" qt.bluetooth.winrt: Updating data for device "AL_WBP" "E1:C4:D1:F4:7D:24" qt.bluetooth.winrt: Updating data for device "AL_WBP" "E1:C4:D1:F4:7D:24" qt.bluetooth.winrt: Updating data for device "AL_WBP" "E1:C4:D1:F4:7D:24" qt.bluetooth.winrt: Updating data for device "AL_WBP" "E1:C4:D1:F4:7D:24" qt.bluetooth.winrt: Updating data for device "AL_WBP" "E1:C4:D1:F4:7D:24" qt.bluetooth.winrt: Updating data for device "AL_WBP" "E1:C4:D1:F4:7D:24" qt.bluetooth.winrt: onBluetoothLEDeviceFound: No device given qt.bluetooth.winrt: Updating data for device "AL_WBP" "E1:C4:D1:F4:7D:24" qt.bluetooth.winrt: Updating data for device "AL_WBP" "E1:C4:D1:F4:7D:24" qt.bluetooth.winrt: Updating data for device "AL_WBP" "E1:C4:D1:F4:7D:24" qt.bluetooth.winrt: Updating data for device "AL_WBP" "E1:C4:D1:F4:7D:24" qt.bluetooth.winrt: Discovered BTLE device: "139883855153833" "Lck1_7F393F7F0AA9" Num UUIDs 1 RSSI: -58 Num manufacturer data 0 qt.bluetooth.winrt: Updating data for device "AL_WBP" "E1:C4:D1:F4:7D:24" qt.bluetooth.winrt: Discovered BTLE device: "12916180417167" "Lck1_0BBF48587A8F" Num UUIDs 1 RSSI: -66 Num manufacturer data 0 qt.bluetooth.winrt: Updating data for device "AL_WBP" "E1:C4:D1:F4:7D:24" qt.bluetooth.winrt: Updating data for device "AL_WBP" "E1:C4:D1:F4:7D:24" qt.bluetooth.winrt: Updating data for device "AL_WBP" "E1:C4:D1:F4:7D:24" qt.bluetooth.winrt: Discovered BTLE device: "263711541014828" "Q_BASH_EFD820B9B12C" Num UUIDs 1 RSSI: -78 Num manufacturer data 0 qt.bluetooth.winrt: onBluetoothLEDeviceFound: No device given qt.bluetooth.winrt: Updating data for device "AL_WBP" "E1:C4:D1:F4:7D:24" qt.bluetooth.winrt: Updating data for device "AL_WBP" "E1:C4:D1:F4:7D:24" qt.bluetooth.winrt: Updating data for device "AL_WBP" "E1:C4:D1:F4:7D:24" qt.bluetooth.winrt: Updating data for device "AL_WBP" "E1:C4:D1:F4:7D:24" qt.bluetooth.winrt: Updating data for device "AL_WBP" "E1:C4:D1:F4:7D:24" qt.bluetooth.winrt: Updating data for device "AL_WBP" "E1:C4:D1:F4:7D:24" qt.bluetooth.winrt: Updating data for device "AL_WBP" "E1:C4:D1:F4:7D:24" qt.bluetooth.winrt: Updating data for device "AL_WBP" "E1:C4:D1:F4:7D:24" qt.bluetooth.winrt: Updating data for device "AL_WBP" "E1:C4:D1:F4:7D:24" qt.bluetooth.winrt: Updating data for device "AL_WBP" "E1:C4:D1:F4:7D:24" qt.bluetooth.winrt: Updating data for device "AL_WBP" "E1:C4:D1:F4:7D:24" qt.bluetooth.winrt: Updating data for device "AL_WBP" "E1:C4:D1:F4:7D:24" qt.bluetooth.winrt: Discovered BTLE device: "139885029570943" "Lck1_7F39857F397F" Num UUIDs 1 RSSI: -48 Num manufacturer data 0 qt.bluetooth.winrt: Updating data for device "AL_WBP" "E1:C4:D1:F4:7D:24" qt.bluetooth.winrt: Updating data for device "AL_WBP" "E1:C4:D1:F4:7D:24" qt.bluetooth.winrt: Updating data for device "AL_WBP" "E1:C4:D1:F4:7D:24" qt.bluetooth.winrt: Updating data for device "AL_WBP" "E1:C4:D1:F4:7D:24" qt.bluetooth.winrt: Updating data for device "AL_WBP" "E1:C4:D1:F4:7D:24" qt.bluetooth.winrt: onBluetoothLEDeviceFound: No device given qt.bluetooth.winrt: Discovered BTLE device: "265128349852752" "AIMA-1CE450" Num UUIDs 0 RSSI: -80 Num manufacturer data 1 qt.bluetooth.winrt: Updating data for device "AL_WBP" "E1:C4:D1:F4:7D:24" qt.bluetooth.winrt: Updating data for device "AL_WBP" "E1:C4:D1:F4:7D:24" qt.bluetooth.winrt: Updating data for device "AL_WBP" "E1:C4:D1:F4:7D:24" qt.bluetooth.winrt: Updating data for device "AL_WBP" "E1:C4:D1:F4:7D:24" qt.bluetooth.winrt: Updating data for device "AL_WBP" "E1:C4:D1:F4:7D:24" qt.bluetooth.winrt: Discovered BTLE device: "263711541014828" "Q_BASH_EFD820B9B12C" Num UUIDs 2 RSSI: -82 Num manufacturer data 1 qt.bluetooth.winrt: Updating device "Q_BASH_EFD820B9B12C" "EF:D8:20:B9:B1:2C" qt.bluetooth.winrt: Updating data for device "Lck1_7F39857F397F" "7F:39:85:7F:39:7F" qt.bluetooth.winrt: Updating data for device "AL_WBP" "E1:C4:D1:F4:7D:24" qt.bluetooth.winrt: Updating data for device "AL_WBP" "E1:C4:D1:F4:7D:24" qt.bluetooth.winrt: Updating data for device "Lck1_0BBF48587A8F" "0B:BF:48:58:7A:8F" qt.bluetooth.winrt: Updating data for device "AL_WBP" "E1:C4:D1:F4:7D:24" qt.bluetooth.winrt: Updating data for device "AL_WBP" "E1:C4:D1:F4:7D:24" qt.bluetooth.winrt: Updating data for device "AL_WBP" "E1:C4:D1:F4:7D:24" qt.bluetooth.winrt: Updating data for device "AL_WBP" "E1:C4:D1:F4:7D:24" qt.bluetooth.winrt: Updating data for device "AL_WBP" "E1:C4:D1:F4:7D:24" qt.bluetooth.winrt: Updating data for device "AL_WBP" "E1:C4:D1:F4:7D:24" qt.bluetooth.winrt: Updating data for device "AL_WBP" "E1:C4:D1:F4:7D:24" qt.bluetooth.winrt: Updating data for device "AL_WBP" "E1:C4:D1:F4:7D:24" qt.bluetooth.winrt: Updating data for device "AL_WBP" "E1:C4:D1:F4:7D:24" qt.bluetooth.winrt: Updating data for device "AL_WBP" "E1:C4:D1:F4:7D:24" qt.bluetooth.winrt: Updating data for device "AL_WBP" "E1:C4:D1:F4:7D:24" qt.bluetooth.winrt: Updating data for device "AL_WBP" "E1:C4:D1:F4:7D:24" qt.bluetooth.winrt: Updating data for device "Lck1_7F393F7F0AA9" "7F:39:3F:7F:0A:A9" qt.bluetooth.winrt: Updating data for device "AL_WBP" "E1:C4:D1:F4:7D:24" qt.bluetooth.winrt: Updating data for device "AL_WBP" "E1:C4:D1:F4:7D:24" qt.bluetooth.winrt: Updating data for device "AL_WBP" "E1:C4:D1:F4:7D:24" qt.bluetooth.winrt: Updating data for device "AL_WBP" "E1:C4:D1:F4:7D:24" qt.bluetooth.winrt: Updating data for device "AL_WBP" "E1:C4:D1:F4:7D:24" qt.bluetooth.winrt: Updating data for device "AL_WBP" "E1:C4:D1:F4:7D:24" qt.bluetooth.winrt: Updating data for device "AL_WBP" "E1:C4:D1:F4:7D:24" qt.bluetooth.winrt: Updating data for device "AL_WBP" "E1:C4:D1:F4:7D:24" qt.bluetooth.winrt: Updating data for device "Q_BASH_EFD820B9B12C" "EF:D8:20:B9:B1:2C" qt.bluetooth.winrt: Updating data for device "Q_BASH_EFD820B9B12C" "EF:D8:20:B9:B1:2C" qt.bluetooth.winrt: Updating data for device "Q_BASH_EFD820B9B12C" "EF:D8:20:B9:B1:2C" qt.bluetooth.winrt: Updating data for device "Q_BASH_EFD820B9B12C" "EF:D8:20:B9:B1:2C" qt.bluetooth.winrt: Updating data for device "AL_WBP" "E1:C4:D1:F4:7D:24" qt.bluetooth.winrt: Updating data for device "AL_WBP" "E1:C4:D1:F4:7D:24" qt.bluetooth.winrt: onBluetoothLEDeviceFound: No device given qt.bluetooth.winrt: Updating data for device "AL_WBP" "E1:C4:D1:F4:7D:24" "搜索完成,找到 8 个设备" qt.bluetooth.winrt: Using new low energy controller "创建AL_WBP控制器成功" qt.bluetooth.winrt: QLowEnergyControllerPrivateWinRTNew::connectToDevice qt.bluetooth.winrt: QLowEnergyControllerPrivateWinRTNew::registerForStatusChanges qt.bluetooth.winrt: Service discovery initiated qt.bluetooth.winrt.service.thread: QLowEnergyControllerPrivateWinRTNew::onServiceDiscoveryFinished Changing service pointer from thread QThread(0x1c2e7e78640) qt.bluetooth.winrt.service.thread: QLowEnergyControllerPrivateWinRTNew::onServiceDiscoveryFinished Changing service pointer from thread QThread(0x1c2e7e78640) qt.bluetooth.winrt.service.thread: QLowEnergyControllerPrivateWinRTNew::onServiceDiscoveryFinished Changing service pointer from thread QThread(0x1c2e7e78640) qt.bluetooth.winrt.service.thread: QLowEnergyControllerPrivateWinRTNew::onServiceDiscoveryFinished Changing service pointer from thread QThread(0x1c2e7e78640) qt.bluetooth.winrt.service.thread: QLowEnergyControllerPrivateWinRTNew::onServiceDiscoveryFinished Changing service pointer from thread QThread(0x1c2e7e78640) qt.bluetooth.winrt.service.thread: QLowEnergyControllerPrivateWinRTNew::onServiceDiscoveryFinished Changing service pointer from thread QThread(0x1c2e7e78640) qt.bluetooth.winrt.service.thread: QLowEnergyControllerPrivateWinRTNew::onServiceDiscoveryFinished Changing service pointer from thread QThread(0x1c2e7e78640) "BLE控制器完成对蓝牙设备所有服务的搜索,共发现 7 个服务:" {00001800-0000-1000-8000-00805f9b34fb} {00001801-0000-1000-8000-00805f9b34fb} {00001810-0000-1000-8000-00805f9b34fb} {0000fff0-0000-1000-8000-00805f9b34fb} {8e400001-f315-4f60-9fb8-838830daea50} {00001805-0000-1000-8000-00805f9b34fb} {0000180a-0000-1000-8000-00805f9b34fb} 找到目标服务 UUID: "{0000fff0-0000-1000-8000-00805f9b34fb}" 开始发现服务详情:currentService->discoverDetails() DiscoveringServices状态 qt.bluetooth.winrt: QLowEnergyControllerPrivateWinRTNew::discoverServiceDetails "{0000fff0-0000-1000-8000-00805f9b34fb}" qt.bluetooth.winrt.service.thread: QLowEnergyControllerPrivateWinRTNew::discoverServiceDetails Changing service pointer from thread QThread(0x1c2e7e78640) qt.bluetooth.winrt: QWinRTLowEnergyServiceHandlerNew::QWinRTLowEnergyServiceHandlerNew qt.bluetooth.winrt: QWinRTLowEnergyServiceHandlerNew::obtainCharList ServiceDiscovered状态 找到目标特征: "{0000fff4-0000-1000-8000-00805f9b34fb}" qt.bluetooth.winrt: QLowEnergyControllerPrivateWinRTNew::writeDescriptor QSharedPointer(QLowEnergyServicePrivate(0x1c2ed632c00)) 16 18 "\x01\x00" qt.bluetooth.winrt.service.thread: QLowEnergyControllerPrivateWinRTNew::writeDescriptor Changing service pointer from thread QThread(0x1c2e7e78640) qt.bluetooth.winrt: Could not obtain native service for Uuid "{0000fff0-0000-1000-8000-00805f9b34fb}" qt.bluetooth.winrt: Could not obtain native characteristic "{0000fff4-0000-1000-8000-00805f9b34fb}" from service "{0000fff0-0000-1000-8000-00805f9b34fb}" DescriptorWriteError 已开启特征通知 InvalidService状态 qt.bluetooth.winrt: Unregistering 0 value change tokens qt.bluetooth.winrt: QLowEnergyControllerPrivateWinRTNew::unregisterFromStatusChanges 设备已断开连接,服务可能失效
07-24
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值