注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

_

_

 
 
 

日志

 
 

挑战开发者使用者习惯 微软在找死?  

2013-02-03 12:17:01|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
现有代码移植到Metro App所必须的API整合

?

windows 8 推出在即,众多软件,代码都面临移植到这个新平台的问题,由于Metro App需要基于windows runtime framework来开发,而很多传统的windows API在winRT下并不被支持,所以本文会讨论哪些现存的windows API在Metro App中能被支持,哪些不被支持需要被替换,当然讨论的内容不会涵盖所有的API,只会把重点放在一些比较基本和常用的API,比如多线程相关,文件读写,同步与事件,网络编程等API。这里的API特指win32 API和Com API, 也就是C/C++风格的API。另外说明下,本文只关注API在Metro App中是否支持,不会讨论各个API的用法和细节,想了解这点的,自己google吧。
先说明下,有两个方法可以判断当前API是否支持Metro App。
第一个方法是查MSDN中相关API的说明,在页面中会有“Applies to”这么一行,如下所示:

Applies to: desktop apps | Metro style apps

它会告诉你当前API是否支持Metro App。
第二个方法是可以去查windows 8 SDK的源码,看包含相关API的头文件中会有如下指令:
#pragma region Application Family(同时支持desktop app 和 metro app)

#pragma region Desktop Family(仅支持desktop app)

好,下面开始进入具体的各类API。
1. 绘图API
Metro App中不再支持传统的GDI以及GDI+的API,而部分支持以下API:
Direct2D
Direct3D

DirectWrite

至于部分支持哪些,可以参照如下MSDN链接。
http://msdn.microsoft.com/en-us/library/windows/apps/br205756.aspx

当然作为替代,winRT下不管是XAML还是Html+JS都有各自支持的绘图接口。html下还支持html5的canvas,css3等特性。

2. 网络Socket API
很不幸 的告诉大家,Metro App中不支持传统的winsock的API,甚至不能一一对应的去找到大家耳熟能详的那一套socket编程接口,比如socket, bind, listen, accept, connect等。对于原本就是windows平台的代码或程序就需要使用WinRT新的API(Windows.Networking.Sockets),但对于本来是跨平台的一些库或应用,就要多费些手脚了,由于在WinRT中不能一一找到原来socket API的替代,势必需要重新调整原有的架构和一些封装形式。毕竟曾经的winsock跟posix socket风格还是很相似的,想象一下要把传统的linux/posix socket API和现在风格迥异的WinRT socket API封装成统一的跨平台接口还是有点工作量的。

当然,WinRT也支持一些当前比较热的特性,比如Websocket,比如访问Rest API 常用的XMLHttpRequest(Ajax请求)等。

3. 文件存储及管理
Metro App中由于存在对本地文件读取的限制,所以不再支持大家熟悉的fopen等一系列文件读写的API,只是部分支持一些如CreateFile2,CreateDirectory等API,还是推荐开发者使用WinRT的新API,比如:

文件读取可以使用Windows.Storage.Pickers.FileOpenPicker,Windows.Storage.Pickers.FileSavePicker等API,而存储管理,文件夹管理则可以使用Windows.Storage.StorageFile,Windows.Storage.StorageFolder下的API。

4. 线程

线程这块也有较大变化,也会给既有的代码带来一定的冲击,除了还暂时支持_beginthreadex和CreateThread外(之所以说暂时,是因为这个API并不在MSDN中列出所支持的范围,只是目前在release preview版本上还可以正常工作),其他如ResumeThread,SuspendThread,TerminateThread等都不再支持,而在WinRT中,Windows.System.Threading下提供了进行多线程开发的API。

5. 同步管理与事件
Metro App中不再支持如下常用的同步管理和事件的API:
CreateEvent
CreateSemaphore
InitializeCriticalSection
WaitForSingleObject
PulseEvent

但还是部分支持带Ex后缀的一些API,比如:
CreateEventEx
CreateSemaphoreEx
InitializeCriticalSectionEx
WaitForSingleObjectEx
InterlockedDecrement
InterlockedIncrement

详细请参照如下MSDN:
http://msdn.microsoft.com/en-us/library/windows/apps/br205762.aspx
6.Dll访问
Metro App中可以正常支持FreeLibrary和GetProcAddress,但不再支持LoadLibraryEx,作为替代,可以使用LoadPackagedLibrary来载入dll。
由此可见,如果要把现有程序整合到Metro App中,还是需要一些工作才可以做到的。在ARM-based的windows 8上由于只支持Metro App,对MS以外的应用更是直接限制了对原有win32 API的访问,可想而知这对很多外部第三方软件的冲击会有多大,由于MS的限制,Chrome,Firefox将不再能支持Arm版Win8,也就是说Arm平台的Win8只可能存在MS自己的浏览器,相信现在google,firefox们也在为MS这种变相垄断而咬牙切齿抱怨不已吧,而对我们开发者而言,能做的只有一个---妥协。

  评论这张
 
阅读(574)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017