HABIT IS POWER

习惯就是力量

0%

本文首发于 http://www.cnblogs.com/linyehui/ 这里是我的Blog备份。

引子

说好了这节要介绍Windows Store上架前的准备工作,怎么标题变成了Win32代码移植?这不是坑爹么!

还真不是,对于Win32程序员来说,提交应用到Windows Store,你可能遇到的最大的问题就是Win32代码移植。

我这么说是有原因的,且听我一一道来,先来看看目前的形势:

  1. 我们在Win32下已经积累了多年的代码,如果全部抛掉,在WinRT下重新造一套轮子,SQLite,ZLib这些第三方库且不说,我们和我们公司的祖祖辈辈们一起开发的业务相关的功能库难道也全部重写?这个代价是不是有点大了?
  2. WinRT支持部分Win32 API和部分.NET API

想到上面两点,作为一个成熟的Win32程序员,很自然的你会想到,用老的代码稍微组合拼凑下,看看在WinRT下能不能跑起来?

只要你运气不是太差的话你将发现:新建了个WinRT的工程,把Win32的代码文件拖进去,很轻松的就能编译通过,甚至一次通过,很欢畅的跑起来了呢~

没白跟着微软混这么多年啊!

但是得但是,你别高兴的太早,因为想要提交到Windows Store,能编译通过还不算数,还要经过微软的“重重审核”,这其中就有一项微软要求开发者在提交应用之前必须自己在本地审核通过的项目:

Windows App Certification Kit Validate Metro style App
2012050723263913.png

如果你的应用无法通过这个认证,就更无法通过微软的审核了,而阻碍你通过认证最大的障碍就来自于Win32移植过来的代码,这也是本文的重点所在。

提交Store之前的准备工作之Metro Style Apps 认证:

一、如何认证

1、制作安装包:

1.1 认证的安装包必须使用Release,使用Debug是无法通过的
1.2 右键主exe工程,选择Store,Create App Package,最后提交Store是需要使用”Create a package to upload to the Store or to use locally”进行打包的,但是认证的话使用”Create a package to use locally only”也是可以的
2012050723282777.png
2012050723285063.png
2012050723291338.png
2012050723294233.png
制作好安装包后,直接点击”Launch Windows App Certification Kit”按钮,就能开始认证了,类似下图,在对你的应用一阵蹂躏后你就能得到认证结果了:
2012050723362013.png
这个方法是最简单的,但有时候会出问题,所以我下面介绍下手动安装和认证的方法

2、手动安装

2.1 制作出来的安装包目录下,会有一个Add-AppxDevPackage.bat文件,以管理员权限运行,就能安装了

PS. 虽然这个步骤很简单,但还是可以有些诡异的问题,大家留意下下面这两点

2.2 安装包所在的路径如果包含中文会导致安装失败
2.3 如果你是从别的机器拿过来的安装包,那么你可能由于没有开发者证书而导致安装失败
解决方法:打开VS,新建一个工程,编译时会出现提示让你申请开发者证书,按提示输入Live ID就可以了;
其实还有不用安装VS就可以获取Live ID的方法,这个就另外找地方再给大家介绍了

3、手动认证

3.1 从Charm中搜索应用程序,找到Windows App Cert Kit,运行
2012050723330675.png
3.2 选择Validate Metro style App,进入后找到你的应用,选中,然后开始跑认证
2012050723333844.png
点下“Next”,又是一阵蹂躏之后,你就能得到想要的认证结果了
2012050723340136.png

二、认证结果的分析

认证过程其实比较简单,认证结果是一个xml文件,我们需要的是全部PASS。
2012050723380747.png
2012050723345174.png

如果有Failed的项就需要根据提示来进行修正,然后重新编包,重新认证,直到认证通过为止。
而今天我们要说的最重要的部分,就在于,认证结果中的Use of Supported Platform

APIs这个部分,如果认证不通过应该怎么处理?

2012050723384590.png
2012050723385716.png

1、为什么认证会不通过

其实字面意思已经很清楚了,就是使用了这些不被支持的API导致的,那究竟哪些函数是被支持的呢?
微软的网站上面有详细的API列表,大家可以查阅:
Win32 and COM for Metro style apps
上面的链接比较分散,我当初在做移植时专门做了个简单的拼接,方便查阅:[转载[合集]Win32 and COM for Metro style apps]

