装箱百万奖金,第六届全国工业互联网数据创新应用大赛火热报名中! 了解详情
写点什么

将现有 C++ 代码移植到 Windows 8/Windows Phone 8

  • 2012-11-16
  • 本文字数:1282 字

    阅读完需:约 4 分钟

将 C++ 应用程序向 Windows 8/Windows Phone 8 迁移时,首先要考虑的是用户界面。几乎没有哪个应用的界面能适合以触摸为中心的 Windows 8 界面。UI 层有四个选项:

  • DirectX 与 C++
  • XAML 与 C++
  • XAML 与.NET
  • Windows RT 之上的 HTML5

因为 UI 需要重写而非移植,本文不会涉及这些技术。

很多 Win32 和 COM API 直接无法使用了。其他 API 也会受到一些限制,因此即便有的 API 仍然存在,其行为与过去可能也不太一样。之所以限制这些 API,除安全性之外,还因为它们对电池续航时间有负面影响,或者因为无法匹配新的应用程序生命周期。此外,所有的 GDI 子系统都被禁用。

与传统的 COM 不同,开发者无法定义自己的跨应用通信协议。而且因为套接字限制,简单地监听本地端口也不再有效。这一决策背后的基本理论是“WinRT 应用程序应该是完全隔离的”。这意味着开发者无法一次性安装一个应用程序集。

开发者可以通过宏 WINAPI_FAMILY_PARTITION 来获取编译错误信息,从而确定哪些 API 不再支持。这个过程可能会让人有点沮丧,比如下面这种情形:如果禁用的 API 调用使用了缺失的结构体,那么缺失结构体的报错信息会分散开发者的注意力。

微软的 Tarek Madkour 建议使用 Windows 应用程序验证工具包(Windows Application Certification Kit)而非宏来迁移现有的库。我们可以这样做,创建一个新的基于 XAML 的应用程序,并引用所有要移植的库。然后运行一次该应用程序以便它部署在计算机上。下一步对应用程序运行验证工具包,这样就可以生成需要替换或移除的 API 列表。

这方面还有一个资源:Windows 应用商店应用中 Windows API 的替换选择( Alternatives to Windows APIs in Windows Store apps )。

线程

WinRT 不支持经典的 CreateThread API 调用。这种功能一般使用 WinRT ThreadPool 类来实现。WinRT ThreadPool 的一个主要缺点是标准的 Windows 应用程序没有相应支持。下面几个可选项没有类似限制。

对于寻求高级抽象的人而言,并行模式库任务( Parallel Patterns Library Tasks )提供了另一种选择。

更低层次地访问可以使用 C++ 的 std::thread std::future 。从更广的角度看,微软想要在其所有的设备和操作系统上支持标准 C++。

最底层的选择是 VC++ 运行时的 beginthread 函数。根据 Tarek 的说法,它提供了“最强的能力,不过控制不好可能砸到自己的脚”。不过这里请注意:Tarek 的说法与微软的描述正相反,上面链接说不支持该 API。

异步

许多要基于 Windows 8 开发应用程序的 C#、VB 和 C++ 开发者应该熟悉新的异步模式与 lambda 表达式语法。

库的暴露

虽然大部分库可以直接用 C++ 编写,但是任何需要暴露给其他语言的部分都应该选择以 C++/CX 编写的组件的形式。从性能上看,这种方式一般比正常的 C++ 链接方式要差,因此 C++ 程序不应使用这样的库。

WinRT 应用程序既不支持 C 也不支 C++/CLI。

查看英文原文 Porting Existing C++ Code to Windows 8/Windows Phone 8


感谢贾国清对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ )或者腾讯微博( @InfoQ )关注我们,并与我们的编辑和其他读者朋友交流。

2012-11-16 10:512318
用户头像
臧秀涛 略懂技术的运营同学。

发布了 300 篇内容, 共 123.3 次阅读, 收获喜欢 32 次。

关注

评论

发布
暂无评论
发现更多内容

vue的几个提效技巧

yyds2026

Vue

全彩LED显示屏在单位形象的作用

Dylan

LED显示屏 全彩LED显示屏 led显示屏厂家

如何搭建知识库网页?

Baklib

英国国民信托 CIO:如何讲好可持续发展故事

雨果

CIO

实验精神终将胜利:量子纠缠的祛魅七十年

脑极体

epoll的实现原理

C++后台开发

数据结构 后台开发 linux开发 epoll C++开发

聊聊Vuex原理

yyds2026

Vue

KunlunBase功能体验范例

KunlunBase

MySQL 数据库

外包学生管理系统

早安

架构

Apache RocketMQ 5.0 在Stream场景的存储增强

阿里巴巴云原生

阿里云 云原生 Apache RocketMQ

RocketMQ Streams在云安全及 IoT 场景下的大规模最佳实践

阿里巴巴云原生

阿里云 云原生 Apache RocketMQ

【指针】有哪些类型?

Geek_65222d

10月月更

我奋斗了 18 年才和你坐在一起喝咖啡

宇宙之一粟

解读Vue3模板编译优化

yyds2026

Vue

如何制作企业在线产品手册?这里有一些简单的方法!

Baklib

如何打造优秀的客户体验?

Baklib

客户体验 客户体验管理

这几款小程序插件可以让效率翻倍

Geek_99967b

小程序

Python基础(十四) | Python之禅与时间复杂度分析

timerring

Python 时间复杂度 10月月更 python之禅

Flowable 设置任务处理人的四种方式

江南一点雨

Java springboot flowable JavaEE

5分钟带您了解DSL、以太网线缆和光纤之间的区别,值得收藏!

wljslmz

dsl 光纤 以太网 10月月更

企业如何低成本快速搭建团队知识库,实现企业知识管理?

Baklib

强引用、软引用、弱引用、幻象引用的区别

zarmnosaj

10月月更

展示出你的创意,知识库搭建也可以这样玩!

Baklib

测试过程中遇到的那些奇葩bug

测吧(北京)科技有限公司

测试

小程序容器技术,或许是提升智能设备安全等级的又一解决方案

Speedoooo

浏览器安全 小程序容器

量化自动套利分红机器人系统开发(成熟技术)

开发微hkkf5566

【一Go到底】第十天---位运算and移位运算符

指剑

Go golang 10月月更

企业级低代码开发平台有哪些?

优秀

企业级低代码平台 企业级低代码

顶级理解!阿里这份Github星标63.7K的Redis高级笔记简直不要太细

程序知音

Java 数据库 redis 架构 后端技术

详解webpack构建优化

Geek_02d948

webpack

Apache SeaTunnel(Incubating) 2.2.0-beta 版本发布!API 重构,连接器与引擎解偶

Apache SeaTunnel

数据同步 Seatunnel 版本发布 数据集成平台 新版本/特性发布

将现有C++代码移植到Windows 8/Windows Phone 8_C++_Jonathan Allen_InfoQ精选文章