Win8探索學習筆記
目錄
傳言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程序如何"安裝"到"開始界面“中
說明:這里說的程序是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實際上還是“虛擬機”的解釋環境下執行,慢慢來吧。
(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程序都有些什么內容的,據說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?
PS:關于winmd文件,有時間再去研究,這里有一篇文章http://www.cnblogs.com/waninlezu/articles/win8MetaData.html,貌似可以用ILSpy打開winmd文件。上面的hello, world編譯后會生成一個winmd文件和一個exe文件,后面再研究這個吧。
參考: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#的舊東西了。