Win8探索學習筆記

作者: gengshenghong  發布時間: 2012-03-24 13:49  閱讀: 10920 次  推薦: 4   原文鏈接   [收藏]  

  目錄

  “程序”的“安裝”

  基于JS的metro程序基礎

  基于C++的metro程序基礎

  WinRT(desktop)之Hello, World

  WinRT之語法擴展

  “程序”的“安裝”

  傳言win8改變了很多,恩,廢話。我希望試圖從開發人員關心的角度來了解一下win8,對于用戶而言,其實我覺得win8改變真的不多,無非就是修改了一下開始界面,然后程序會使用metro風格的界面,對于開發人員來說,可能變化的比較多,多了很多新名詞,我希望能對其有所了解,所以記錄一下我所看到的,當然,由于win8其實只是一個預覽版,很多東西我覺得還是會變的,所以真正的東西出來的時候或許還會有些不一樣吧。

  首先關于變化,我想到的是“程序”是如何“安裝”和“運行”的,之所以用這么多引號,是因為變化太多,我甚至不知道該不該用“安裝”等來表達。有點亂,慢慢來吧,有新的發現就更新下面的內容。

  (1) win8程序的類型

  win8新增了metro,主要是希望便于平板等觸摸設備上使用。從大的類別分,win8上的程序分為desktop和metro程序(暫且,我就這么分吧,因為據說win8會有多個版本,支持arm和x86處理器,并不是所有處理器都支持desktop和metro版本,PS:我所使用的是MS的64bit+VS11的preview 版本,安裝在VBox中)。

  對于desktop程序,只能運行在“desktop”環境下,metro風格的程序,只能運行在“metro”環境下。desktop環境,就和我們的win7類似。至于“metro",在后面還會慢慢的研究。

  (2) desktop程序如何"安裝"到"開始界面“中

  參考怎樣在Windows8桌面上創建自定義快捷方式

  說明:這里說的程序是desktop的。

  簡單來說,對于一個exe文件,通過創建其快捷方式(假設為hello.exe - shortcut),將快捷方式放到:

  C:\ProgramData\Microsoft\Windows\Start Menu\Programs

  中,或者在這里創建一個文件夾,放到文件夾中也是可以的。然后,到win8的start界面中,查找這個程序的名字hello.exe,就會出現了,用右鍵選中這個程序,就可以將其pin到start界面中。

  問題一:一個程序pin到start界面,這些pin的信息保存在哪里的?

  只要在C:\ProgramData\Microsoft\Windows\Start Menu\Programs,那么在start界面搜索都是可以出現的,那么這個比較容易理解了,搜索會自動去這個目錄下遍歷。那么哪些程序被pin了,這些信息保存在哪?相信肯定是某個注冊表項的吧,具體就不去找了。

  問題二:所有能在start界面搜索到的程序(的快捷方式)都是在上面這個目錄下保存的嗎?

  事實上,C:\Users\<username>\AppData\Roaming\Microsoft\Windows\Start Menu\Programs目錄下也是可以保存的。至于還有沒有其它目錄也可以被start界面搜索到,那就不清楚了。

  總結:傳統的desktop程序在win8下都是沒有問題的,win32的API那些東西都還是支持的,什么MFC都是可以用的,弄個快捷方式到metro風格的start界面上也是可以的,只是運行還是會自動切換到desktop模式下。下面的內容開始探索metro程序到底是怎么”運行“的。到底是二進制本地運行還是在.net虛擬機上運行,還是在一個所謂的native實際上還是“虛擬機”的解釋環境下執行,慢慢來吧。

  基于JS的metro程序基礎

  (1) Metro程序支持的開發方式和語言

  對于Metro風格應用開發,可以使用JS實現程序邏輯,結合HTML5/CSS3設計用戶接口;也可以使用C++, C#或VB結合XAML來實現用戶接口,使用Native C++或托管C#或VB來實現應用程序邏輯。對于Metro風格的C++游戲,可以使用Native C++的DX11庫和HLSL等。

  對于Win8,本地擴展允許用戶構建可重用的組件庫,可以使用C++、C#或VB構建組件,然后使用JS或者其它的支持的語言在程序中調用這些組件

  (2) 下面是Win8提供的VS11預覽版對Metro支持的工程選項

  (3) 使用JS實現的hello, metro

  實現hello, metro很簡單了,用VS 11新建一個最簡單的JavaScript工程,默認的工程模板如下:

  簡單分析一下,這里有css文件夾、images文件夾、js文件夾、winjs文件夾和default.html和一個manifest文件。其實,和一般的web程序是一樣的,default.html是“起始頁”,css和images和js文件夾是對應的一些引用的文件了。winjs文件夾,重點說明一下,是win8為基于JS的metro程序創建的一個JS庫吧,暫且理解這么多。然后package.appxmanifest,對于開發人員都很熟悉了,打包用的一個列表文件,在VS中,雙擊打開可以使用UI的方式編輯了。打開default.html,里面其實就是對其它的css/js文件的一些引用了,就是提供了一個簡單的模板工程了。

  到了這里,我已經大概猜測到了,基于JS的metro程序最后還是打包一下,放到一個“虛擬機"/"runtime"上去跑而已,原本以為MS會把JS編譯到二進制,成為native程序的,下面會進一步證明這一點。

  簡化上面的工程,刪除css、js、和winjs文件夾,最后只剩下images、default.html、package.appxmanifest的內容。事實上,這才是一個”最簡單“的基于JS的metro工程。default.html內容如下:

