zoukankan      html  css  js  c++  java
  • 【windows8开发】现有代码移植到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这种变相垄断而咬牙切齿抱怨不已吧,而对我们开发者而言,能做的只有一个---妥协。

    
    
  • 相关阅读:
    PAIRING WORKFLOW MANAGER 1.0 WITH SHAREPOINT 2013
    Education resources from Microsoft
    upgrade to sql server 2012
    ULSViewer sharepoint 2013 log viewer
    Top 10 Most Valuable Microsoft SharePoint 2010 Books
    讨论 Setsockopt选项
    使用 Alchemy 技术编译 C 语言程序为 Flex 可调用的 SWC
    Nagle's algorithm
    Nagle算法 TCP_NODELAY和TCP_CORK
    Design issues Sending small data segments over TCP with Winsock
  • 原文地址:https://www.cnblogs.com/secbook/p/2655094.html
Copyright © 2011-2022 走看看