2、怎样认证通过

把不被支持的函数换成被支持的,或者去掉不被支持的函数调用,改用WinRT自己的API。

说的很简单,有些事情做起来可能那么轻松,我这里列出一些简单的函数移植对应关系:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
CreateEvent->CreateEventEx
CreateFileW->CreateFile2
CreateMutexW->CreateMutexEx
WaitForSingleObject->WaitForSingleObjectEx
GetTickCount->(DWORD)GetTickCount64
DeleteFileA->DeleteFileW
FormatMessageA->FormatMessageW
GetDiskFreeSpaceA->GetDiskFreeSpaceW
GetFileAttributes->GetFileAttributesEx
GetFileSize->GetFileInformationByHandleEx
GetFullPathName-> :(
GetTempPathA-> :(
GetVersionExW-> :(
InitializeCriticalSection->InitializeCriticalSectionEx
LoadLibrary->don't use this at best,alothough ther is LoadPackagedLibrary can use
LockFile->LockFileEx
UnLockFile->UnLockFileEx
OutputDebugStringA-> don't use
SetFilePointer->SetFilePointerEx
SetThreadPriority-> :(

可以看到,不是所有函数都有直接可以替换的函数,更有像socket这类API,整套API WinRT都不允许你使用,这种你只能使用WinRT自己提供的那套新API来替换了。

关于Win32下的开源代码库

类似ZLib这种优秀的开源代码,一个字都不用改就能直接在WinRT下编译通过且顺利通过认证,他们的优势在于代码使用纯C标准库实现;
而像SQLite这样的使用了部分Windows API的开源库,想要通过WinRT认证就得费点心思了,好在SQLite团队已经开始进行这件事情,大家着急的话可以自己从这里找到并下载SQLite的WinRT分支代码:http://www.sqlite.org/src/timeline?r=winrt  截至目前(2012/5/7 11:55)SQLite的WinRT分支还没合入trunk

自己的开发的代码库就更得自己移植了

我们当时移植的过程中,被折磨的最残的是对socket的支持,上面说到WinRT不允许使用WinSock,而我们的底层是基于异步socket的,为了平滑的移植我们的底层库,我们用StreamSocket这样的“高级”API适配出了“低级”的socket,这个恶心的过程以及这块的代码另外找机会再和大家分享交流。

小结:

很多跨平台移植性好的代码还是能很容易的移植到WinRT上,对于Win32程序员来说绝对是个好消息,这里也提醒大家在写跨平台代码时还是尽可能的使用C标准库的函数,这样在进行跨平台移植时才能做到事半功倍。

更详细的提交应用到Windows Store的细节和注意事项,都可以参考微软的官方文档:
Selling apps
Certification requirements for Windows apps

不是一般的坑爹,工程稍微大一点,性能就差得像一坨屎!

好在VS2011后关起来方便了很多,因为一开始就做Win8,而Win8的内部版本又经常变,每次重装之后我都要遭受下IntelliSense的折磨,我甚至不记得自己是否成绩写过类似的文案来记录如何去掉这个恶心的东西。

IntelliSense关闭方法:

1
2
Tools->OPtions->Text Editor->C/C++->Advanced->IntelliSense
Disable IntelliSense 改成True

其他语言的关闭方法类似

本文首发于 http://www.cnblogs.com/linyehui/ 这里是我的Blog备份。

WinRT, Windows Runtime 是微软的下一代API体系,在Build大会上为人们所熟知。
如果说Windows 8是微软的未来的话,那么WinRT则是Win32的未来,对于千千万万的Win32程序员们来说,如果还想继续在Windows平台下发展,那么了解、学习并熟悉WinRT就是你居家旅行的不二之选。

目录:

  • 一、什么是WinRT

  • 二、开发环境

  • 三、Hello WinRT

一、什么是WinRT

说起WinRT,我们必须先看下这样一张图片:

2012033015101194.png
这种图片来源于2011年9月13号在美国洛杉矶举办的Build 2011,从图上我们可以发现:

  1. Windows 8 整个系统分成了Metro style和Desktop两个体系,而WinRT则是全新的Metro应用程序架构的基础所在;
  2. WinRT具备了多语言的支持能力,不仅支持C/C++,还支持.NET的主力语言C#和VB,同时还支持HTML下最普及的JavaScript;
  3. WinRT和Win32、.NET是相互独立的API体系;

提示

实际上WinRT还支持部分Win32和.NET的API,我们可以从这里找到
Win32 and COM for Metro style apps

[http://msdn.microsoft.com/en-us/library/windows/apps/br230232(v=vs.110).aspx .NET for Metro style apps]

  1. WinRT是专门为触屏体验的Metro style Apps实现的一套全新的APIs,但是我们却能从他身上看到很明显的.NET、WPF、Sliverlight的影子,作为系统原生API的WinRT,让我们有理由相信他可以做的比.NET更加优秀;
  2. WinRT之上程序员可以使用HTML相关技术来开发应用,可以预见这里肯定会是HTML5+WinRT的一个整合,这也是一个值得我们期待的开发方向。

二、开发环境

2012年2月29号,微软在MWC 2012上发布了Windows 8 Consumer Preview,同时更新了对应的开发工具和开发文档,这些都可以从微软的网站上面找到并下载:

Metro style app development

使用WinRT进行开发,我们需要:

  1. Windows 8 Consumer Preview(截止目前2012/3/30,这是你能下载到的最新的Windows 8)
  2. Visual Studio 11 Beta(Ultimate或者Express都可以,但是只有Ultimate才能使用VAssistX)
  3. 嗯,没了,要说还有的话就是你需要一个Live ID,在第一次使用VS新建工程时, 你会被要求输入Live ID以获得开发者证书,没有这个证书你将无法进行调试和运行你的代码。

想安装Visual Studio 11又不想用微软的在线安装器?

这里提供下微软的Visual Studio 11 Beta Ultimate的离线ISO下载页面地址:
Visual Studio 11 Ultimate Beta ISO 离线安装包

安装后的截图如下:

2012033015415481.png

三、Hello WinRT

开始Say hello之前请确认下你是否已经安装好了Windows 8,并在上面安装好了Visual Studio 11,都装好了?哦,让我们开始体验WinRT开发吧

作为一个Win32程序员,我们最熟悉的自然是C++,所以这里新建了Metro style Apps类型下的C++工程,然后拖了一个TextBlock进来,好了,F5,Hello WinRT

2012033016450389.png
2012033016451984.png

下一节我将介绍:Windows Store上架前的准备工作

由于我们算是世界上最早一批开始进行WinRT第三方应用开发的团队,我们在代码迁移上被迫走在了世界的前面,这其中就包括了SQLite、ZLib等。

对于开源库的使用,不得赞叹下ZLib的代码优雅程度,纯C,全平台移植没有任何问题,包括刚刚出来的WinRT!

相比之下SQLite的代码就没那么漂亮了,2011年的12月份我差不多有一周的时间是专门在做Win32到WinRT的移植,其中最痛苦的就是SQLite部分,在我看来这个代码实在是比较搓,但是为了赶进度,我还是硬着头皮把事情给搞定了。

随着时间的推移,我们觉得我们有必要更新下我们的SQLite版本,于是下载了最新的稳定代码3.7.10,发现代码还是进行了不少重构,优雅了一点,但是还是一样无法通过WinRT的Application Certification,没办法,我就又准备把之前干过一次的代码移植重来一遍,基本都是写API切换,类似LockFileW改成LockFileEx,CreateFileW改成CreateFile2之类的,这项工作本身没有太大的技术含量,主要就是阅读代码的能力,还有就是要足够细心,剩下的就是体力活了。

在这期间我突然发现自己放了一个错误,疏忽了一件事情:开源参与者的热情及开源代码的更新速度!我还是太容易陷入一个点,就无法自拔,看不到周围的其他方案。

在同事的提醒下,我们发现SQLite WinRT分支其实已经进行了一段时间,我Review下分支上面的代码,基本和我之前的改动是一致的,只是目前还在分支上,没有合入trunk。

这个事情其实去年我专门找过,但当时还没有这样的分支,但是过了3个月后的现在我竟然没有想到: 按照开源项目的效率,这些事情很可能已经在解决或者已经被解决了。

感谢开源代码的贡献者们,期待SQLite 3.7.11


附注:

从代码提交记录看,SQLite官方2012-06-06之后的版本就已经支持WinRT了:代码合入信息

问题

Windows 8 Consumer Preview下,用Windows App Certification Kit认证自己的应用,认证到一半卡住了,10分钟了都没动静,连系统都卡死了,于是我长按“Power”键进行了暴力重启,重启之后就悲剧了:Windows App Certification Kit 一启动就Crash!!!

方案一,重装SDK

在微软官网下载了包含Windows App Certification Kit的SDK进行安装,但是发现根本没用,难不成我只能重装系统吗?!!

方案二,删除配置文件

好在我有Everything,换了两个关键字后,我找到了他的配置文件所在

我用的关键字:

  1. App Certification Kit
  2. AppCertKit

找到的配置路径:

C:\Users\XXXX\AppData\Local\Microsoft\AppCertKit

把AppCertKit路径下的文件全部删了,就可以解决问题。

在接触Git之前,我是SVN的拥护者,我还自己搭建本地的SVN服务器来管理我的文档,这里就从个人文档管理的角度来阐述我选择Git而非SVN的理由。

1、不用搭服务器

我自己搭SVN服务器用的是VisualSVN,于是我在最初接触Git时我还想VisualSVN为什么不出一个VisualGit呢?

后面,我发现是我自己错了,VisualGit对于Git这样一个分布式版本管理系统是不需要的,因为你的任何一个git clone就能得到一个“服务器”,也就是说git close就是一个“SVN 服务器”,而且非常方便。

2、独立的.git目录

git的本地数据库是全部放在一个独立目录下的,一般会把目录名命名为xxxx. git,如果你需要备份你的代码,你只需要把这个目录照顾好就可以了。

(当然SVN在1.7之后也改成了这样的方式,但依然没有分布式的理念)

这里再推荐一个利器:Gitbox=git+dropbox

用这个方法你可以非常方便的做到:免费的,安全的,带有版本信息的,支持移动办公的文档管理系统

分布式的好处?

我在向别人推荐Git时多次被问及这个问题,但我总是解释不清楚,我想有一个好的比喻可能是:

在你习惯了使用dropbox之前,你很难想象这样一个简单的同步工具能为你的工作带来多大的便利,谁爽谁知道!

分布式其实是个很简单的理念,和盈利模式类似,那些吹的天花乱坠的理念无疑都是坑爹的,简单才是王道。

Win8下的多语言实现,可以参考这几个说明:

Localizing the package manifest
QuickStart: Make your Metro style app world ready

修改工程的默认语言

其中有一个默认语言的说法,这个在哪里设置呢?

用记事本打开工程的vcxproj文件,搜索:

1
<DefaultLanguage>zh-CN</DefaultLanguage>

对的,修改这个就可以修改你的应用的默认语言了

多语言时在.resw文件中使用\n等特殊字符

  1. 直接在VS2011中打开.resw文件的话使用VS的编辑器打开,在其中配置了字符串如”\n“后你会发现,展示在界面上时变成了”\n“!
  2. 坑爹吧,于是你可能想到应该把”\n”用转义符:”&#13;”替换,嗯,不错的思路,不过还是错的,因为这个时候实际会变成:”&#13;”!
  3. 还是坑爹啊,告诉你答案吧:不要用VS的编辑器打开,用文本格式打开.resw文件,手动添加”&#13;”就可以了

帮助我解决这个问题的参考文章:

WPF和字符串格式化

回头发现,其实你需要回车的话可以直接在VS的编辑器中按:Shift+Enter

C++程序员和C#程序员的Visual Studio设置在Visual Studio第一次安装的时候会进行一次选择,如果第一次选错了,后面如何改选呢?

Visual Studio 11 可以这么来:
Tools->Import and Export Settings->Reset all settings

我记得自己以前都是直接去删除VS的整个配置目录,然后他就会自己提示重新设置了

2000

Win8QQ Twitter: Win8QQ Twitter

Win8QQ 腾讯微博: Win8QQ 腾讯微博

PS.

Win8QQ是针对Windows 8 Metro UI的全新体验版本,只能从Windows Store上下载;

Windows 8 Desktop下还是继续使用QQ2011,还有即将面世的QQ2012

本博客非官方博客,所有消息均为“小道消息” :)