<!DOCTYPE html>  
<html>
<head>
    <title>Hello,metro </title>  
</head>  
<body>  
    <button>  
        Hello, Metro with JS!  
    </button>  
    <p>  
        This is an metro app implemented by JS!  
    </p>  
</body>   
</html>  

  然后,使用VS的start without debuging運行就可以切換到metro界面運行這個程序了。

  發現幾個問題:

  1. 不支持JS中的部分內容,比如alert這么常用的東西沒支持,需要使用winJS里面的一些東西去實現吧,參考http://social.msdn.microsoft.com/Forums/zh-SG/winappswithhtml5/thread/dbdabf29-206d-4d93-a491-b5e8fcd6a920提到了這個問題。

function alert(theMessage) { 
        Windows.UI.Popups.MessageDialog(theMessage).showAsync().then();
}  
  
function doingSomethingAndWantToShowAnAlert() {          
        alert("Hello Nurse");  
}

  2. VS11的智能提示有些問題,比如上面的這個JS的實現的那個Windows....就沒有任何提示,完全手寫的。

  3. 用VS運行之后,回到desktop的VS中之后,再次用VS無法運行程序(編譯沒有錯誤,問題在于運行),提示”神馬文件被其它神馬打開神馬的",一看就知道文件正在被使用,非要我用任務管理器kill掉metro程序的進程后才能用VS再次啟動。PS:要是這樣,別人邊寫程序邊測試不是要麻煩死了,跑一次就要用一下任務管理器。

  4. 上面這樣一個簡單的metro程序,占用的內存居然可以到10M以上,即使是到desktop中,進程處于suspended狀態,依然不變。PS:個人對內存占用倒是沒有太多了解,也不知道這是不是算正常,但是,不是說win8對內存管理怎么怎么優化神馬的嘛。

  5. 對于上面基于JS的metro程序,在任務管理器中,右鍵,go to details,發現,這里的details中,發現到了一個WWAHost.exe的進程,所有的自己寫的基于JS的metro程序最后都對應到一個名字為WWAHost.exe的進程上。運行了一下系統自帶的metro程序,部分程序并不是對應到WWAHost.exe的,比如IE(對應的還是IE),部分系統自帶的會對應到WWAHost.exe上,比如那個天氣程序(其可能就是基于JS寫的了)。到此,更加大膽的猜測:這個WWAHost.exe才是這些基于JS的metro程序的"虛擬機",再次讓我看到了所謂的基于JS的metro程序是native的應該是不會的了。至于更多,期待有高手去研究,我不是磚家。 

  (4) 分析基于JS的metro程序

  上面已經大概試了一下基于JS的metro程序。下面繼續分析。

  1. 工程的projects->properties

  看看JS Metro工程的projects->properties,看看有沒有什么配置選項,發現,幾乎什么也沒有,再次看到它和web的相同之處了,所以繼續大膽猜測,對于JS Metro程序,其沒有所謂的”編譯、鏈接“的概念,就是一個”打包“的過程吧,然后原封不動的丟給一個"runtime”(我喜歡也稱之為“虛擬機”)去執行,就像HTML/JS/CSS運行于IE這個"runtime/虛擬機"一樣,所以說,哪里來的native!

  2. VS 11對于JS Metro程序的錯誤機制

  為了再次看看VS 11對于html/js的處理,看看它能不能檢查”錯誤"。隨便在html里面弄點亂七八糟的,或者弄點“錯誤”的JS,比如<script>test()</script>,用VS build一下,都是不會有錯誤的,說明VS 11沒有“靜態”查錯的能力,用debug運行,是可以查到這些錯誤的。類似于Chrome的開發者工具的功能了,可見,其實基于JS的metro就是把html給runtime去解析的,類似于web在瀏覽器中運行一樣,所以,自然效率上,你懂的。

  PS:之所以我一直在分析JS Metro到底會不會native的跑,并不是說這個用runtime去跑html是不行的,而是想看看MS到底有沒有新的東西,弄一個runtime去跑HTML,早已經不是新東西了,那些基于webkit的Mobile上的”客戶端“程序都是這么個原理,真心想看到有沒有辦法把JS真的”編譯“為native去跑,當然,這樣可能或許真的很難。

  3. Build和Deploy

  既然沒有“編譯、鏈接”這些,那就看看Build菜單下有什么吧:Build和Deploy。

  我想,build應該就是打包的過程,deploy就是部署了。PS:實在不得不讓我想起了android工程,要說更類似的,讓我想起了WAC程序,打包一下,部署一下,丟給runtime去跑HTML/JS/CSS,這樣的東西在HTML5被“炒作”的今天,實在太多了!既然這樣,那就來看看VS是如何打包和部署的吧。

  先看看用Build能得到一些什么:

  在工程目錄下,有一個bld文件夾和Debug文件夾。刪除之后build還是會生成的。至于bld里面的內容,暫且不去細細研究了,用記事本打開看看,估計就是一些中間文件了(工程的manifest配置中,有一個配置Package Name的,是一串ba6a209b-2b36-4a5e-a4d8-c122dce439e0這樣的玩意,在bld里面的子文件夾的名字就是這個package name)。然后就是debug文件夾,里面生成的是一個xml、一個appxrecipe(也是xml)、一個prj文件,兩個xml都是一些配置信息吧。VS Build之后就是得到這些文件。

  那么Deploy呢:

  Build之后Deploy會生成什么呢?試試就知道了,先在Start界面上卸載掉這個程序,然后build后發現start界面上不會有這個程序,Deploy之后,程序就會出現在start界面上了。那么VS到底是部署了些什么內容呢(部署后,刪除VS工程肯定也是可以運行程序的)?

  經過查找,VS中Deploy的Metro程序都到了C:\Users\<user name>\AppxLayouts中,其中以程序的package name為文件夾組織的。其中部署的一些文件,里面就有工程的default.html,這樣,居然部署之后還可以看到程序源代碼,可見其很可能就是打個包,然后丟給“隱藏的IE“("runtime")去解析運行了。那么,這些文件是不是都是運行必須的呢?試著刪除一下,發現只有resource.prj文件是無法刪除的(只有去start界面uninstall后才可以刪除),刪除其余所有文件后,程序還是可以正常運行的,可見resource.prj里面就包含了所有運行需要的內容了(html/js/css/images等),至于這些其余的被刪除的文件有什么用,可能有些跟管理程序升級什么的有關吧。

  說明:這個部署后的程序出現在start界面上,這個start界面上的信息是在哪里保存的,或者說它怎么知道如何來啟動這個resource.prj文件,相信在某一個角落(應該是注冊表)中保存有這些信息,比如弄一個地方保存start界面上的所有應用程序的列表,對于每一個程序,有一個屬性,對于JS Metro程序,弄一個屬性叫"JS Metro"和一個屬性指定程序對應的文件的位置,然后啟動的時候根據這個就知道該如何啟動了,是啟動desktop的程序(desktop程序也可以出現在start界面上,參考前一篇),還是啟動JS Metro,或是啟動其它類型的,總之,一切都是猜測,具體,這個信息在哪里,暫時沒有興趣去找了。)

  4. 關于程序的打包Package

  這次打包才是真的打包了,到這里,一個自然的問題是,上面的程序可以build和deploy。那么如果要把程序給別人,到別人的電腦上去運行呢?

  MS引進了store的模式,具體這個store貌似還沒有建立起來,在VS的store菜單下,有一些內容,比如打包程序(Create App Package),其它的就是一些需要store帳號的東西吧,還有什么上傳到store什么的。這里就說說打包了。用Create App Pakage之后,在工程下會生成一個Packages文件夾。主要的文件就是:一個bat文件,一個安裝腳本;一個appx文件,可以理解為打包的文件了;一個cer文件,可能跟認證什么的有關。只需要運行一個bat文件,就可以在自己的電腦上安裝了。(PS:我選擇的是只在本地機器使用,所以肯定是沒有問題的,至于能不能弄到別的機器上去運行,或者說會不會必須通過MS store上傳下載,就不清楚了,總之,這模式應該跟app store很類似了)。通過這樣的方式,安裝之后就可以在start界面上看到程序了,但是這個程序總該有一些”安裝文件“吧,本以為也會在Deploy的AppxLayouts文件夾下,事實上,不在。那在哪里呢。。。。實在不想去找了,MS就知道跟我們玩神秘,偶然發現,那個C:\ProgramData\Microsoft\Windows的目錄下的AppRepository文件夾的更新時間就是我install和uninstall的時間,也就是說,很可能就是保存在這里面的。MS又跟我玩神秘,這個文件夾居然打不開,當然,肯定是權限問題,不過這個也不知道弄了個神馬權限,反正我打不開。

  總結:由于我不是磚家,上面的內容可能有點羅嗦,也很簡單,因為我也是一下午在這里坐著,想到了什么就先試試,然后馬上記錄一下內心所想,多么希望能看到MS一點創新的東西,但是實在沒有看到,除了界面上弄了一個Metro Style,本質上是沒有創新的,包括其store的模式。當然,這里只是一個基于JS的Metro的程序,基于其它的語言的Metro程序某些地方肯定是和上面的類似的,但是某些可能會不一樣。(比如,上面的html/css/js我覺得應該是運行在IE的內核的一個runtime上,就像很多Mobile上的html運行在webkit的runtime上一樣,但是基于c++的可能是可以得到一個exe可執行文件,然后native執行的,具體暫時不清楚了)。至于程序怎么寫,WinJS怎么用,這些就不該是大問題了,web該怎么弄還是怎么弄。最后,metro界面還是不錯的,就是希望真正的win8出來的時候,不要把desktop界面和metro界面雜交,metro用在PC上是在不必要,也很丑陋。

  基于C++的metro程序基礎

  本來打算像上一篇一樣看看基于C++的Metro程序都有些什么內容的,據說Metro支持Native c++,結果。。。尼瑪,昨天新建一個C++ Metro工程都可以跑的,今天就見鬼了,隨便建一個C++工程自己都編譯不過去,尼瑪VS11的bug也太多了。看了看默認生成的C++代碼,里面什么partial ref的,應該都是托管C++才有的關鍵字吧?(PS:不熟悉托管C++,所以不太清楚如何知道一段代碼屬于托管C++)懷疑:MS的C++ Metro也是使用托管C++構建那個UI。所謂的Metro支持Native C++,應該是說可以使用Native C++構建一些模塊,給其它的Metro程序(JS/Managed C++/C#/VB)去調用而已吧。這個里面,對于MS來說,根本不算新東西吧。不知道那個WinRT到底體現在哪里,到底是Native C++實現的還是托管的玩意。

  總結:從目前了解的情況,實在沒有看到win8的新內容到底在哪里,除了那個Metro Style的UI是一個創建,程序的本質上,貌似沒看到實質性的創新,無非就是:1. 借用了一些現有的“流行”的模式/實現,比如HTML/JS的支持,比如store的模式。2. 換了一些接口定義,弄了一些“忽悠”人的各種技術詞匯。當然,這只是針對C++的角度來看的,對于.NET來說,或許有很多新的東西,比如可以更好的調用Native C++什么的,具體我就不清楚了,不熟悉.NET!慢慢來吧,有了新的發現再繼續研究,至少,就目前的Preview來看,沒有更多興趣去研究了。:(

  不過,從另外來說,其實MS這樣也是沒有錯誤的,畢竟那個Metro風格,用在PC上還是不適合的,win8可能主要考慮的新的東西都在觸摸設備(平板)上的,所以,自然,對于這些應用,程序的效率也是不重要的,用托管的玩意、JS這些去整一些界面神馬的就夠了,可能我對MS的要求高了點!

  說明:這里的描述都是個人看法,很可能錯了,畢竟主流的聲音都是說winRT是一個API結合,不是一個運行時,都說基于C++的是Native的,待研究啊。。。

  參考文檔:

  http://bbs.pediy.com/archive/index.php?t-140353.html

  http://www.codeproject.com/KB/cpp/WinRTVisualCppIntro.aspx

  http://kb.cnblogs.com/page/116862/

  http://webservices.ctocio.com.cn/138/12201138.shtml

  http://topic.csdn.net/u/20110915/08/e4b7e628-a412-49d4-a8c8-0d4002d94635.html

  http://tirania.org/blog/archive/2011/Sep-15.html

  http://msdn.microsoft.com/en-us/library/windows/apps/hh454062(v=VS.110).aspx(MSDN,WinRT文檔)

  補充:

  上面是曾經的一點想法,現在看來,WinRT是基于COM的,使用C++的Metro程序理論上是可能完全Native的

  這里要補充的一點是,上面提到了用VS11建立一個C++工程突然不靈了,自己都編譯不過去,現在居然被我自己給找到解決方法了,確實應該是VS11的bug。其編譯錯誤消息是:

  Error : Manifest references file 'hellometro_withcpp.exe' which is not part of the payload.

  找了很久沒找到解決方法,類似的文章找到了"http://social.msdn.microsoft.com/Forums/zh-SG/winappswithhtml5/thread/88842e72-a620-4ee7-9a6a-d0ba52a36240",但是這個文章很容易理解,但是我這里的錯誤是exe的問題,尼瑪exe不是VS自己生成的。經過仔細分析,發現exe是生成了,打開manifest文件看看,發現里面的文件名居然被VS偷換了,我的工程命名是hellometro_withCPP,所以得到的exe是hellometro_withCPP.exe,但是那個VS自己生成的manifest居然是小寫的!手動修改namifest就可以build通過了。所以:如果你使用C++的metro工程,工程名不要使用大寫字母就不會遇到這個問題了!

  WinRT(desktop)之Hello, World
  關于WinRT的MSDN參考:http://msdn.microsoft.com/en-us/library/windows/apps/hh454062(v=VS.110).aspx

  先聲明,這里的Hello,World程序不是Metro Style的WinRT,在Metro中使用WinRT的程序可以找到很多相關的資料了(當然,網上很多文章不適合入門,都弄得太復雜)。個人還是喜歡從簡單開始,所以從Desktop程序來開始了解WinRT不是更好?

  (1) 神馬是WinRT?

  關于什么是WinRT,去網上搜吧,很多人在討論(當然,這玩意目前大多數都停留在討論階段,畢竟還是preview)。

  大概來說,WinRT是win8提供的新的API集合,不同于傳統的win32在于,WinRT以OO的方式提供API,而且WinRT支持Desktop程序,也支持Metro程序(當然,兩者支持不是完全一樣)。另外,WinRT編譯后也可以得到winmd文件,winmd是win8里面的一個很重要的東西,類似于com、.net這樣的吧,winmd可以在不同的語言(C#、C++、VB、JS)之間交叉調用(當然,是Metro程序了),個人理解winmd類似于接口定義或者接口導出的文件吧,具體慢慢研究就能理解了。

  (2) WinRT for desktop app

  簡單來說,對于桌面程序,WinRT更多的可以理解為一個語法擴展了,里面有一些新的類,一些語法的擴展等。

  (3) WinRT編譯和鏈接

  http://msdn.microsoft.com/en-us/library/windows/apps/hh441567(v=VS.110).aspx

  編譯選項:

/ZW enable WinRT language extensions  
/AI<dir> add to assembly search path  
  <dir> is the folder where the compiler searches the winmd files    
/FU<file> forced using assembly/module  
  force the inclusion of the specified winmd file  
/D "WINAPI_FAMILY=2"  
  set this define to compile against the ModernSDK subset of Win32  

  鏈接選項:

/APPCONTAINER[:NO]  
  marks the executable as runnable in the appcontainer (only)  
/WINMD[:{NO|ONLY}]  
  emits a winmd; if “ONLY” is specified, does not emit the executable, but just the winmd  
/WINMDFILE:filename  
  name of the winmd file to emit  
/WINMDDELAYSIGN[:NO]  
/WINMDKEYCONTAINER:name  
/WINMDKEYFILE:filename  
  used to sign the winmd  file  

  選項就不一一介紹了,說得很清楚了,關鍵還是來試試。 

  (4) Hello, World with WinRT

  如下:

// File: hello_winRT.cpp  
#include <stdio.h>  
#include <windows.h>
#include <iostream>  
#include <string>  
using namespace Platform;
int main()  
{  
    String^ str1="a test";        
    std::wstring wstr(str1->Data());  
    std::wstring wstr1(str1->Data(), str1->Length());    
    std::wcout<< wstr << std::endl;  
    std::wcout<< wstr1 << std::endl;    
    //  printf("%s\n",wstr.c_str());  
    //  printf("%s\n",wstr1.c_str());    
    system("pause");  
    return 0;  
}  
  
// Compile with:  
// set_vs_vars.bat  
// cl hello_winRT.cpp /ZW /AI%winmd% /EHsc /MD  
// Result:  
// hello_winRT.cpp(24) : warning C4447: 'main' signature found without threading model. Consider using 'int main(array<Platform::String^>^ args)'. 

  說明:在命令行下運行這里的命令編譯就可以了,為了簡化書寫,我先用了一個簡單的bat設置了一下環境變量,如下:

@echo OFF  
rem ## file: set_vs_vars.bat  
  
set winmd="C:\Program Files (x86)\Windows Kits\8.0\Windows Metadata"  
echo winmd:  
echo        %winmd%  
  
rem ##set env of vs  
echo setting vs environment...  
call "C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\Tools\vsvars32.bat";  
echo done  

  這個,你懂的。

  說明一下上面的CPP的內容:

  這里使用的是WinRT的String,using namespace Platform; 是必須的,WinRT的命令空間吧,String^是WinRT的類型吧,其它就沒什么了。關于編譯選項,/ZW和/AI是必須的,指定使用WinRT和搜索winmd文件的路徑(WinRT定義在winmd文件中),/MD也是必須的,不知道為何/MT編譯會出錯,神馬重定義了,這個沒去研究,有興趣的可以去看看。/EHsc不是必須的,不使用會有一個警告,這個選項是設置是否使用VS的異常了。另外,使用上面的選項編譯后,還是有一個警告,說main的簽名不對,還給出了建議,結果,我改成它的建議之后,就說沒有入口點,尼瑪玩我啊!沒有具體去研究這個“入口”的問題,參考下面的文章,有這么使用main的,不過都是用vs編譯的吧,沒試過:

  http://msdn.microsoft.com/en-us/library/br229585

  http://code.msdn.microsoft.com/DWriteHelloWorld-760793d2/sourcecode?

fileId=44736&pathId=309807482

  PS:關于winmd文件,有時間再去研究,這里有一篇文章http://www.cnblogs.com/waninlezu/articles/win8MetaData.html,貌似可以用ILSpy打開winmd文件。上面的hello, world編譯后會生成一個winmd文件和一個exe文件,后面再研究這個吧。

  WinRT之語法擴展

  參考:http://msdn.microsoft.com/en-us/library/windows/apps/hh454076(v=VS.110).aspx

  (1)WinRT對象和引用計數

  WinRT是一個OO的庫,所以都是以對象的形式操作。在WinRT中,使用引用計數管理對象,關鍵字ref new新建一個對象,返回的是對象的指針,但是在WinRT中,使用^符號替代*,仍然使用->操作符使用對象的成員方法。另外,由于使用引用計數,不需要使用delete去釋放,對象會在最后一個引用失效的時候自動被釋放。

  說明:WinRT內部是使用COM實現的,對于引用計數,在底層,WinRT對象是一個使用智能指針管理的COM對象。

Platform::String^ str1 = "str1";  
Platform::String^ str2 = str1;  
Platform::String^ str3 = ref new Platform::String(L"str3");  

  注意:這里的str1,是對象的“指針”,和std::string的使用不一樣。 

  (2)WinRT中的數字類型

bool    b    = true;  
char    c8   = 'A';  
char16  c16  = L'A';                // same as wchar_t  
int8    i8   = 0x12;                // same as char  
int16   i16  = 0x1234;              // same as short  
int32   i32  = 0x12345678;          // same as int, long  
int64   i64  = 0x1234567890abcdef;  // same as long long, __int64  
int8    ui8  = 0x12;                // same as unsigned char  
int16   ui16 = 0x1234;              // same as unsigned short  
int32   ui32 = 0x12345678;          // same as unsigned int, unsigned long  
int64   ui64 = 0x1234567890abcdef;  // same as unsigned long long, __uint64  
float32 f32 = 12.34E-23;            // same as float  
float64 f64 = 1234.56E-234;         // same as double, long double  

  C++的數字類型會被自動轉換為WinRT對應的類型,比如從一個標準的C++函數返回一個數字值,賦值給winRT類型。

  說明:這些類型都定義在Platform命名空間中。 

  (3)ref class實現自定義類

  用ref class標記一個自定義類,就可以使用winRT的對象的方式使用這個類了。當然,在類中,是可以混合使用標準C++的一些類型的。

  (4)Value struct結構體

  如果一個類只包含數據成員,那么就可以使用value struct定義:

value struct Coordinates  
{  
  float64 Latitude;  
  float64 Longitude;  
};  
  
value struct City  
{  
  Platform::String^ Name;  
  int64 Population;  
  int Altitude;  
  Coordinates Coordinates;  
};  

  (5)WinRT中的property

  在WinRT中,使用property關鍵字聲明共有數據成員,而且,還可以為property設置訪問它的時候get()、set()的邏輯。

ref class Prescription  
{  
private:  
  Platform::String doctor_;  
  int quantity_;  
public:  
  property Platform::String Name;  
  property Platform::String Doctor  
  {  
    Platform::String get() { return doctor_; }  
  }  
  property int Quantity  
  {  
    int get() { return quantity_; }  
    void set(int value)  
    {  
      if (value <= 0) { throw ref new Platform::InvalidArgumentException(); }  
      quantity_ = value;  
    }  
  }  
}  

  (6)WinRT定義接口

  WinRT也能實現類似于標準C++的接口功能,當然,標準C++本身并沒有提供接口這一概念(很多新的語言如C#、Java都有提供),但是標準C++使用純虛類是可以實現這一功能的。WinRT使用interface關鍵字來定義一個類為接口類(只需要聲明方法,而不需要實現的類),然后就可以被其它的ref class去繼承和實現接口了。

  (7)WinRT委托、事件、partial類等

  WinRT還有一些其他的語法擴展,委托、事件等,發現這些擴展都跟C#一樣了,所以不繼續廢話了。直接看參考鏈接吧。

  PS:以為會有一些特別的地方,發現都是C#的舊東西了。

4
0
 
 
 

文章列表

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()