﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-C++ Coder-随笔分类-Windows RT</title><link>http://www.cppblog.com/jackdongy/category/20083.html</link><description>HCP高性能计算架构，实现，编译器指令优化，算法优化，
  LLVM   CLANG   OpenCL   CUDA   OpenACC    C++AMP   OpenMP   MPI</description><language>zh-cn</language><lastBuildDate>Fri, 23 Nov 2012 10:38:39 GMT</lastBuildDate><pubDate>Fri, 23 Nov 2012 10:38:39 GMT</pubDate><ttl>60</ttl><item><title>Windows 8实例教程系列 - 理解应用框架 </title><link>http://www.cppblog.com/jackdongy/archive/2012/11/22/195572.html</link><dc:creator>jackdong</dc:creator><author>jackdong</author><pubDate>Thu, 22 Nov 2012 13:04:00 GMT</pubDate><guid>http://www.cppblog.com/jackdongy/archive/2012/11/22/195572.html</guid><wfw:comment>http://www.cppblog.com/jackdongy/comments/195572.html</wfw:comment><comments>http://www.cppblog.com/jackdongy/archive/2012/11/22/195572.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jackdongy/comments/commentRss/195572.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jackdongy/services/trackbacks/195572.html</trackback:ping><description><![CDATA[<p style="font-family: Verdana, Arial, Tahoma; color: rgb(51,51,51); padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; line-height: 25px; padding-right: 0px; background-color: rgb(255,255,255)"><img style="cursor: pointer" border="0" alt="" src="http://www.silverlightchina.net/uploads/allimg/121112/1_121112225815_1.jpg" width="419" height="129" /><br style="padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; padding-right: 0px" />&nbsp;</p>
<p style="font-family: Verdana, Arial, Tahoma; color: rgb(51,51,51); padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; line-height: 25px; padding-right: 0px; background-color: rgb(255,255,255)">&nbsp;</p>
<div>Windows 操作系统之所以风靡世界，是因为其&#8220;易学易用&#8221;，从用户的角度出发，让数以万计的非IT人员使用计算机实现娱乐，工作等目的。Windows 8继承Windows桌面的优点，同时提供一种新的用户体验模式 － Windows store风格。换句话说，Windows 8操作系统存在两种不同风格的应用。 本篇将介绍Windows 8应用框架以及开发工具的使用。</div>
<p><strong>理解Windows 8应用框架</strong></p>
<p>正如前文所说，Windows 8具有两个不同风格的应用，Windows store应用和传统Windows桌面应用。两种风格应用使用不同的UI引擎，不同的服务和工具，以及不同的API. 但是，都运行在同一个Windows 8操作系统内核下。</p>
<p><img style="cursor: pointer" border="0" alt="" src="http://www.silverlightchina.net/uploads/allimg/121120/1_121120162254_1.jpg" width="444" height="491" /><br />&nbsp;</p>
<p>我们简单对比一下两种应用：</p>
<p>&nbsp;</p>
<table style="border-collapse: collapse; width: 419.4pt" cellspacing="0" cellpadding="0" width="419" border="1">
<tbody>
<tr style="height: 27.85pt">
<td style="border-top: windowtext 1pt solid; height: 27.85pt; border-right: windowtext 1pt solid; border-bottom: windowtext 1pt solid; padding-bottom: 0cm; padding-top: 0cm; padding-left: 5.4pt; border-left: windowtext 1pt solid; padding-right: 5.4pt; width: 209.7pt" width="210">
<p><strong>Windows store<span style="font-family: 宋体">应</span><span style="font-family: 'ＭＳ 明朝','serif'">用</span></strong></p></td>
<td style="border-left-style: none; border-top: windowtext 1pt solid; height: 27.85pt; border-right: windowtext 1pt solid; border-bottom: windowtext 1pt solid; padding-bottom: 0cm; padding-top: 0cm; padding-left: 5.4pt; padding-right: 5.4pt; width: 209.7pt" width="210">
<p><strong><span style="font-family: 宋体">传统</span>Windows<span style="font-family: 宋体">桌面应用</span></strong></p></td></tr>
<tr style="height: 36.7pt">
<td style="border-top-style: none; height: 36.7pt; border-right: windowtext 1pt solid; border-bottom: windowtext 1pt solid; padding-bottom: 0cm; padding-top: 0cm; padding-left: 5.4pt; border-left: windowtext 1pt solid; padding-right: 5.4pt; width: 209.7pt" width="210">
<p>Windows store<span style="font-family: 宋体">应</span><span style="font-family: 'ＭＳ 明朝','serif'">用</span><span style="font-family: 宋体">增加触控操作，独特的手势操作，提高用户体验性</span></p></td>
<td style="border-top: medium none; height: 36.7pt; border-right: 1pt solid; border-bottom: 1pt solid; padding-bottom: 0cm; padding-top: 0cm; padding-left: 5.4pt; border-left: medium none; padding-right: 5.4pt; width: 209.7pt" width="210">
<p><span style="font-family: 宋体">传统</span><span style="font-family: 'ＭＳ 明朝','serif'">桌面</span><span style="font-family: 宋体">应</span><span style="font-family: 'ＭＳ 明朝','serif'">用主要操作模式是基于鼠</span><span style="font-family: 宋体">标</span><span style="font-family: 'ＭＳ 明朝','serif'">和</span><span style="font-family: 宋体">键盘</span><span style="font-family: 'ＭＳ 明朝','serif'">操作</span><span style="font-family: 宋体">应</span><span style="font-family: 'ＭＳ 明朝','serif'">用</span></p></td></tr>
<tr style="height: 36.7pt">
<td style="border-top-style: none; height: 36.7pt; border-right: windowtext 1pt solid; border-bottom: windowtext 1pt solid; padding-bottom: 0cm; padding-top: 0cm; padding-left: 5.4pt; border-left: windowtext 1pt solid; padding-right: 5.4pt; width: 209.7pt" width="210">
<p><span style="font-family: 宋体">应</span><span style="font-family: 'ＭＳ 明朝','serif'">用开</span><span style="font-family: 宋体">发</span><span style="font-family: 'ＭＳ 明朝','serif'">基于</span>.Net Framework Windows 8 API</p></td>
<td style="border-top: medium none; height: 36.7pt; border-right: 1pt solid; border-bottom: 1pt solid; padding-bottom: 0cm; padding-top: 0cm; padding-left: 5.4pt; border-left: medium none; padding-right: 5.4pt; width: 209.7pt" width="210">
<p><span style="font-family: 宋体">应</span><span style="font-family: 'ＭＳ 明朝','serif'">用开</span><span style="font-family: 宋体">发</span><span style="font-family: 'ＭＳ 明朝','serif'">基于</span>Win32 API,<span style="font-family: 'ＭＳ 明朝','serif'">或者</span>Net Framework</p></td></tr>
<tr style="height: 36.7pt">
<td style="border-top-style: none; height: 36.7pt; border-right: windowtext 1pt solid; border-bottom: windowtext 1pt solid; padding-bottom: 0cm; padding-top: 0cm; padding-left: 5.4pt; border-left: windowtext 1pt solid; padding-right: 5.4pt; width: 209.7pt" width="210">
<p>Windows store<span style="font-family: 宋体">应</span><span style="font-family: 'ＭＳ 明朝','serif'">用不推荐大量使用</span><span style="font-family: 宋体">对话</span><span style="font-family: 'ＭＳ 明朝','serif'">框</span><span style="font-family: 宋体">进</span><span style="font-family: 'ＭＳ 明朝','serif'">行人机交互，而推荐使用</span><span style="font-family: 宋体">页</span><span style="font-family: 'ＭＳ 明朝','serif'">面</span><span style="font-family: 宋体">导航的模式进行交互，这种方式更象使用浏览器前进后退的功能进行交互。</span></p></td>
<td style="border-top: medium none; height: 36.7pt; border-right: 1pt solid; border-bottom: 1pt solid; padding-bottom: 0cm; padding-top: 0cm; padding-left: 5.4pt; border-left: medium none; padding-right: 5.4pt; width: 209.7pt" width="210">
<p><span style="font-family: 宋体">传统应</span><span style="font-family: 'ＭＳ 明朝','serif'">用以</span><span style="font-family: 宋体">对话</span><span style="font-family: 'ＭＳ 明朝','serif'">框</span><span style="font-family: 宋体">为</span><span style="font-family: 'ＭＳ 明朝','serif'">主要人机交互方式</span></p></td></tr>
<tr style="height: 36.7pt">
<td style="border-top-style: none; height: 36.7pt; border-right: windowtext 1pt solid; border-bottom: windowtext 1pt solid; padding-bottom: 0cm; padding-top: 0cm; padding-left: 5.4pt; border-left: windowtext 1pt solid; padding-right: 5.4pt; width: 209.7pt" width="210">
<p><span style="font-family: 'ＭＳ 明朝','serif'">在部署方面，用</span><span style="font-family: 宋体">户</span><span style="font-family: 'ＭＳ 明朝','serif'">不需要了解</span><span style="font-family: 宋体">应</span><span style="font-family: 'ＭＳ 明朝','serif'">用安装文件等信息，</span><span style="font-family: 宋体">仅</span><span style="font-family: 'ＭＳ 明朝','serif'">需要在</span>Windows store<span style="font-family: 宋体">下载安装即可。</span></p></td>
<td style="border-top: medium none; height: 36.7pt; border-right: 1pt solid; border-bottom: 1pt solid; padding-bottom: 0cm; padding-top: 0cm; padding-left: 5.4pt; border-left: medium none; padding-right: 5.4pt; width: 209.7pt" width="210">
<p><span style="font-family: 宋体">在部署方面，传统</span><span style="font-family: 'ＭＳ 明朝','serif'">桌面</span><span style="font-family: 宋体">应</span><span style="font-family: 'ＭＳ 明朝','serif'">用需要一定的安装和注册流程</span></p></td></tr></tbody></table>
<p>&nbsp;</p>
<p><strong>Windows 8传统桌面应用框架</strong></p>
<p>Windows 8传统桌面应用可以根据分为三类，分别是Win32应用，.Net应用和HTML应用。</p>
<p>1.&nbsp;Win32应用主要开发语言为C，C++或VB。该应用被直接编译为CPU代码运行在Win32 API上，其用户界面实现必须使用GDI或者GDI+。</p>
<p>2. .Net应用主要开发语言为C#，VB.NET。该应用被编译为中间语言(IL)，然后再被转换为CPU代码运行在CLR(Common Language Runtime)环境。其用户界面实现使用<a href="http://silverlightchina.net/html/zhuantixilie/getstart/2012/0818/18244.html" target="_blank">XAML语言</a>。</p>
<p>3. HTML应用主要开发语言为HTML/CSS和JavaScript，该应用基于浏览器运行。</p>
<div><br />&nbsp;</div>
<div><img style="cursor: pointer; height: 416px; width: 680px" border="0" alt="" src="http://www.silverlightchina.net/uploads/allimg/121120/1_121120164128_1.jpg" width="805" height="483" /><br />&nbsp;</div>
<div>&nbsp;</div>
<div><strong>&nbsp;Windows store应用框架</strong></div>
<div>&nbsp;</div>
<div>基于相同的Windows 8操作系统内核，Windows Store应用共享相同的API层，称为Windows Runtime APIs。无论使用C/C++,或者基于.Net的C#/VB.NET或者HTML5/JavaScript任何一种开发语言都可以轻松调用WinRT API类库，实现本地应用操作。</div>
<div>值得一提的是，微软综合当前最流行的HTML5/CSS3/JavaScript技术，使Web开发人员可以轻松开发Windows store本地应用。另外，基于XAML的Silverlight和WPF技术都成为Windows 8操作系统部分，不再需要安装插件支持。而Silverlight/WPF开发人员，可以继续使用相关开发技能从事Windows Store应用开发。<br />&nbsp;</div>
<div><img style="cursor: pointer; height: 405px; width: 686px" border="0" alt="" src="http://www.silverlightchina.net/uploads/allimg/121120/1_121120164147_1.jpg" width="817" height="485" /></div>
<div>&nbsp;</div>
<div>&nbsp;</div>
<div><strong>Windows Runtime框架</strong></div>
<div>&nbsp;</div>
<div>从上面图例可以看出，Windows&nbsp;Runtime是Windows 8应用框架重要组成部分之一。微软将WinRT视为继2002年.Net Framework发布后最大的革新。作为Windows Store应用设计和开发人员，从微软设计原则考虑，Windows&nbsp;Runtime不仅仅是一套简单的API类库，而是一套独立完整的能够支持Windows&nbsp;Store应用风格的运行环境。<br />&nbsp;</div>
<div><img style="cursor: pointer" border="0" alt="" src="http://www.silverlightchina.net/uploads/allimg/121120/1_121120225748_1.png" width="609" height="405" /><br />&nbsp;</div>
<div>&nbsp;</div>
<div>Windows&nbsp;Runtime的<strong>优点</strong>：</div>
<div>&nbsp;</div>
<div>1. WinRT运行在Windows 8核心层之上，为Windows Store应用提供API支持访问本地资源，例如GPS，摄像头，麦克等。</div>
<div>2. Windows Store应用运行在安全沙箱中，所以，该应用可以被认为安全的managed的应用。当应用尝试使用未授权本地资源时，WinRT将提示用户是否赋予系统存取权限。</div>
<div>3. 传统Win32 API独立于操作系统内核服务，而WinRT是Windows 8操作系统组成部分之一。 与Win32相比，WinRT更加稳定，其内存管理更加优化，对于应用和系统性能都有很大的提高。</div>
<div>4. WinRT支持本地异步操作，这是对于移动设备而言至关重要的特性。</div>
<div>&nbsp;</div>
<div><strong>语言映射层(Language Projection)</strong></div>
<div>Windows 8应用支持多种开发语言，而不同开发语言，需要通过Language Projection映射到Windows Runtime运行环境，开发人员不需要担心语言之间的转换，整个过程都是编译器自动完成。</div>
<div>值得一提的是，通过语言映射层，开发人员可以在同一个项目中使用不同的开发语言开发项目功能，在随后的文章中，我将提供相应实例演示。</div>
<div>&nbsp;</div>
<div><strong>如何选择Windows Store应用开发语言</strong></div>
<div>对于Windows Store应用开发语言选择，有以下几个建议提供参考：</div>
<div>1. 对于具有Windows应用开发经验的开发人员而言，C#和C++是最好的选择，相比而言，C#基于.Net Framework，其应用为Managed，比较容易学习掌握。而C++更加贴近底层应用开发。</div>
<div>2.&nbsp;对于具有Web应用开发经验的设计和开发人员而言，HTML5/CSS3/JavaScript是最好的选择。类似PhoneGap框架，Windows 8将提供一个Web Host承载运行编译后的HTML应用，使其达到本地化的效果。</div>
<div>3. 对于具有宏操作经验的开发人员而言，VB.Net是一个不错的选择，其应用开发与微软Office VBA应用开发类似。</div>
<div>&nbsp;</div>
<div>&nbsp;</div>
<div>今天就说到这里。</div>
<div>
<p>学习XAML描述语言，请看：<a href="http://silverlightchina.net/html/zhuantixilie/getstart/2012/0818/18244.html" target="_blank">Windows 8 XAML实例教程系列</a></p></div><br /><a href="http://blog.csdn.net/jv9/article/details/8208209">http://blog.csdn.net/jv9/article/details/8208209</a><img src ="http://www.cppblog.com/jackdongy/aggbug/195572.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jackdongy/" target="_blank">jackdong</a> 2012-11-22 21:04 <a href="http://www.cppblog.com/jackdongy/archive/2012/11/22/195572.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Windows 8 C++/CX字符串 </title><link>http://www.cppblog.com/jackdongy/archive/2012/10/29/194043.html</link><dc:creator>jackdong</dc:creator><author>jackdong</author><pubDate>Mon, 29 Oct 2012 13:51:00 GMT</pubDate><guid>http://www.cppblog.com/jackdongy/archive/2012/10/29/194043.html</guid><wfw:comment>http://www.cppblog.com/jackdongy/comments/194043.html</wfw:comment><comments>http://www.cppblog.com/jackdongy/archive/2012/10/29/194043.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jackdongy/comments/commentRss/194043.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jackdongy/services/trackbacks/194043.html</trackback:ping><description><![CDATA[<a href="http://www.cnblogs.com/linzheng/archive/2012/07/29/2614014.html">http://www.cnblogs.com/linzheng/archive/2012/07/29/2614014.html</a><br /><br />&nbsp;&nbsp;&nbsp;&nbsp; 在C++/CX里面是使用Platform::String类来表示字符串的类型，在windows运行时的接口和方法中，需要使用Platform::String来作为字符串参数的传递。如果需要使用标准C++的字符串类型如wstring或者string的时候，可以将Platform::String与标准的C++的字符串进行互相的转换。 
<p>&nbsp;</p>
<p><strong>String类型的构造</strong></p>
<p>String类型表示的是char16的字符串，可以直接通过字符串的赋值来进行构造也可以使用标准C++的wchar_t*指针进行构造。</p>
<div style="font-size: 13px; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; border-bottom: #cccccc 1px solid; word-break: break-all; padding-bottom: 4px; padding-top: 4px; padding-left: 4px; border-left: #cccccc 1px solid; padding-right: 5px; width: 98%; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Initializing&nbsp;a&nbsp;String^&nbsp;by&nbsp;using&nbsp;string&nbsp;literals</span><span style="color: #008000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;String</span><span style="color: #000000">^</span><span style="color: #000000">&nbsp;str1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">Test</span><span style="color: #000000">"</span><span style="color: #000000">;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;ok&nbsp;for&nbsp;ANSI&nbsp;text.&nbsp;uses&nbsp;current&nbsp;code&nbsp;page</span><span style="color: #008000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;String</span><span style="color: #000000">^</span><span style="color: #000000">&nbsp;str2(</span><span style="color: #000000">"</span><span style="color: #000000">Test</span><span style="color: #000000">"</span><span style="color: #000000">);<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;String</span><span style="color: #000000">^</span><span style="color: #000000">&nbsp;str3&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;L</span><span style="color: #000000">"</span><span style="color: #000000">Test</span><span style="color: #000000">"</span><span style="color: #000000">;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;String</span><span style="color: #000000">^</span><span style="color: #000000">&nbsp;str4(L</span><span style="color: #000000">"</span><span style="color: #000000">Test</span><span style="color: #000000">"</span><span style="color: #000000">);<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">Initialize&nbsp;a&nbsp;String^&nbsp;by&nbsp;using&nbsp;another&nbsp;String^</span><span style="color: #008000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;String</span><span style="color: #000000">^</span><span style="color: #000000">&nbsp;str6(str1);<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;auto&nbsp;str7&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;str2;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Initialize&nbsp;a&nbsp;String&nbsp;from&nbsp;wchar_t*&nbsp;and&nbsp;wstring</span><span style="color: #008000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;wchar_t&nbsp;msg[]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;L</span><span style="color: #000000">"</span><span style="color: #000000">Test</span><span style="color: #000000">"</span><span style="color: #000000">;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;String</span><span style="color: #000000">^</span><span style="color: #000000">&nbsp;str8&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">ref</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;String(msg);<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;std::wstring&nbsp;wstr1(L</span><span style="color: #000000">"</span><span style="color: #000000">Test</span><span style="color: #000000">"</span><span style="color: #000000">);<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;String</span><span style="color: #000000">^</span><span style="color: #000000">&nbsp;str9&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">ref</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;String(wstr1.c_str());<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;String</span><span style="color: #000000">^</span><span style="color: #000000">&nbsp;str10&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">ref</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;String(wstr1.c_str(),&nbsp;wstr1.length());<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span></div>
<p>&nbsp;</p>
<p><strong>字符的操作</strong></p>
<p>&nbsp;String提供了相关的方法来操作字符串，其中可以使用String::Data()方法来返回一个String^ 对象的wchar_t*指针。</p>
<p>&nbsp;</p>
<div style="font-size: 13px; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; border-bottom: #cccccc 1px solid; word-break: break-all; padding-bottom: 4px; padding-top: 4px; padding-left: 4px; border-left: #cccccc 1px solid; padding-right: 5px; width: 98%; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Concatenation&nbsp;</span><span style="color: #008000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;auto&nbsp;str1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">Hello</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;World</span><span style="color: #000000">"</span><span style="color: #000000">;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;auto&nbsp;str2&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;str1&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;from&nbsp;C++/CX!</span><span style="color: #000000">"</span><span style="color: #000000">;&nbsp;&nbsp;&nbsp;&nbsp;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;auto&nbsp;str3&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;String::Concat(str2,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;and&nbsp;the&nbsp;String&nbsp;class</span><span style="color: #000000">"</span><span style="color: #000000">);<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Comparison</span><span style="color: #008000"><br /><img onclick="this.style.display='none'; Codehighlighter1_206_218_Open_Text.style.display='none'; Codehighlighter1_206_218_Closed_Image.style.display='inline'; Codehighlighter1_206_218_Closed_Text.style.display='inline';" id="Codehighlighter1_206_218_Open_Image" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img onclick="this.style.display='none'; Codehighlighter1_206_218_Closed_Text.style.display='none'; Codehighlighter1_206_218_Open_Image.style.display='inline'; Codehighlighter1_206_218_Open_Text.style.display='inline';" id="Codehighlighter1_206_218_Closed_Image" style="display: none" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif"></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(str1&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;str2)&nbsp;</span><span id="Codehighlighter1_206_218_Closed_Text" style="border-top: #808080 1px solid; border-right: #808080 1px solid; border-bottom: #808080 1px solid; border-left: #808080 1px solid; display: none; background-color: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_206_218_Open_Text"><span style="color: #000000">{&nbsp;</span><span id="Codehighlighter1_208_216_Closed_Text" style="border-top: #808080 1px solid; border-right: #808080 1px solid; border-bottom: #808080 1px solid; border-left: #808080 1px solid; display: none; background-color: #ffffff">/**/</span><span id="Codehighlighter1_208_216_Open_Text"><span style="color: #008000">/*</span><span style="color: #008000">&nbsp;<img src="http://www.cppblog.com/Images/dot.gif"  alt="" />&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000">&nbsp;}</span></span><span style="color: #000000"><br /><img onclick="this.style.display='none'; Codehighlighter1_248_260_Open_Text.style.display='none'; Codehighlighter1_248_260_Closed_Image.style.display='inline'; Codehighlighter1_248_260_Closed_Text.style.display='inline';" id="Codehighlighter1_248_260_Open_Image" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img onclick="this.style.display='none'; Codehighlighter1_248_260_Closed_Text.style.display='none'; Codehighlighter1_248_260_Open_Image.style.display='inline'; Codehighlighter1_248_260_Open_Text.style.display='inline';" id="Codehighlighter1_248_260_Closed_Image" style="display: none" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(str1</span><span style="color: #000000">-&gt;</span><span style="color: #000000">Equals(str2))&nbsp;</span><span id="Codehighlighter1_248_260_Closed_Text" style="border-top: #808080 1px solid; border-right: #808080 1px solid; border-bottom: #808080 1px solid; border-left: #808080 1px solid; display: none; background-color: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_248_260_Open_Text"><span style="color: #000000">{&nbsp;</span><span id="Codehighlighter1_250_258_Closed_Text" style="border-top: #808080 1px solid; border-right: #808080 1px solid; border-bottom: #808080 1px solid; border-left: #808080 1px solid; display: none; background-color: #ffffff">/**/</span><span id="Codehighlighter1_250_258_Open_Text"><span style="color: #008000">/*</span><span style="color: #008000">&nbsp;<img src="http://www.cppblog.com/Images/dot.gif"  alt="" />&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000">&nbsp;}</span></span><span style="color: #000000"><br /><img onclick="this.style.display='none'; Codehighlighter1_284_296_Open_Text.style.display='none'; Codehighlighter1_284_296_Closed_Image.style.display='inline'; Codehighlighter1_284_296_Closed_Text.style.display='inline';" id="Codehighlighter1_284_296_Open_Image" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img onclick="this.style.display='none'; Codehighlighter1_284_296_Closed_Text.style.display='none'; Codehighlighter1_284_296_Open_Image.style.display='inline'; Codehighlighter1_284_296_Open_Text.style.display='inline';" id="Codehighlighter1_284_296_Closed_Image" style="display: none" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(str1&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;str2)&nbsp;</span><span id="Codehighlighter1_284_296_Closed_Text" style="border-top: #808080 1px solid; border-right: #808080 1px solid; border-bottom: #808080 1px solid; border-left: #808080 1px solid; display: none; background-color: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_284_296_Open_Text"><span style="color: #000000">{&nbsp;</span><span id="Codehighlighter1_286_294_Closed_Text" style="border-top: #808080 1px solid; border-right: #808080 1px solid; border-bottom: #808080 1px solid; border-left: #808080 1px solid; display: none; background-color: #ffffff">/**/</span><span id="Codehighlighter1_286_294_Open_Text"><span style="color: #008000">/*</span><span style="color: #008000">&nbsp;<img src="http://www.cppblog.com/Images/dot.gif"  alt="" />&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000">&nbsp;}</span></span><span style="color: #000000"><br /><img onclick="this.style.display='none'; Codehighlighter1_334_345_Open_Text.style.display='none'; Codehighlighter1_334_345_Closed_Image.style.display='inline'; Codehighlighter1_334_345_Closed_Text.style.display='inline';" id="Codehighlighter1_334_345_Open_Image" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img onclick="this.style.display='none'; Codehighlighter1_334_345_Closed_Text.style.display='none'; Codehighlighter1_334_345_Open_Image.style.display='inline'; Codehighlighter1_334_345_Open_Text.style.display='inline';" id="Codehighlighter1_334_345_Closed_Image" style="display: none" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(str1&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;str2&nbsp;</span><span style="color: #000000">||</span><span style="color: #000000">&nbsp;str1&nbsp;</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;str2)&nbsp;</span><span id="Codehighlighter1_334_345_Closed_Text" style="border-top: #808080 1px solid; border-right: #808080 1px solid; border-bottom: #808080 1px solid; border-left: #808080 1px solid; display: none; background-color: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_334_345_Open_Text"><span style="color: #000000">{&nbsp;</span><span id="Codehighlighter1_336_344_Closed_Text" style="border-top: #808080 1px solid; border-right: #808080 1px solid; border-bottom: #808080 1px solid; border-left: #808080 1px solid; display: none; background-color: #ffffff">/**/</span><span id="Codehighlighter1_336_344_Open_Text"><span style="color: #008000">/*</span><span style="color: #008000">&nbsp;<img src="http://www.cppblog.com/Images/dot.gif"  alt="" />&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000">}</span></span><span style="color: #000000">;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;result&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;String::CompareOrdinal(str1,&nbsp;str2);<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<br /><img onclick="this.style.display='none'; Codehighlighter1_430_440_Open_Text.style.display='none'; Codehighlighter1_430_440_Closed_Image.style.display='inline'; Codehighlighter1_430_440_Closed_Text.style.display='inline';" id="Codehighlighter1_430_440_Open_Image" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img onclick="this.style.display='none'; Codehighlighter1_430_440_Closed_Text.style.display='none'; Codehighlighter1_430_440_Open_Image.style.display='inline'; Codehighlighter1_430_440_Open_Text.style.display='inline';" id="Codehighlighter1_430_440_Closed_Image" style="display: none" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(str1&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;nullptr)&nbsp;</span><span id="Codehighlighter1_430_440_Closed_Text" style="border-top: #808080 1px solid; border-right: #808080 1px solid; border-bottom: #808080 1px solid; border-left: #808080 1px solid; display: none; background-color: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_430_440_Open_Text"><span style="color: #000000">{&nbsp;</span><span id="Codehighlighter1_432_439_Closed_Text" style="border-top: #808080 1px solid; border-right: #808080 1px solid; border-bottom: #808080 1px solid; border-left: #808080 1px solid; display: none; background-color: #ffffff">/**/</span><span id="Codehighlighter1_432_439_Open_Text"><span style="color: #008000">/*</span><span style="color: #008000">&nbsp;<img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span style="color: #008000">*/</span></span><span style="color: #000000">}</span></span><span style="color: #000000">;<br /><img onclick="this.style.display='none'; Codehighlighter1_467_477_Open_Text.style.display='none'; Codehighlighter1_467_477_Closed_Image.style.display='inline'; Codehighlighter1_467_477_Closed_Text.style.display='inline';" id="Codehighlighter1_467_477_Open_Image" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img onclick="this.style.display='none'; Codehighlighter1_467_477_Closed_Text.style.display='none'; Codehighlighter1_467_477_Open_Image.style.display='inline'; Codehighlighter1_467_477_Open_Text.style.display='inline';" id="Codehighlighter1_467_477_Closed_Image" style="display: none" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(str1</span><span style="color: #000000">-&gt;</span><span style="color: #000000">IsEmpty())&nbsp;</span><span id="Codehighlighter1_467_477_Closed_Text" style="border-top: #808080 1px solid; border-right: #808080 1px solid; border-bottom: #808080 1px solid; border-left: #808080 1px solid; display: none; background-color: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_467_477_Open_Text"><span style="color: #000000">{&nbsp;</span><span id="Codehighlighter1_469_476_Closed_Text" style="border-top: #808080 1px solid; border-right: #808080 1px solid; border-bottom: #808080 1px solid; border-left: #808080 1px solid; display: none; background-color: #ffffff">/**/</span><span id="Codehighlighter1_469_476_Open_Text"><span style="color: #008000">/*</span><span style="color: #008000">&nbsp;<img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span style="color: #008000">*/</span></span><span style="color: #000000">}</span></span><span style="color: #000000">;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Accessing&nbsp;individual&nbsp;characters&nbsp;in&nbsp;a&nbsp;String^</span><span style="color: #008000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;auto&nbsp;it&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;str1</span><span style="color: #000000">-&gt;</span><span style="color: #000000">Begin();<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;char16&nbsp;ch&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;it[</span><span style="color: #000000">0</span><span style="color: #000000">];</span></div>
<p>&nbsp;</p>
<p><strong>String类型的转换</strong></p>
<p>String类型可以和标准C++的wstring进行互相的转换</p>
<p>&nbsp;</p>
<div style="font-size: 13px; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; border-bottom: #cccccc 1px solid; word-break: break-all; padding-bottom: 4px; padding-top: 4px; padding-left: 4px; border-left: #cccccc 1px solid; padding-right: 5px; width: 98%; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #008000">//</span><span style="color: #008000">&nbsp;compile&nbsp;with:&nbsp;/ZW</span><span style="color: #008000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #000000">#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">string</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">namespace</span><span style="color: #000000">&nbsp;std;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">namespace</span><span style="color: #000000">&nbsp;Platform;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;main(&nbsp;array</span><span style="color: #000000">&lt;</span><span style="color: #000000">String</span><span style="color: #000000">^&gt;^</span><span style="color: #000000">&nbsp;args&nbsp;)&nbsp;<br /><img onclick="this.style.display='none'; Codehighlighter1_122_651_Open_Text.style.display='none'; Codehighlighter1_122_651_Closed_Image.style.display='inline'; Codehighlighter1_122_651_Closed_Text.style.display='inline';" id="Codehighlighter1_122_651_Open_Image" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img onclick="this.style.display='none'; Codehighlighter1_122_651_Closed_Text.style.display='none'; Codehighlighter1_122_651_Open_Image.style.display='inline'; Codehighlighter1_122_651_Open_Text.style.display='inline';" id="Codehighlighter1_122_651_Closed_Image" style="display: none" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif"></span><span id="Codehighlighter1_122_651_Closed_Text" style="border-top: #808080 1px solid; border-right: #808080 1px solid; border-bottom: #808080 1px solid; border-left: #808080 1px solid; display: none; background-color: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_122_651_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Create&nbsp;a&nbsp;String^&nbsp;variable&nbsp;statically&nbsp;or&nbsp;dynamically&nbsp;from&nbsp;a&nbsp;</span><span style="color: #008000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />literal&nbsp;</span><span style="color: #0000ff">string</span><span style="color: #000000">.&nbsp;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;String</span><span style="color: #000000">^</span><span style="color: #000000">&nbsp;str1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">AAAAAAAA</span><span style="color: #000000">"</span><span style="color: #000000">;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Use&nbsp;the&nbsp;value&nbsp;of&nbsp;str1&nbsp;to&nbsp;create&nbsp;the&nbsp;ws1&nbsp;wstring&nbsp;variable.</span><span style="color: #008000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;wstring&nbsp;ws1(&nbsp;str1</span><span style="color: #000000">-&gt;</span><span style="color: #000000">Data()&nbsp;);&nbsp;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;The&nbsp;value&nbsp;of&nbsp;ws1&nbsp;is&nbsp;L"AAAAAAAA".<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Manipulate&nbsp;the&nbsp;wstring&nbsp;value.</span><span style="color: #008000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;wstring&nbsp;replacement(&nbsp;L</span><span style="color: #000000">"</span><span style="color: #000000">BBB</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;);<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;ws1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;ws1.replace&nbsp;(&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">3</span><span style="color: #000000">,&nbsp;replacement&nbsp;);<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;The&nbsp;value&nbsp;of&nbsp;ws1&nbsp;is&nbsp;L"ABBBAAAA".<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Assign&nbsp;the&nbsp;modified&nbsp;wstring&nbsp;back&nbsp;to&nbsp;str1.&nbsp;</span><span style="color: #008000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;str1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">ref</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;String(&nbsp;ws1.c_str()&nbsp;);&nbsp;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span></div>
<p><br /></p><img src ="http://www.cppblog.com/jackdongy/aggbug/194043.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jackdongy/" target="_blank">jackdong</a> 2012-10-29 21:51 <a href="http://www.cppblog.com/jackdongy/archive/2012/10/29/194043.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Windows 8 C#调用C++编写的Windows运行时组件 </title><link>http://www.cppblog.com/jackdongy/archive/2012/10/29/194042.html</link><dc:creator>jackdong</dc:creator><author>jackdong</author><pubDate>Mon, 29 Oct 2012 13:48:00 GMT</pubDate><guid>http://www.cppblog.com/jackdongy/archive/2012/10/29/194042.html</guid><wfw:comment>http://www.cppblog.com/jackdongy/comments/194042.html</wfw:comment><comments>http://www.cppblog.com/jackdongy/archive/2012/10/29/194042.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jackdongy/comments/commentRss/194042.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jackdongy/services/trackbacks/194042.html</trackback:ping><description><![CDATA[<a href="http://www.cnblogs.com/linzheng/archive/2012/07/07/2580848.html">http://www.cnblogs.com/linzheng/archive/2012/07/07/2580848.html</a><br /><br />
<p>Windows运行时组件是Windows 8里面通用的公共库，它可以使用C++，C#或者VB来编写，不过你的Windows 8 metro是用什么语言编写都可以调用无缝地调用Windows运行时组件。</p>
<p>下面通过一个C#编写的Windows 8项目来调用一个用C++编写的Windows运行时组件。</p>
<p>创建一个Windows运行时组件：</p>
<p><img alt="" src="http://pic002.cnblogs.com/images/2012/152755/2012070719541968.png" width="673" height="368" /></p>
<p>编写如下的代码：</p>
<div style="font-size: 13px; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; border-bottom: #cccccc 1px solid; word-break: break-all; padding-bottom: 4px; padding-top: 4px; padding-left: 4px; border-left: #cccccc 1px solid; padding-right: 5px; width: 98%; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #000000">#include&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">pch.h</span><span style="color: #000000">"</span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />#include&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">WinRTComponent.h</span><span style="color: #000000">"</span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">namespace</span><span style="color: #000000">&nbsp;CppWinRTComponentDll2;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;CalculatorSample::Add(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;x,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;y)<br /><img onclick="this.style.display='none'; Codehighlighter1_126_144_Open_Text.style.display='none'; Codehighlighter1_126_144_Closed_Image.style.display='inline'; Codehighlighter1_126_144_Closed_Text.style.display='inline';" id="Codehighlighter1_126_144_Open_Image" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img onclick="this.style.display='none'; Codehighlighter1_126_144_Closed_Text.style.display='none'; Codehighlighter1_126_144_Open_Image.style.display='inline'; Codehighlighter1_126_144_Open_Text.style.display='inline';" id="Codehighlighter1_126_144_Closed_Image" style="display: none" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif"></span><span id="Codehighlighter1_126_144_Closed_Text" style="border-top: #808080 1px solid; border-right: #808080 1px solid; border-bottom: #808080 1px solid; border-left: #808080 1px solid; display: none; background-color: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_126_144_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;x</span><span style="color: #000000">+</span><span style="color: #000000">y;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span></div>
<p>头文件</p>
<div style="font-size: 13px; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; border-bottom: #cccccc 1px solid; word-break: break-all; padding-bottom: 4px; padding-top: 4px; padding-left: 4px; border-left: #cccccc 1px solid; padding-right: 5px; width: 98%; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #000000">#pragma&nbsp;once<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">namespace</span><span style="color: #000000">&nbsp;Windows::Foundation;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">namespace</span><span style="color: #000000">&nbsp;CppWinRTComponentDll2<br /><img onclick="this.style.display='none'; Codehighlighter1_84_189_Open_Text.style.display='none'; Codehighlighter1_84_189_Closed_Image.style.display='inline'; Codehighlighter1_84_189_Closed_Text.style.display='inline';" id="Codehighlighter1_84_189_Open_Image" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img onclick="this.style.display='none'; Codehighlighter1_84_189_Closed_Text.style.display='none'; Codehighlighter1_84_189_Open_Image.style.display='inline'; Codehighlighter1_84_189_Open_Text.style.display='inline';" id="Codehighlighter1_84_189_Closed_Image" style="display: none" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif"></span><span id="Codehighlighter1_84_189_Closed_Text" style="border-top: #808080 1px solid; border-right: #808080 1px solid; border-bottom: #808080 1px solid; border-left: #808080 1px solid; display: none; background-color: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_84_189_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">ref</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;CalculatorSample&nbsp;</span><span style="color: #0000ff">sealed</span><span style="color: #000000"><br /><img onclick="this.style.display='none'; Codehighlighter1_136_186_Open_Text.style.display='none'; Codehighlighter1_136_186_Closed_Image.style.display='inline'; Codehighlighter1_136_186_Closed_Text.style.display='inline';" id="Codehighlighter1_136_186_Open_Image" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img onclick="this.style.display='none'; Codehighlighter1_136_186_Closed_Text.style.display='none'; Codehighlighter1_136_186_Open_Image.style.display='inline'; Codehighlighter1_136_186_Open_Text.style.display='inline';" id="Codehighlighter1_136_186_Closed_Image" style="display: none" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_136_186_Closed_Text" style="border-top: #808080 1px solid; border-right: #808080 1px solid; border-bottom: #808080 1px solid; border-left: #808080 1px solid; display: none; background-color: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_136_186_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">:<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;Add(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;x,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;y);<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span></div>
<p>&nbsp;</p>
<p>在C#编写的项目中调用Windows运行时组件的C++方法</p>
<p>添加Windows运行时组件</p>
<p><img alt="" src="http://pic002.cnblogs.com/images/2012/152755/2012070720020715.png" /></p>
<p>UI部分</p>
<p>&nbsp;</p>
<div style="font-size: 13px; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; border-bottom: #cccccc 1px solid; word-break: break-all; padding-bottom: 4px; padding-top: 4px; padding-left: 4px; border-left: #cccccc 1px solid; padding-right: 5px; width: 98%; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">Page<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000">x:Class</span><span style="color: #0000ff">="TestWinRTCSDemo.MainPage"</span><span style="color: #ff0000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;IsTabStop</span><span style="color: #0000ff">="false"</span><span style="color: #ff0000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;xmlns</span><span style="color: #0000ff">="http://schemas.microsoft.com/winfx/2006/xaml/presentation"</span><span style="color: #ff0000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;xmlns:x</span><span style="color: #0000ff">="http://schemas.microsoft.com/winfx/2006/xaml"</span><span style="color: #ff0000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;xmlns:local</span><span style="color: #0000ff">="using:TestWinRTCSDemo"</span><span style="color: #ff0000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;xmlns:d</span><span style="color: #0000ff">="http://schemas.microsoft.com/expression/blend/2008"</span><span style="color: #ff0000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;xmlns:mc</span><span style="color: #0000ff">="http://schemas.openxmlformats.org/markup-compatibility/2006"</span><span style="color: #ff0000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;mc:Ignorable</span><span style="color: #0000ff">="d"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">Grid&nbsp;</span><span style="color: #ff0000">Background</span><span style="color: #0000ff">="{StaticResource&nbsp;ApplicationPageBackgroundThemeBrush}"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">StackPanel</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">TextBox&nbsp;</span><span style="color: #ff0000">x:Name</span><span style="color: #0000ff">="txtX"</span><span style="color: #ff0000">&nbsp;HorizontalAlignment</span><span style="color: #0000ff">="Center"</span><span style="color: #ff0000">&nbsp;Height</span><span style="color: #0000ff">="45"</span><span style="color: #ff0000">&nbsp;Width</span><span style="color: #0000ff">="258"</span><span style="color: #0000ff">&gt;&lt;/</span><span style="color: #800000">TextBox</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">TextBlock&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000">Text</span><span style="color: #0000ff">="+"</span><span style="color: #ff0000">&nbsp;HorizontalAlignment</span><span style="color: #0000ff">="Center"</span><span style="color: #ff0000">&nbsp;&nbsp;Height</span><span style="color: #0000ff">="45"</span><span style="color: #ff0000">&nbsp;Width</span><span style="color: #0000ff">="258"</span><span style="color: #ff0000">&nbsp;FontSize</span><span style="color: #0000ff">="14"</span><span style="color: #ff0000">&nbsp;FontWeight</span><span style="color: #0000ff">="Bold"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">TextBox&nbsp;</span><span style="color: #ff0000">x:Name</span><span style="color: #0000ff">="txtY"</span><span style="color: #ff0000">&nbsp;HorizontalAlignment</span><span style="color: #0000ff">="Center"</span><span style="color: #ff0000">&nbsp;Height</span><span style="color: #0000ff">="45"</span><span style="color: #ff0000">&nbsp;Width</span><span style="color: #0000ff">="258"</span><span style="color: #0000ff">&gt;&lt;/</span><span style="color: #800000">TextBox</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">Button&nbsp;</span><span style="color: #ff0000">Content</span><span style="color: #0000ff">="调用WinRT方法来相加"</span><span style="color: #ff0000">&nbsp;HorizontalAlignment</span><span style="color: #0000ff">="Center"</span><span style="color: #ff0000">&nbsp;Click</span><span style="color: #0000ff">="Button_Click_1"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">&gt;&lt;/</span><span style="color: #800000">Button</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">TextBox&nbsp;</span><span style="color: #ff0000">x:Name</span><span style="color: #0000ff">="txtAddResult"</span><span style="color: #ff0000">&nbsp;HorizontalAlignment</span><span style="color: #0000ff">="Center"</span><span style="color: #ff0000">&nbsp;Height</span><span style="color: #0000ff">="45"</span><span style="color: #ff0000">&nbsp;Width</span><span style="color: #0000ff">="258"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">StackPanel</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">Grid</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">Page</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span></div>
<p>C#代码部分</p>
<div style="font-size: 13px; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; border-bottom: #cccccc 1px solid; word-break: break-all; padding-bottom: 4px; padding-top: 4px; padding-left: 4px; border-left: #cccccc 1px solid; padding-right: 5px; width: 98%; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;System;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;System.Collections.Generic;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;System.IO;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;System.Linq;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;Windows.Foundation;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;Windows.Foundation.Collections;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;Windows.UI.Xaml;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;Windows.UI.Xaml.Controls;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;Windows.UI.Xaml.Controls.Primitives;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;Windows.UI.Xaml.Data;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;Windows.UI.Xaml.Input;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;Windows.UI.Xaml.Media;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;Windows.UI.Xaml.Navigation;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;CppWinRTComponentDll2;</span><span style="color: #008000">//</span><span style="color: #008000">引入Windows运行时的空间</span><span style="color: #008000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">namespace</span><span style="color: #000000">&nbsp;TestWinRTCSDemo<br /><img onclick="this.style.display='none'; Codehighlighter1_439_1157_Open_Text.style.display='none'; Codehighlighter1_439_1157_Closed_Image.style.display='inline'; Codehighlighter1_439_1157_Closed_Text.style.display='inline';" id="Codehighlighter1_439_1157_Open_Image" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img onclick="this.style.display='none'; Codehighlighter1_439_1157_Closed_Text.style.display='none'; Codehighlighter1_439_1157_Open_Image.style.display='inline'; Codehighlighter1_439_1157_Open_Text.style.display='inline';" id="Codehighlighter1_439_1157_Closed_Image" style="display: none" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif"></span><span id="Codehighlighter1_439_1157_Closed_Text" style="border-top: #808080 1px solid; border-right: #808080 1px solid; border-bottom: #808080 1px solid; border-left: #808080 1px solid; display: none; background-color: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_439_1157_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">sealed</span><span style="color: #000000">&nbsp;partial&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;MainPage&nbsp;:&nbsp;Page<br /><img onclick="this.style.display='none'; Codehighlighter1_494_1155_Open_Text.style.display='none'; Codehighlighter1_494_1155_Closed_Image.style.display='inline'; Codehighlighter1_494_1155_Closed_Text.style.display='inline';" id="Codehighlighter1_494_1155_Open_Image" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img onclick="this.style.display='none'; Codehighlighter1_494_1155_Closed_Text.style.display='none'; Codehighlighter1_494_1155_Open_Image.style.display='inline'; Codehighlighter1_494_1155_Open_Text.style.display='inline';" id="Codehighlighter1_494_1155_Closed_Image" style="display: none" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_494_1155_Closed_Text" style="border-top: #808080 1px solid; border-right: #808080 1px solid; border-bottom: #808080 1px solid; border-left: #808080 1px solid; display: none; background-color: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_494_1155_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;MainPage()<br /><img onclick="this.style.display='none'; Codehighlighter1_530_580_Open_Text.style.display='none'; Codehighlighter1_530_580_Closed_Image.style.display='inline'; Codehighlighter1_530_580_Closed_Text.style.display='inline';" id="Codehighlighter1_530_580_Open_Image" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img onclick="this.style.display='none'; Codehighlighter1_530_580_Closed_Text.style.display='none'; Codehighlighter1_530_580_Open_Image.style.display='inline'; Codehighlighter1_530_580_Open_Text.style.display='inline';" id="Codehighlighter1_530_580_Closed_Image" style="display: none" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_530_580_Closed_Text" style="border-top: #808080 1px solid; border-right: #808080 1px solid; border-bottom: #808080 1px solid; border-left: #808080 1px solid; display: none; background-color: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_530_580_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.InitializeComponent();<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">protected</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">override</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;OnNavigatedTo(NavigationEventArgs&nbsp;e)<br /><img onclick="this.style.display='none'; Codehighlighter1_660_670_Open_Text.style.display='none'; Codehighlighter1_660_670_Closed_Image.style.display='inline'; Codehighlighter1_660_670_Closed_Text.style.display='inline';" id="Codehighlighter1_660_670_Open_Image" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img onclick="this.style.display='none'; Codehighlighter1_660_670_Closed_Text.style.display='none'; Codehighlighter1_660_670_Open_Image.style.display='inline'; Codehighlighter1_660_670_Open_Text.style.display='inline';" id="Codehighlighter1_660_670_Closed_Image" style="display: none" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_660_670_Closed_Text" style="border-top: #808080 1px solid; border-right: #808080 1px solid; border-bottom: #808080 1px solid; border-left: #808080 1px solid; display: none; background-color: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_660_670_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;Button_Click_1(</span><span style="color: #0000ff">object</span><span style="color: #000000">&nbsp;sender,&nbsp;RoutedEventArgs&nbsp;e)<br /><img onclick="this.style.display='none'; Codehighlighter1_751_1149_Open_Text.style.display='none'; Codehighlighter1_751_1149_Closed_Image.style.display='inline'; Codehighlighter1_751_1149_Closed_Text.style.display='inline';" id="Codehighlighter1_751_1149_Open_Image" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img onclick="this.style.display='none'; Codehighlighter1_751_1149_Closed_Text.style.display='none'; Codehighlighter1_751_1149_Open_Image.style.display='inline'; Codehighlighter1_751_1149_Open_Text.style.display='inline';" id="Codehighlighter1_751_1149_Closed_Image" style="display: none" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_751_1149_Closed_Text" style="border-top: #808080 1px solid; border-right: #808080 1px solid; border-bottom: #808080 1px solid; border-left: #808080 1px solid; display: none; background-color: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_751_1149_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(txtX.Text&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">""</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&amp;&amp;</span><span style="color: #000000">&nbsp;txtY.Text&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">""</span><span style="color: #000000">)<br /><img onclick="this.style.display='none'; Codehighlighter1_817_1139_Open_Text.style.display='none'; Codehighlighter1_817_1139_Closed_Image.style.display='inline'; Codehighlighter1_817_1139_Closed_Text.style.display='inline';" id="Codehighlighter1_817_1139_Open_Image" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img onclick="this.style.display='none'; Codehighlighter1_817_1139_Closed_Text.style.display='none'; Codehighlighter1_817_1139_Open_Image.style.display='inline'; Codehighlighter1_817_1139_Open_Text.style.display='inline';" id="Codehighlighter1_817_1139_Closed_Image" style="display: none" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_817_1139_Closed_Text" style="border-top: #808080 1px solid; border-right: #808080 1px solid; border-bottom: #808080 1px solid; border-left: #808080 1px solid; display: none; background-color: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_817_1139_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CalculatorSample&nbsp;calcobj&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;&nbsp;CalculatorSample();</span><span style="color: #008000">//</span><span style="color: #008000">直接创建Windows运行时里面的对象，很方便</span><span style="color: #008000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;x&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Convert.ToInt32(txtX.Text.ToString());<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;y&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Convert.ToInt32(txtY.Text.ToString());<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;txtAddResult.Text&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;calcobj.Add(x,y).ToString();</span><span style="color: #008000">//</span><span style="color: #008000">调用Windows运行时里面的方法</span><span style="color: #008000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span></div>
<p>&nbsp;</p>
<p>运行的效果</p>
<p><img alt="" src="http://pic002.cnblogs.com/images/2012/152755/2012070720042763.png" /></p>
<p><br />&nbsp;</p><br /><img src ="http://www.cppblog.com/jackdongy/aggbug/194042.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jackdongy/" target="_blank">jackdong</a> 2012-10-29 21:48 <a href="http://www.cppblog.com/jackdongy/archive/2012/10/29/194042.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Windows 8 异步编程 </title><link>http://www.cppblog.com/jackdongy/archive/2012/10/29/194041.html</link><dc:creator>jackdong</dc:creator><author>jackdong</author><pubDate>Mon, 29 Oct 2012 13:45:00 GMT</pubDate><guid>http://www.cppblog.com/jackdongy/archive/2012/10/29/194041.html</guid><wfw:comment>http://www.cppblog.com/jackdongy/comments/194041.html</wfw:comment><comments>http://www.cppblog.com/jackdongy/archive/2012/10/29/194041.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jackdongy/comments/commentRss/194041.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jackdongy/services/trackbacks/194041.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; http://www.cnblogs.com/linzheng/archive/2012/07/03/2574039.html&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在Windows 8里面很多API都封装成了异步的形式，因此异步编程成为了Windows 8的一大特色，同时也给Windows 8的应用更好的用户体验...&nbsp;&nbsp;<a href='http://www.cppblog.com/jackdongy/archive/2012/10/29/194041.html'>阅读全文</a><img src ="http://www.cppblog.com/jackdongy/aggbug/194041.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jackdongy/" target="_blank">jackdong</a> 2012-10-29 21:45 <a href="http://www.cppblog.com/jackdongy/archive/2012/10/29/194041.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Windows 8 Hello World </title><link>http://www.cppblog.com/jackdongy/archive/2012/10/29/194040.html</link><dc:creator>jackdong</dc:creator><author>jackdong</author><pubDate>Mon, 29 Oct 2012 13:35:00 GMT</pubDate><guid>http://www.cppblog.com/jackdongy/archive/2012/10/29/194040.html</guid><wfw:comment>http://www.cppblog.com/jackdongy/comments/194040.html</wfw:comment><comments>http://www.cppblog.com/jackdongy/archive/2012/10/29/194040.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jackdongy/comments/commentRss/194040.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jackdongy/services/trackbacks/194040.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: http://www.cnblogs.com/linzheng/archive/2012/06/30/2571281.htmlWindows 8 的metro风格应用程序的开发编程和Windows phone 7是非常类似的，不过Windows 8对开发语言的支持是比Windows Phone 7强大很多，支持C++，C#和JavaScript，而Windows Phone 7只是支持C#，当...&nbsp;&nbsp;<a href='http://www.cppblog.com/jackdongy/archive/2012/10/29/194040.html'>阅读全文</a><img src ="http://www.cppblog.com/jackdongy/aggbug/194040.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jackdongy/" target="_blank">jackdong</a> 2012-10-29 21:35 <a href="http://www.cppblog.com/jackdongy/archive/2012/10/29/194040.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Windows Runtime(WinRT) 揭秘 </title><link>http://www.cppblog.com/jackdongy/archive/2012/10/29/194039.html</link><dc:creator>jackdong</dc:creator><author>jackdong</author><pubDate>Mon, 29 Oct 2012 13:30:00 GMT</pubDate><guid>http://www.cppblog.com/jackdongy/archive/2012/10/29/194039.html</guid><wfw:comment>http://www.cppblog.com/jackdongy/comments/194039.html</wfw:comment><comments>http://www.cppblog.com/jackdongy/archive/2012/10/29/194039.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jackdongy/comments/commentRss/194039.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jackdongy/services/trackbacks/194039.html</trackback:ping><description><![CDATA[<br />&nbsp;&nbsp;&nbsp; 看了个BUILD的PPT，Windows Runtime (RT)并不是一些新闻网站说的那样微软自废.NET武功，而是恰恰相反，WinRT是Win32API的现代版，其中有很深的.NET的基因，是Metro UI的.NET基础，如果考察Metadata的变化，WinRT的API定义的元数据是基于标准ECMA 335，也就是.NET的标准 ，WinRT也是一个沙箱的环境，针对AppStore环境设计的。<br />
<p><strong>基础知识</strong></p>
<p>微软以推出Windows 8为契机，以解决Windows长期存在的问题，并带来了新的用户界面，使得Windows更加安全和AppStore的商业模式。微软在Windows 8 里打造了第三个 XAML-based UI 系统， WPF只是一个供 .NET 这个圈子使用的XAML UI系统 Silverlight只是给浏览器使用的XAML UI系统，Windows Phone7将Silverlight到了手机，现在将XAML带到了涵盖PC、Pad、Phone的所有系统（虽然微软认为平板也是PC，我还是想叫他Pad，用过iPad的都知道苹果所定义的Pad和PC有很大区别）。</p>
<p>.NET开发人员都对.NET 的P / Invoke和COM Interop 很熟悉了，这两种技术使得.NET人员可以使用Win32 API和COM组件，Mono也是使用P/Invoke技术创建原生的库，例如Gtk# 绑定到 Gtk+ API, MonoMac 绑定到Cocoa API, Qyoto 绑定到Qt API，Mono出现了MonoTouch，MonoDroid和MonoMac等等很有创新性的产品。 COM Interop 还可以使得C/C++ 从 C#导入Com类型库。</p>
<p>创建原生库的方法很多，但是这些工作都得是手工去做，很乏味而且容易出错，从这点来说WinRT也是一个很有创新的，可以让所有的开发者用同一个模型创建Metro UI的应用。</p>
<p><strong>WinRT</strong></p>
<p>WinRT是一个新的API 集合，具有以下特性：</p>
<ul><li>它实现了Metro UI规范的UI库</li><li>为Windows开发人员提供一个简单的UI编程模型，你不需要学习Win32API的那些复杂的API了</li><li>它使用XAML-base的UI系统</li><li>API都设计成了异步的</li><li>它和.NET一样是个沙箱的API，自成体系，用于创建AppStore上的应用程序。</li><li>API的元数据格式是ECMA335，和.NET一样的标准。这是不是意味着以后Mono也可以在xUnit上去实现这样的API呢？ </li></ul>
<p>WinRT包装的新的用户界面系统，和Win32API一样是Com的上层。</p>
<p><strong>WinRT Projections</strong></p>
<p>我们所说的&#8220;Binding&#8221;，微软现在叫做&#8220;Projections&#8221;，又是一个新名词。Projections就是向三个环境 Native (C and C++), HTML/Javascript 和.NET 暴露接口的过程。所以在Win8上各类开发者依然可以用着不同的工具，但是却是使用着统一的模型。</p>
<p>如果开发者使用.NET或者C++ 写的组件，它的API被存储在一个WinMD文件里，你可以在三种环境（原生、javascript和.NET）。即使你的组件是用C++ 写的，也不需要通过COM向外暴露，使用起来更像是一个面向对象的C++ API。</p>
<p>WinRT的底层定义了一套基本的类型和各种环境的映射，这是不是很像.NET环境里面对不同语言的支持哈。</p>
<p><strong>异步API</strong></p>
<p>微软认为，当给开发者一个使用同步和异步的API的选择的时候，开发者会选择简单的同步API，这在我们的.NET 编程实践中得到证明，.NET有很成熟的异步编程模型，还有特意为并行和异步处理而设计的F#，结果是什么呢，各位同学心里有数。</p>
<p>在WinRT中，微软一直遵循一个简单的规则：如果一个API预计耗时超过50毫秒，那么API就是异步的，也就是说API是异步的哦，这样就能确保Metro UI上的操作体验是最好的。</p>
<p>异步编程历来是一个繁琐的过程，回调和状态，还有异常处理等。为了简化这个过程，C#和VB也扩展了支持 F#-inspired await/async 模型，异步编程变成了欢乐之旅。</p>
<p><strong>.NET的首要地位不见了吗？</strong></p>
<p>之前的新闻中一直在质疑.NET 被微软抛弃了，当然不是了。也不是所有的.NET API 都集成到了WinRT中，只是一个子集。</p>
<p>当你使用C#和VB，你使用的是完整的.NET框架。但是他们只暴露了一个较小的子集API给Windows 8的开发者。你可能会想，我可以通过一些技巧使用到整个.NET，如果你的程序不需要提交AppStore上接受微软的审核，这是可以的。这种策略明显是跟苹果学的。</p>
<p>借此机会.NET团队也对.NET做了一次清理，mscorlib.dll和System.dll中已被分割在不同的库里头了，随着Win8发布的.NET版本是4.5了，也就是说.NET 4.5不是.NET 4的简单补丁包，里头加了不少东西，ASP.NET的版本号也是4.5，不像.NET 2.0 ~3.5 SP1，ASP.net的版本还是2。0。为了在Win8里开发，开始学习.NET 4.5又是必须的了，这里关注的集中在客户端开发，同样的在服务器端开发方面.NET 4.5也加入大量的干货。</p>
<p><strong>创建WinRT 组件</strong></p>
<p>虽然WinRT支持很多的语言，但是微软只是用C++和.NET演示了如何开发一个WinRT组件，使用.NET来开发WinRT组件会比C++简单得多。也不是所有的.NET特性都能用上哦，比如组件类就不能使用private 字段，在异步的API里不能使用Task&lt;T&gt; ，要用IAsyncOperation 代替。</p>
<div id="codeSnippetWrapper" class="csharpcode-wrapper"><pre class="csharpcode"><span class="kwrd">public</span> <span class="kwrd">sealed</span> <span class="kwrd">class</span> AddTwo<br />{<br />       <span class="kwrd">public</span> <span class="kwrd">int</span> Add (<span class="kwrd">int</span> a, <span class="kwrd">int</span> b)<br />       {<br />           <span class="kwrd">return</span> a + b;<br />       }<br /><br />       <span class="kwrd">public</span> async IAsyncOperation SubAsync (<span class="kwrd">int</span> a, <span class="kwrd">int</span> b)<br />       {<br />           <span class="kwrd">return</span> a - await (CountEveryBitByHand (b));<br />       }<br />   }</pre></div>
<p>你会发现上述代码没有任何形式的COM声明，唯一限制的是，类必须是个密封的（除非你是在创建一个XAML UI组件，这种情形下这种限制是接触的）</p>
<p><strong>UI编程</strong></p>
<p>当涉及到用户界面的开发的时候，你你可以使用HTML与CSS样式或使用XAML的你的应用程序的用户界面。当你回到界面层，就可以用HTML &amp; CSS或者是XAML UI，用HTML&amp; Css做出来的界面就是Web了，而是一个Windows应用，早在Vista开始就有了类似的应用，Windows7上做了改进，叫做Gadgets ，Windows 8就进化到了Metero UI，和C++、.NET并驾齐驱了。</p>
<p>Windows8的开发框架并没有基于HTML5和JavaScript，开发者完全可以用原生C++、C#和Silverlight去开发对平板和触控友好的应用，HTML5和JavaScript只是提供了一种选择。</p>
<div id="MySignature">
<div style="height: 120px; text-align: center; background-color: #fffeee">
<div style="float: left; text-align: left; margin-top: 15px">作者: <a href="http://shanyou.cnblogs.com/" target="_blank">自由、创新、研究、探索&#8230;&#8230;</a><br />出处：<a href="http://shanyou.cnblogs.com/" target="_blank">http://shanyou.cnblogs.com/</a><br />版权：本文版权归作者和博客园共有<br />转载：欢迎转载，为了保存作者的创作热情，请按要求【转载】，谢谢<br />要求：未经作者同意，必须保留此段声明；必须在文章中给出原文连接；否则必究法律责任 <br /></div></div></div>
<div id="blog_post_info_block">
<div id="blog_post_info">
<div id="BlogPostCategory">分类: <a href="http://www.cnblogs.com/shanyou/category/40892.html">.net framework</a>, <a href="http://www.cnblogs.com/shanyou/category/323246.html">Windows 8</a>, <a href="http://www.cnblogs.com/shanyou/category/369052.html">WinRT</a></div></div></div><img src ="http://www.cppblog.com/jackdongy/aggbug/194039.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jackdongy/" target="_blank">jackdong</a> 2012-10-29 21:30 <a href="http://www.cppblog.com/jackdongy/archive/2012/10/29/194039.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>可供C#和Visual Basic调用的WinRT API</title><link>http://www.cppblog.com/jackdongy/archive/2012/10/29/194038.html</link><dc:creator>jackdong</dc:creator><author>jackdong</author><pubDate>Mon, 29 Oct 2012 13:27:00 GMT</pubDate><guid>http://www.cppblog.com/jackdongy/archive/2012/10/29/194038.html</guid><wfw:comment>http://www.cppblog.com/jackdongy/comments/194038.html</wfw:comment><comments>http://www.cppblog.com/jackdongy/archive/2012/10/29/194038.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jackdongy/comments/commentRss/194038.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jackdongy/services/trackbacks/194038.html</trackback:ping><description><![CDATA[　英文原文：<a href="http://www.infoq.com/news/2011/09/DotNet-On-WinRT">C# and Visual Basic on the WinRT API</a> 
<p>　　（作者：Jonathan Allen 译者：<a href="http://www.cnblogs.com/houbowei/" target="_blank">侯伯薇</a>）</p>
<p>　　尽管我们可以使用 .NET 语言来调用 Win32 API，但那样做会很困难。所以在过去的两年间微软一直在构建替代的方案，它就是实现了跨语言支持的 Windows 运行时，即 WinRT。我们可以在 C++ 和 .NET 中创建 WinRT 组件，并且可由二者以及 JavaScript 使用。</p>
<p>　　尽管 COM 在表面上是一种基于 OOP 的框架，但它与 .NET 之间有很大的区别。在 WinRT 出现之前，COM 是基于接口而不是基于类的。这意味着其中缺少很多 .NET 开发者认为应该有的内容，像构造函数以及静态方法等。<a href="http://www.infoq.com/news/2011/09/C-Component-Extensions">C++组件扩展</a>解决了这个问题。</p>
<p>　　WinRT 形式的 COM 使用的元数据格式和通用语言运行时（Common Language Runtime）相同。这些信息存储在表示结构的 WINMD 文件中，尽管没有实现，但在所有公有类中都会有。FXCop 被用于检验这些文件所暴露的 API 是否遵循 .NET Framework 的设计指南。</p>
<p>　　.NET 在最开始时就有&#8220;API 设计委员会（API Design Board）&#8221;。受此启发，Windows 运行时也会建立 API 设计委员会来对其进行管理。很多最初的成员都在 .NET 委员会中，并且很多指南都直接来自于 .NET 基本类库所遵循的原则。</p>
<p>　　Windows 运行时会返回 HRESULT，而不会抛出异常。对于众所周知的 HRESULT 值来说，会抛出相应的异常，而对于其他值就只能抛出 COMException。</p>
<p>　　WinRT 的 IAsyncOperation 接口现在使用新的 async/await 关键字，就像 .NET 的 Task 对象一样。</p>
<p>　　所有 Windows 运行时的集合接口都被映射到 .NET 框架的等价物上。在 .NET 4.5中添加了 IReadOnlyList 和 IReadOnlyDictionary，用来负责处理 WinRT 中的只读集合。</p>
<p>　　WinRT 和 .NET API 在两个地方无法匹配。WinRT 的 stream 无法直接与 .NET 的 IO.Stream 类兼容，但是可以调用名为 AsStream 的扩展方法来进行转换。WinRT 还拥有名为 IBuffer 的接口，这在 .NET 中也无法简单地实现。在此也有一个扩展方法来进行 IBuffer 和比特数组之间的转换。</p>
<p>　　我们可以使用 C# 和 VB 来创建新的 Windows 运行时程序库，过程非常简单。为了把类暴露为 Windows 运行时组件，我们只需要把项目类型设置为&#8220;WINMD 文件&#8221;，并确保遵循以下规则：</p>
<ol><li>API 签名只使用 Windows 运行时的类型</li><li>结构体只能拥有公有的数据字段</li><li>只允许对 XAML 控件使用继承，其它类型都必须使用 sealed 关键字。</li><li>只支持内建的泛型 </li></ol>
<p>　　编译这些库之后，我们就可以在 C++ 和 JavaScript 中调用它们，就像从 .NET 中调用一样简单。</p>
<p>　　<strong>警告</strong></p>
<p>　　由于 WinRT 是基于 COM 构建的，所以你同样会有引用计数和 mark-and-sweep 垃圾回收器之间无法融合的问题。对于实现了析构函数释放非内存资源的对象来说，这是最常见的问题。我们可以考虑调用&#8220;Marshal.FinalReleaseComObject&#8221;来解决问题，但是那本身也存在问题。</p>
<p>　　COM 风格的 marshaling 需要在 .NET 和本地组件之间调用。尽管这通常是无关紧要的，但是如果 API 非常不正式，那么就会出现问题。</p>
<p>　　内建的 WinRT 库（而不是 XAML）是在 Metro 运行时环境之外提供的。然而，第三方的 WinRT 库并非如此。这是 WinRT 中激活框架（activation framework）的限制，而不是 .NET 的问题。</p><img src ="http://www.cppblog.com/jackdongy/aggbug/194038.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jackdongy/" target="_blank">jackdong</a> 2012-10-29 21:27 <a href="http://www.cppblog.com/jackdongy/archive/2012/10/29/194038.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>构建您自有的Windows运行时组件以交付出色的Metro风格应用</title><link>http://www.cppblog.com/jackdongy/archive/2012/10/29/194037.html</link><dc:creator>jackdong</dc:creator><author>jackdong</author><pubDate>Mon, 29 Oct 2012 13:16:00 GMT</pubDate><guid>http://www.cppblog.com/jackdongy/archive/2012/10/29/194037.html</guid><wfw:comment>http://www.cppblog.com/jackdongy/comments/194037.html</wfw:comment><comments>http://www.cppblog.com/jackdongy/archive/2012/10/29/194037.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jackdongy/comments/commentRss/194037.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jackdongy/services/trackbacks/194037.html</trackback:ping><description><![CDATA[<a href="http://www.ithov.com/article/118831.shtml">http://www.ithov.com/article/118831.shtml</a><br /><br />
<p nodeindex="1">对于 Windows 8，我们彻底颠覆改造了平台，您可以选择您已了解的编程语言和技术来构建为设备和外形因素定制的应用。而对于 Windows 运行时，您甚至可以在单一应用中轻松地使用多种语言。通过使用 C++ 来构建您自有的 Windows 运行时组件，您可以通过可与 Xbox 360 控制器交互的 HTML 和 JavaScript 来构建出色的 Metro 风格应用。您可以构建通过 Windows 运行时组件公开的可重用 XAML 控件，这些控件可供使用 C++ 和 C# 编写的 Metro 风格应用即时使用。实质上，我们已允许您在 Windows 8 平台上使用您选择的语言并以毫不迁就的方式来构建应用。</p>
<p nodeindex="2">在本篇博文中，我们将讨论构建 Windows 运行时组件所需了解的必要知识。</p>
<p nodeindex="3"><strong>基础知识</strong></p>
<p nodeindex="4">Windows 运行时是实现语言选择的核心。它自身是公开的，从而您可以从 JavaScript、C++、C# 和 Visual Basic 中以自然而熟悉的方式对其进行调用。这种基础方法也同样适用于构建您自有的 API。</p>
<p nodeindex="5">您在应用中构建和打包的 Windows 运行时组件通常被称作第三方 Windows 运行时组件。这与已作为 Windows 8 平台中一部分的第一方组件有所不同。您可以使用 C++、C# 或 Visual Basic 编写这些第三方 Windows 运行时组件。您可以从任何位置调入它们公开的 API，包括打包到您的应用中的其他 Windows 运行时组件。您也可以使用任何语言来调入通过 Windows 运行时组件公开的 API。</p>
<p nodeindex="6" sizcache="1199" sizset="44">您为应用编写的 Windows 运行时组件可使用 Windows 运行时 API、Win32、COM、.NET API 或第三方库（只要它们支持 Metro 风格应用开发）。请注意您所构建的 Windows 运行时组件与传统意义上公开 API 的 C++ DLL 或 .NET 程序集并不相同。使用 .Net 创建类库或者使用 C++ 创建独立的 DLL 与构建 Windows 运行时组件完全不同。Windows 运行时组件在公开 Windows 运行时元数据的 .wnmd 文件中声明，并且允许 JavaScript 等语言来自然地使用 Windows 运行时 API（例如，向 JavaScript 公开的 API 的 pascalCasedNames 支持）。Windows 运行时元数据还允许 Visual Studio 提供出色的工具功能，如 IntelliSense 支持。</p>
<p nodeindex="7"><strong>为何要构建您自有的 Windows 运行时组件</strong></p>
<p nodeindex="8">创建 Windows 运行时组件可帮助您对可重用性和语言互操作性进行设计。我们来看一下展示如何使用第三方 Windows 运行时组件来构建更佳体验的一些应用程序方案。</p><br />
<p nodeindex="10"><strong>在您的 Metro 风格应用中使用 Win32 和 COM API</strong></p>
<p nodeindex="11" sizcache="1199" sizset="46">Internet Explorer 10 提供的平台允许您使用 HTML、CSS 和 JavaScript 创建出色的 Metro 风格应用体验。但是，如果您已使用 HTML5 Canvas 构建游戏，并希望与 Windows 的 Xbox 360 控制器相集成，那情况会怎样？允许应用从控制器接收输入的 XInput API 会将不可用的 Win32 API 直接向 JavaScript 公开。</p>
<p nodeindex="12" sizcache="1199" sizset="47">这是通过创建 Windows 运行时组件来解决该问题并使您能够在基于 HTML 的 Metro 风格应用中使用 XInput API 的经典示例。XInput 和 JavaScript 控制器草图示例准确地展现了这一点。该示例应用包含一个游戏控制器 Windows 运行时组件，它使用 C++ 编写并用于包装 XInput API 公开的功能。该控制器草图基于 HTML 的应用使用游戏控制器 C++ Windows 运行时组件来实现与 Xbox 360 控制器的交互。</p>
<p nodeindex="13">这一方案（无法单独使用 HTML 和 JavaScript 实现）是通过创建第三方 Windows 运行时组件来完成通过其他方法无法完成的复杂方案的完美示例。</p>
<p nodeindex="14"><strong>大计算量的操作</strong></p>
<p nodeindex="15" sizcache="1199" sizset="48">为诸如科学、工程和地图/地理等字段创建应用通常需要大计算量的操作。这些大量的操作通常需要强大的并行处理且非常适合于使用 C++ 获得最佳性能。在开发 Bing 地图旅行优化器（使用 JavaScript 和 C++ 开发的 Metro 风格应用）中，我们看到了另一种方案，即使用 C++ 创建 Windows 运行时组件使我们可以创建最佳的应用体验。</p>
<p nodeindex="16">您可能会考虑为何用户完全使用本地数据计算旅行路线，而他们可以在云端的 Bing <a href="http://www.ithov.com/server/" target="_blank"><u>服务器</u></a>上运行这种大计算量的操作。Bing 地图为公开执行此操作的 JavaScript API，而有时应用必须脱机运行。另外，我们也希望用户通过触控实时拖动和更改路线。如果我们在本地运行此类大量的操作，则我们需要创建甚至更好的体验。</p>
<p nodeindex="17">通过使用并行任务类库而用 C++ 编写大计算量的操作，我们可以利用客户端的强大功能来为用户创建出色的使用体验。Windows 运行时可完美适用于该方案，它允许我们使用 Bing 地图 AJAX 控件来创建使用 HTML 和 JavaScript 的丰富用户界面 (UI)，而使用 C++ 代码运行的所有大量路线操作可通过并行计算提高计算的速度。</p><br />
<p nodeindex="18"><strong>库</strong></p>
<p nodeindex="19">社区中拥有着大量而出色的库，开发人员已进行汇总并与广大用户共享。在过去，您可能会认为重用其中的一些库可能很具挑战性，如果它们与实现您的应用的编程语言不匹配的话。例如，您构建了一个出色的 .NET 应用，但必须完成痛苦的互操作蓝框（如 PInvoke），才能使用通过 C++ 编写的库。</p>
<p nodeindex="20">Windows 运行时可以弥合 Windows 8 中的语言分歧，使包含单个基本代码的单一 Windows 运行时组件库可以扩展至更广泛的开发人员，无论组件的语言或应用的主要编程语言是什么。</p>
<p nodeindex="21">现在，您可以创建一个可供全部 C++ 和 C# 开发人员使用的公开 Windows 运行时的单一 XAML 自定义控件。您可以在您的基于 XAML 或 HTML 的 Metro 风格应用中使用由开发人员共享的各种数据存储 Windows 运行时库。所有这些方案均无需编写互操作代码即可实现。</p>
<p nodeindex="22" sizcache="1199" sizset="49">我们认为 Windows 运行时将惠及由开发人员创建并与社区中广泛的 Metro 风格应用��发人员共享的各种库。现在，我们来看看两个展示使用 C++/CX 和 C# 构建第三该 Windows 运行时组件的具体示例。</p>
<p nodeindex="23"><strong>应用场景 1：通过本机音频来增强您的应用</strong></p>
<p nodeindex="24" sizcache="1199" sizset="50">假设我们要使用拥有 C# 编写的应用逻辑支持的 XAML 来构建一个软件合成器应用。为了向我们的音乐应用添加过滤器，我们将使用 XAudio 来直接控制音频缓冲器。</p>
<p nodeindex="25">将 Windows 运行时组件添加到我们的解决方案</p>
<p nodeindex="26">使用 Visual Studio，我们可以将全新的 C++ Windows 运行时组件项目添加到我们现有的解决方案。该 Windows 运行时组件包括音乐处理功能：</p>
<p style="text-align: center" nodeindex="27" sizcache="1199" sizset="51"><img title="添加一个全新的 C++ Windows 运行时组件" border="0" alt="使用 Visual Studio 来将一个全新的 C++ Windows 运行时组件添加到我们的音乐应用" src="http://www.ithov.com/uploads/allimg/120814/124Z4GO-1.jpg" /> <br />图 2：添加一个全新的 C++ Windows 运行时组件</p>
<p nodeindex="28">Visual Studio 为我们创建了一个 C++ 项目，用于公开 API，而 API 的实现将打包到一个 DLL 文件，而 Windows 运行时元数据将打包到 winmd 文件中。它们全部可用于我们的 C# 项目。</p>
<p nodeindex="29"><strong>定义向我们的 XAML C# 项目公开的类</strong></p>
<p nodeindex="30" sizcache="1199" sizset="52">我们使用 C++/CX 来构建向 C# 项目公开的 API，但您也可以使用 Windows 运行时 C++ 模板库 (WRL)。我们首先定义一个非常基本的类以封装 XAudio 功能：</p>
<p nodeindex="31">XAudioWrapper.h<br /><br />#pragma once<br /><br />#include "mmreg.h"<br />#include &lt;vector&gt;<br />#include &lt;memory&gt;<br /><br />namespace XAudioWrapper<br />{<br />&nbsp;&nbsp;&nbsp; public ref class XAudio2SoundPlayer sealed<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp; public:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XAudio2SoundPlayer(uint32 sampleRate);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; virtual ~XAudio2SoundPlayer();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; void Initialize();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bool&nbsp;&nbsp; PlaySound(size_t index);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bool&nbsp;&nbsp; StopSound(size_t index);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bool&nbsp;&nbsp; IsSoundPlaying(size_t index);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; size_t GetSoundCount();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; void Suspend();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; void Resume();<br /><br />&nbsp;&nbsp;&nbsp; private:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; interface IXAudio2*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_audioEngine;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; interface IXAudio2MasteringVoice*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_masteringVoice;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; std::vector&lt;std::shared_ptr&lt;ImplData&gt;&gt;&nbsp; m_soundList;<br />&nbsp;&nbsp;&nbsp; };<br />}<br /><br /></p>
<p nodeindex="33">首先，您必须注意类声明中 public、ref 和 sealed 等关键字的使用。对于通过 JavaScript 或 C# 等其他语言在 Metro 风格应用中实例化的类来说，该类必须声明为 public ref class sealed。</p>
<p nodeindex="34">类的公共功能（方法、属性等）仅限于 C++ 内置的类型或 Windows 运行时类型。这些是可在 Windows 运行时组件中跨越语言界限的唯一类型。但话虽如此，您仍然可以将常规的 C++ 库（即标准模板库集合）用于您的类中的专用数据成员，如在该代码断中所示。这些专用数据成员无需遵从与跨越语言界限有关的规则。如果您使用不支持的构造，则 Visual Studio 编译器将发出错误消息并提供相应的指导。</p>
<p nodeindex="31">&nbsp;</p>
<p nodeindex="35"><strong>实现在我们的 Windows 运行时组件中公开的类</strong></p>
<p nodeindex="36">现在，我们已定义了类的基本接口，接下来让我们来看看一些实现方法：</p>
<p nodeindex="37">XAudioWrapper.cpp</p><pre id="codeSnippet">XAudio2SoundPlayer::XAudio2SoundPlayer(uint32 sampleRate) :<br />    m_soundList()<br />{<br />    // Create the XAudio2 engine<br />    UINT32 flags = 0;<br /><br />    XAudio2Create(&amp;m_audioEngine, flags);<br /><br />    // Create the mastering voice<br />    m_audioEngine-&gt;CreateMasteringVoice(<br />        &amp;m_masteringVoice,<br />        XAUDIO2_DEFAULT_CHANNELS,<br />        sampleRate<br />        );<br />}<br /><br />void XAudio2SoundPlayer::Resume()<br />{<br />    m_audioEngine-&gt;StartEngine();<br />}<br /><br />bool XAudio2SoundPlayer::PlaySound(size_t index)<br />{<br />    //<br />    // Setup buffer<br />    //<br />    XAUDIO2_BUFFER playBuffer = { 0 };<br />    std::shared_ptr&lt;ImplData&gt; soundData = m_soundList[index];<br />    playBuffer.AudioBytes = soundData-&gt;playData-&gt;Length;<br />    playBuffer.pAudioData = soundData-&gt;playData-&gt;Data;<br />    playBuffer.Flags = XAUDIO2_END_OF_STREAM;<br /><br />    HRESULT hr = soundData-&gt;sourceVoice-&gt;Stop();<br />    if (SUCCEEDED(hr))<br />    {<br />        hr = soundData-&gt;sourceVoice-&gt;FlushSourceBuffers();<br />    }<br /><br />    //<br />    // Submit the sound buffer and (re)start (ignore any 'stop' failures)<br />    //<br />    hr = soundData-&gt;sourceVoice-&gt;SubmitSourceBuffer(&amp;playBuffer);<br />    if (SUCCEEDED(hr))<br />    {<br />        hr = soundData-&gt;sourceVoice-&gt;Start(0, XAUDIO2_COMMIT_NOW);<br />    }<br /><br />    return SUCCEEDED(hr);<br />}<br /></pre>
<p nodeindex="39" sizcache="1199" sizset="54">在该代码段中，我们使用可用于 Metro 风格应用开发的 XAudio2 COM API 来连接我们的音频引擎、播放声音和恢复引擎。另外，我们还可以使用 C++ 构造和除 Windows 运行时类型以外的其他类型来实现必要的功能。</p>
<p nodeindex="40"><strong>添加和使用 Windows 运行时组件</strong></p>
<p nodeindex="41">在定义和实现基本类之后，我们使用 Visual Studio 来将 XAudioWrapper Windows 运行时组件从我们的 C# 项目添加到 C++ 项目：</p>
<p style="text-align: center" nodeindex="42" sizcache="1199" sizset="55"><img title="将 XAudioWrapper Windows 运行时组件添加到我们的音乐应用" border="0" alt="使用 Visual Studio 来将 XAudioWrapper Windows 运行时组件的引用添加到我们的音乐应用" src="http://www.ithov.com/uploads/allimg/120814/124Z4D91-2.jpg" /></p>
<p nodeindex="43">图 3：将 XAudioWrapper Windows 运行时组件添加到我们的音乐应用</p>
<p nodeindex="44">因此，我们从 C++ 项目公开的类可用于我们的 C# 项目：</p>
<p nodeindex="45">MainPage.cs</p><pre id="codeSnippet">using XAudioWrapper;<br /><br />namespace BasicSoundApp<br />{ <br /> public sealed partial class MainPage : Page<br /> {<br /> XAudio2SoundPlayer _audioPlayer = new XAudio2SoundPlayer(48000);<br /> public MainPage()<br /> {<br /> this.InitializeComponent();<br /> }<br /><br /> protected override void OnNavigatedTo(NavigationEventArgs e)<br /> {<br /> _audioPlayer.Initialize();<br /> }<br /><br /> private void Button_Click_1(object sender, RoutedEventArgs e)<br /> {<br /> _audioPlayer.PlaySound(0);<br /> }<br /> }<br />}<br /></pre>
<p nodeindex="47">如在该代码段中所示，我们可以像使用常规 .NET 组件那样与 C# 中的 XAudio 封装程序进行交互。我们将引用其命名空间、举例说明组件并开始调用其公开的各种方法。所有这一切不需要任何 DllImport 来调入本机代码！</p>
<p nodeindex="48"><strong>应用场景 2：使用内置的 API 在您的应用中打开 zip 文件</strong></p>
<p nodeindex="49" sizcache="1199" sizset="56">假设我们使用 HTML 来构建文件查看器应用，并希望添加功能来允许该应用的用户选取 zip 文件。我们希望将 Windows 中已内置并在 .NET 平台中公开的 API 用于处理 zip 文件。</p>
<p nodeindex="50">将 Windows 运行时组件添加到我们的解决方案</p>
<p nodeindex="51">该步骤与我们在音乐应用中所描述的步骤完全相同，现在我们将选取 C# Windows 运行时组件来包装 zip 处理功能：</p>
<p style="text-align: center" nodeindex="52" sizcache="1199" sizset="57"><img title="添加一个全新的 C# Windows 运行时组件" border="0" alt="使用 Visual Studio 来将一个全新的 C# Windows 运行时组件添加到我们的文件查看器应用" src="http://www.ithov.com/uploads/allimg/120814/124Z43931-3.jpg" /> <br />图 4：添加一个全新的 C# Windows 运行时组件&nbsp;</p>
<p nodeindex="53">Visual Studio 为我们创建了一个 C# 项目，用于公开 API，而 API 的实现和 Windows 运行时元数据都将打包到 .winmd 文件，并且可用于我们的 Web 项目。</p><br />
<p nodeindex="54"><strong>实现在我们的 Windows 运行时组件中公开的类</strong></p>
<p nodeindex="55">我们使用 C# 来构建将向我们的 Web 项目公开的 API，但您同样可以使用 Visual Basic。我们首先定义一个简单的 C# 类来封装 zip 功能：</p>
<p nodeindex="56">ZipWrapper.cs</p><pre id="codeSnippet">using System;<br />using System.Collections.Generic;<br />using System.IO;<br />using System.IO.Compression;<br />using System.Runtime.InteropServices.WindowsRuntime;<br />using System.Threading.Tasks;<br />using Windows.Foundation;<br />using Windows.Storage;<br /><br />public sealed class ZipWrapper<br />{<br />public static IAsyncOperationWithProgress&lt;IList&lt;string&gt;, double&gt; EnumerateZipFileAsync(StorageFile file)<br />        {<br />            return AsyncInfo.Run(async delegate(<br />                System.Threading.CancellationToken cancellationToken, IProgress&lt;double&gt; progress)<br />            {<br />                IList&lt;string&gt; fileList = new List&lt;string&gt;();<br />                progress.Report(0);<br /><br />                using (var stream = await file.OpenStreamForReadAsync())<br />                {<br />                    using (var archive = new ZipArchive(stream))<br />                    {<br />                        for (int i = 0; i &lt; archive.Entries.Count; i++)<br />                        {<br />                            // add code for processing/analysis on the file <br /> // content here<br /><br />                            // add to our list and report progress<br />                            fileList.Add(archive.Entries[i].FullName);<br />                            double progressUpdate = ((i + 1) / ((double)archive.Entries.Count)) * 100; // percentage<br />                            progress.Report(progressUpdate);<br />                        }<br />                    }<br />                }<br /><br />                progress.Report(100.0);<br />                return fileList;<br />            });<br />        }<br />}<br /></pre>
<p nodeindex="58">该类是公共的且已密封。类似于构建 C++ Windows 运行时组件，这对于其他语言实例化类来说是必需的。该类中公开的静态方法混合使用 Windows 运行时类型（例如，StorageFile），并且在方法签名中作为 .NET 类型（例如，IList）。我们的经验法则是使用 Windows 运行时类型来定义向其他语言公开的公共字段、参数和返回类型。尽管如此，您仍然可以原封不动地使用某些 .NET 基本类型（即 DateTimeOffset 和 Uri）以及基元（即 IList）。</p>
<p nodeindex="59" sizcache="1199" sizset="58">您还会注意到上述方法利用了在定义您的 Windows 运行时组件时可以（且应该）使用的用于异步性和进度支持的 Windows 运行时基础结构。就该类中的 Windows 运行时组件或任何专用功能的实现而言，您并不仅限于使用 Windows 运行时类型和 API；您可以自由使用任何向 Metro 应用开发公开的 .NET API 表面，如代码段 ZipArchive API 中所示。</p>
<p nodeindex="60"><strong>添加和使用 Windows 运行时组件</strong></p>
<p nodeindex="61">我们现在已经实现了 zip 工具封装程序，我们将使用 Visual Studio 来添加我们的 JavaScript 项目中对 C# 项目的引用：</p>
<p style="text-align: center" nodeindex="62" sizcache="1199" sizset="60"><img title="将 ZipUtil Windows 运行时组件添加到我们的文件查看器应用中" border="0" alt="使用 Visual Studio 添加我们的文件查看器应用中 ZipUtil Windows 运行时组件的引用" src="http://www.ithov.com/uploads/allimg/120814/124Z43531-4.jpg" /> <br />图 5：将 ZipUtil Windows 运行时组件添加到我们的文件查看器应用 <br />&nbsp;</p>
<p nodeindex="63">因此，我们从 C# 项目公开的类将可用于我们的 Web 项目：</p>
<p nodeindex="64">program.js</p><pre id="codeSnippet">function pickSinglePhoto() {<br /><br />    // Create the picker object for picking zip files<br />    var openPicker = new Windows.Storage.Pickers.FileOpenPicker();<br />    openPicker.viewMode = Windows.Storage.Pickers.PickerViewMode.thumbnail;<br />    openPicker.suggestedStartLocation = Windows.Storage.Pickers.PickerLocationId.picturesLibrary;<br />    openPicker.fileTypeFilter.replaceAll([".zip"]);<br /><br />    // Open the picker for the user to pick a file <br />    openPicker.pickSingleFileAsync().then(function (file) {<br />        if (file) {<br />            ZipUtil.ZipWrapper.enumerateZipFileAsync(file).then(<br />        function (fileList) {<br />            for (var i = 0; i &lt; fileList.length; i++)<br />                document.getElementById('output').innerHTML += " " + fileList[i];<br />        },<br />        function (prog) {<br />            document.getElementById('zipProgress').value = prog;<br />        }<br />    );<br />        } else {<br />            document.getElementById('output').innerHTML = "an error occurred";<br />        }<br />    });<br />};<br /></pre>
<p nodeindex="66">正如您所看到的，我们可以与 JavaScript 中我们的 zip 工具封装程序进行交互，如同它是一个常规的 JavaScript 对象。我们可以调入 Windows 运行时组件中公开的静态方法，而我们使用 JavaScript 的异步语言构造，如 .then()，也可以完成此操作。</p>
<p nodeindex="67"><strong>一般指导</strong></p>
<p nodeindex="68" sizcache="1199" sizset="61">并非您为 Metro 风格应用编写的所有 API 都应公开为第三方 Windows 运行时组件。通常情况下，当您在不同的编程语言之间进行通信时需要使用 Windows 运行时组件类型，并使用语言中内置的类型和构造来实现无法通过 Windows 运行时组件全局公开的功能。另外，跨越语言界限还涉及各种语言特定的功能和规则，当构建 Windows 运行时组件时，您必须将其纳入考虑范围。它们具体包括代理和事件、异步操作、方法重载和处理特定的数据类型（例如，集合、异常处理和调试技巧）。您可以通过访问构建 Windows 运行时组件中面向您的开发语言的部分，来深入研究这些主题。</p>
<p nodeindex="69"><strong>总结</strong></p>
<p nodeindex="70">就 Windows 运行时组件而言，您现在可以混合使用编写语言和 API 技术来构建您设想的应用。毫不迁就的理念贯穿于 Windows 8。即使是在开发阶段情况依然如此，我们允许您混合使用和匹配适用于您的方案的最佳编程语言。我希望这将使您能够用更多的时间来考虑创新，而不是在学习全新的编程语言方面浪费大量的时间。</p>
<p nodeindex="71">希望您能充分享受构建应用为您带来的快乐！</p>
<p nodeindex="72">-- Windows 项目经理 Ines Khelifi</p><br /><img src ="http://www.cppblog.com/jackdongy/aggbug/194037.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jackdongy/" target="_blank">jackdong</a> 2012-10-29 21:16 <a href="http://www.cppblog.com/jackdongy/archive/2012/10/29/194037.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>WinRT：Win32的面向对象替代品</title><link>http://www.cppblog.com/jackdongy/archive/2012/10/29/194017.html</link><dc:creator>jackdong</dc:creator><author>jackdong</author><pubDate>Mon, 29 Oct 2012 07:21:00 GMT</pubDate><guid>http://www.cppblog.com/jackdongy/archive/2012/10/29/194017.html</guid><wfw:comment>http://www.cppblog.com/jackdongy/comments/194017.html</wfw:comment><comments>http://www.cppblog.com/jackdongy/archive/2012/10/29/194017.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jackdongy/comments/commentRss/194017.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jackdongy/services/trackbacks/194017.html</trackback:ping><description><![CDATA[　<br /><br />&nbsp;&nbsp;&nbsp; WinRT 不是另一个抽象层；它就像 Win32 API 一样，直接驻留在内核之上。自从 1993 年 Win32 伴随 Windows NT 被引入以来，这标志着对于 Windows 核心的首次重大突破。WinRT 与 Win32 截然不同，它代表了新的语义学应用程序执行环境。<br />&nbsp; 
<p>　　不像 Win32 是用C语言思想设计的，而 WinRT API 是用 C++ 编写的，并且从一开始的设计就是面向对象的。一致性、易用性、以及性能都是新的运行时 API 的重要方面。WinRT API 中的每个对象都支持反射，以便甚至连诸如 JavaScript 等动态语言都可有效地使用它们。随之而来还有统一对象模型，这对于基于库的 C++ 而言是个稀罕物。</p>
<p>　　附注：Win32 API 并未被移除，而且那些使用传统应用程序执行环境的较早的应用程序将继续按预期方式工作。<br /><br /></p>
<p>　　<strong>C++开发</strong></p>
<p>　　在 C++ 中编写用户界面将首选 XAML。所有与 XAML 一起使用的库都已被移植到C++，并且被编译为本地 x86 版本。使用 XAML 和 C++ 编写的 Metro 风格应用程序并不运行在 .NET 之上，它们就像其他任何 Visual C++ 应用程序一样，被直接编译为 x86 版本。</p>
<p>　　调用 UI 控件的方法就像在 C++ 中调用任何其他对象的方法一样。在机器码级别上，某个指令将 this 指针推送到堆栈上，然后通过虚函数表（v-table）调用相应函数。这使得即使在低功耗设备上也能达到最优的性能。</p>
<p>　　支持一些现代的 C++ 应用程序所用的库，例如 Boost。<br /><br /></p>
<p>　　<strong>重叠窗口不复存在</strong></p>
<p>　　对话框是来自上一版 Windows 的核心概念，而在 WinRT 中它将不复存在。对于微软而言，性能成本和可用性问题已不再是理所当然的。希望使用这种模式的应用程序将要开发其他的方式来传递信息，例如消息框的方式。</p>
<p>　　另一并未纳入 WinRT 的库是 GDI。如果某个应用程序要使用 Metro 风格界面，那么它需要按自上而下的方式来做，将 Metro 风格与经典用户界面相混合的情况是不可能出现的。<br /><br /></p>
<p>　　<strong>PlayTo 契约</strong></p>
<p>　　另一被公开的契约是 PlayTo（由&#8230;&#8230;发挥）。这使得应用程序可发送如音频及视频等媒体文件到某个 charm<sup>[1]</sup>。然后那个 charm 将允许用户选择某个他们想用的应用程序来查看该文件。据推测，媒体文件不仅限于物理文件，而是任何可表示为数据流的媒体形式。<br /><br /></p>
<p>　　<strong>C#/VB：平台调用（P/Invoke）之终结</strong></p>
<p>　　从 .NET 中调用本地函数通常涉及建立结构和操纵指针。而在 WinRT 环境下，所有的 API 被公开为许多可通过 C# 及 VB 直接使用的对象。这把 .NET 开发者置于与 C++ 开发者平等的层面上。</p>
<p>　　应用程序的响应速度对于微软而言是非常重要的。所有耗时超过 50 毫秒的操作系统级别的 API 调用将被公开为异步操作，正是为了向开发者传递这种价值观。<br /><br /></p>
<p>　　<strong>JavaScript</strong></p>
<p>　　对于 Windows 8 而言，第四大语言就是 JavaScript。尽管它不使用 XAML，但它就像本地及 .NET 应用程序一样，拥有对底层 WinRT API 的直接访问权。这不仅是个像 PhoneGap 一样的容器，JavaScript 开发者还可获得与其他开发者所使用的同样丰富的 API。</p>
<p>　　由于是 JavaScript，因此所选择的 UI 工具包是 HTML 和 CSS 而非 XAML。IE 10 及 Metro 风格的 JavaScript 应用程序使用的是同一渲染引擎，尽管那些应用程序实际并不运行在浏览器中。JavaScript 应用程序看起来就像任何其他 Metro 风格应用程序一样。</p>
<p>　　JavaScript 中的用户控件几乎与 C++ 及 .NET 中的控件不相上下。有些控件对于 HTML 渲染引擎而言是固有的，而另外一些控件则是用 JavaScript 编写的。这些基于 JavaScript 的控件都是基于 div 的，非常像那些使用 jQuery 创建的控件。<br /><br /></p>
<p>　　<strong>应用程序容器和应用程序权限</strong></p>
<p>　　Metro 风格应用程序运行在被称为&#8220;应用程序容器&#8221;（app container）的环境中。这似乎取代了由基于 Win32 应用程序所使用的窗体环境。</p>
<p>　　大多数 API 调用被直接发送给底层内核。然而，有些调用将被通过系统代理（system broker）路由。系统代理确保应用程序只能访问那些经用户已批准的功能。例如，当某个应用程序首次尝试访问摄像头时，服务代理（service broker）将提示用户以获取他们的批准。应用程序必须包括一份清单，其中注明该应用程序可能需要的所有限制服务。这种模式对于移动设备开发者而言将是非常熟悉的。</p>
<p>　　所有 Metro 风格应用程序都会运行在 WinRT 的应用程序容器中，而且会受到系统代理的监控，甚至连那些用 C++ 编写的应用程序也不例外。该思想是为了限制应用程序破坏系统的能力。虽然也许并不是不可能的，但是在 WinRT 下创建恶意软件与在 Win32 中相比将会难得多。<br /><br /></p>
<p>　　<strong>所有 Metro 风格应用程序必须进行数字签名</strong></p>
<p>　　不允许匿名应用程序。应用程序为了测试可进行自签名，但是当它们出现在应用商店里时，它们就必须使用真实证书进行签名。</p>
<p>　　<strong>译注</strong></p>
<p>　　[1] <strong>charm</strong>，微软已将&#8220;CHARM&#8221;注册为计算机、软件产品、电气和科学产品类商标。微软将 CHARM 描述为计算机程序、图形用户界面软件和操作系统程序。在触摸版 Windows 8 中，charms 在屏幕右侧；在传统版（使用鼠标和键盘）Windows 8 中，charms 出现在屏幕左侧。charms 包括：Search（搜索）、Share（分享）、Start（开始）、Devices（设备）、Settings（设置）。详见微软申请 Windows 8 功能 charm 注册商标（图）。<br /><br /></p>
<p>　　作者：Jonathan Allen 译者：高翌翔</p>
<p>　　<strong>查看英文原文：</strong><a href="http://www.infoq.com/news/2011/09/WinRT-API">WinRT: An Object Orientated Replacement for Win32&nbsp;</a></p>
<p>　　<strong>相关博客文章：</strong><a href="http://www.cnblogs.com/shanyou/archive/2011/09/17/2179699.html">Windows Runtime(WinRT) 揭秘</a></p><br /><a href="http://dotnet.cnblogs.com/page/115787/">http://dotnet.cnblogs.com/page/115787/</a> <img src ="http://www.cppblog.com/jackdongy/aggbug/194017.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jackdongy/" target="_blank">jackdong</a> 2012-10-29 15:21 <a href="http://www.cppblog.com/jackdongy/archive/2012/10/29/194017.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Windows RT 应用程序开发介绍培训的讲义 </title><link>http://www.cppblog.com/jackdongy/archive/2012/10/16/193391.html</link><dc:creator>jackdong</dc:creator><author>jackdong</author><pubDate>Tue, 16 Oct 2012 15:56:00 GMT</pubDate><guid>http://www.cppblog.com/jackdongy/archive/2012/10/16/193391.html</guid><wfw:comment>http://www.cppblog.com/jackdongy/comments/193391.html</wfw:comment><comments>http://www.cppblog.com/jackdongy/archive/2012/10/16/193391.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jackdongy/comments/commentRss/193391.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jackdongy/services/trackbacks/193391.html</trackback:ping><description><![CDATA[<a href="http://www.cnblogs.com/lxconan/archive/2012/09/09/2677957.html">http://www.cnblogs.com/lxconan/archive/2012/09/09/2677957.html</a><br />
<div id="cnblogs_post_body">
<p>最近从架构的角度做了一个 Windows 8 下 Metro Style 应用程序开发介绍的讲座。以下是讲稿。</p>
<p>如有问题欢迎指正。</p>
<p>下载地址：</p>
<ul><li><a href="http://files.cnblogs.com/lxconan/WinRTIntroPPT.pdf">幻灯片</a></li><li><a href="http://files.cnblogs.com/lxconan/WinRTIntro.pdf">附加说明</a> </li></ul>
<h1>1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 概述</h1>
<p>这篇的标题叫做Windows RT Introduction而非Windows 8 Introduction是想强调此次介绍是从开发人员的角度而不是普通用户的角度出发的。同时，我们关注的是Metro Style应用而不是传统的Win32应用程序的开发。</p>
<p>实际上，使用C#或者HTML + Javascript书写一个Hello world应用的代码例子已经在网上泛滥了。但是仅有一个Hello world并不能够说你掌握了Win RT的开发。从Pro的角度来说我们应该弄清楚整件事情的细节。那么首先就应当是他的架构。这样写起程序来才能心定。</p>
<h1>2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Windows 8 Metro与Desktop模式</h1>
<h2>2.1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 两种模式</h2>
<p>Windows 8的应用程序显示模式目前有两种，定义在METRO_MONITOR_MODE中：即传统的桌面模式（MMM_Desktop）以及Metro模式（MMM_Metro）。如果你是Windows Phone用户的话可能就会对Metro比较熟悉。事实上，微软在2009年启动Windows 8的研发工作时目标是创造一个完全不同以往的操作系统，完全不以之前的操作系统为蓝本。而后发现Desktop应用是不可或缺的部分而将两个部分进行合并。一开始用可能会有些别扭，但是我估计开发人员半天之内就能够熟练使用这个系统了。</p>
<h2>2.2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Metro和Desktop的一些不同</h2>
<p>既然有两种模式那么我们自然就会关注他们的不同点。这个问题应该从架构图上做一下说明但是我们可以先有一些直观的认识。</p>
<h3>2.2.1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Message Loop</h3>
<p>消息处理的编程是传统Desktop应用程序的重要部分。你需要书写维护Message Loop的代码。例如：在WinMain调用（或者其子例程中）你需要书写类似</p>
<p>&nbsp;</p>
<table cellspacing="0" cellpadding="0" border="1">
<tbody>
<tr>
<td valign="top" width="664">
<p class="a">while (::GetMessage(&amp;message, NULL, 0, 0)) {</p>
<p class="a">&nbsp;&nbsp;&nbsp; ::TranslateMessage(&amp;message);</p>
<p class="a">&nbsp;&nbsp;&nbsp; ::DispatchMessage(&amp;message);</p>
<p class="a">}</p></td></tr></tbody></table>
<p>&nbsp;</p>
<p>而在Window创建之前候你一定指定了</p>
<p>&nbsp;</p>
<table cellspacing="0" cellpadding="0" border="1">
<tbody>
<tr>
<td valign="top" width="664">
<p class="a">WNDCLASS wndClass;</p>
<p class="a">// ...</p>
<p class="a">wndClass.lpfnWndProc = WndProc;</p></td></tr></tbody></table>
<p>&nbsp;</p>
<p>这样你就可以在WndProc函数中决定特定message的流向了。对于绘图来说，你一定是接受了WM_PAINT消息，然后执行了区域重绘。</p>
<p>但在Metro App中这些都已经隐藏了，而且消息的细节也可能发生了变化。Metro App中你看不到消息循环。一切关于界面消息的分发都隐藏在了CoreDispatcher中。因此如果你用Spy++去试探Metro App的消息循环那么你什么都抓不到。</p>
<h3>2.2.2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Display</h3>
<p>在传统的Desktop应用程序中，绘图可能通过GDI，GDI+，DirectDraw，DirectX进行。同样通过捕获WM_PAINT消息或者当系统处于IDLE的时候进行绘图（对于游戏编程来说）。</p>
<p>而Metro App不会再支持GDI和GDI+，在Metro App中绘图只能通过DirectX来进行。确切的说是Direct3D和新公布的Direct2D、Direct Write API。因此Metro应用的所有绘图都是希望是硬件加速的。这种绘图更高效，解放CPU，而且一般不需要处理复杂的Dirty Region Repaint。</p>
<h3>2.2.3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Life Cycle</h3>
<p>Metro App并没有关闭窗口这种按钮。其生命周期是由系统托管的。系统会决定仅仅是挂起应用执行还是需要完全销毁应用进程。这和一般意义上的Desktop应用程序不一样。（当然，你也可以使用Alt+F4显示的结束Metro App的执行）。</p>
<h3>2.2.4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Share &amp; Communication</h3>
<p>传统的桌面应用程序有多种手段进行公共组建的公用或IPC。但是在Metro App中，隔离是一个很重要的概念，应用的可执行部分，运行库，Isolated Storage都是独立的，不能够共用。同样，不能够使用传统的IPC机制。应用程序的互动仅仅可以通过内置的Contracts进行，关于这一部分内容可以查看MSDN：</p>
<p><a href="http://msdn.microsoft.com/en-us/library/windows/apps/hh464906.aspx">http://msdn.microsoft.com/en-us/library/windows/apps/hh464906.aspx</a></p>
<h3>2.2.5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Portability</h3>
<p>传统的Desktop应用程序的支持大多为x86/64架构的处理器。由于Metro环境可以完整运行在ARM处理器上是一个重要的特性，因此Metro App可以运行在ARM处理器上，即同时部署在PC和移动设备上。</p>
<h3>2.2.6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OS Access</h3>
<p>当然为了Portability的要求，必然要求应用不能够越过Win RT的抽象，因此Metro是不能像Desktop App那样访问所有的Windows API的。</p>
<h1>3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 从Windows 8 API的架构图看Windows RT</h1>
<p>我们对Windows RT的介绍都将围绕着这个图展开。</p>
<p>在这个图中，最底层的是NT的内核；在其上是Windows子系统。实际上NT至少有三个子系统，Windows子系统，POSIX子系统（Unix）和OS/2子系统。POSIX子系统和OS/2子系统实际还是在使用Windows子系统。 在Windows子系统上划分了不同的运行时（橙色）和程序库（浅蓝色），最上面的绿色是我们使用的各种开发语言。</p>
<p>这个架构图实际上说明了一切。并且消除了很多误解：</p>
<p>（1）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第一个误解是INFOQ指出的Windows RT和Win32是完全分开的。这源于微软发布的一幅饱受批评的架构图，在那张架构图中，Windows RT和Windows子系统竟然是并排排列的。这是很荒谬的，Windows RT实际上基于Windows子系统。首先Windows RT完全基于COM；其次Windows RT利用了一部分现有的Win32 API；其余的部分Windows RT则直接访问NT内核。</p>
<p>（2）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第二个误解是C++/CX。C++/CX是微软推荐的开发Windows RT的方式。他主要隐藏了COM的复杂性。关于这个问题我们后续会有说明。这个误解是C++/CX实际就是C++ CLI。实际上这是两个完全不同的东西，C++ CLI是运行在托管环境下的，而C++/CX完全是Native的。</p>
<h2>3.1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Windows RT仅用于Metro应用</h2>
<p>从架构图中可以看出，Win RT仅仅用于Metro应用。并秉承了我们刚才介绍的，简单部署，没有共享的组件，没有IPC，等等。</p>
<h2>3.2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Windows RT构建与COM之上</h2>
<p>这也是为什么说Windows RT是构建与Win32之上，因为COM是Win32重要的组成部分。这意味着：</p>
<p>（1）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 你可以用之前所有的消费COM的方式来使用Windows RT，你可以用C，你可以用ATL或者新的WRL；</p>
<p>（2）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WRL完全符合传统的C++语法，这意味着你可以使用不同的编译器（例如Intel C++编译器）来构建Metro应用。但是微软显然希望大家都来使用C++/CX，WRL的文档跟没有差不多，现在也看不到一个完整的例子出现。</p>
<h2>3.3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Windows RT限制了系统API的调用</h2>
<p>Win RT是基于COM的，但是COM仅仅是一个二进制协议而已。在COM Interface实现中从技术上讲还是在调用Win32 API。但由于前面介绍的Win RT的设计要求，系统API的调用需要受到严格的限制。仅仅支持有限的API调用，因此在你希望使用一个Win32 API时，一定要查询MSDN上的Applied To一节，看看是否是Metro Style App | desktop App。</p>
<p>同样的道理，.NET的某些方法也在进行着系统调用，因此在使用.NET开发Metro Style应用程序的时候也并不是所有的程序集都能够支持。当然，如果使用P-Invoke的方式调用Win32 API那么危险性就会更大。</p>
<p>总之，在Metro应用中调用不支持的Win32 API会有如下的后果：</p>
<p>（1）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 发生一个Runtime Exception；</p>
<p>（2）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 应用程序失去响应，尤其是在使用和消息循环相关的代码时。例如对Metro App进程使用WaitForSingleObject(hProcess)。</p>
<p>（3）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 调用成功，但是你的Metro App应用会被Windows Store驳回。</p>
<p>按照上述分析，那么即使你存在相当可观的COM代码库，也需要巨大的努力才能够保证他们在Metro App上正确运行（消除非法的系统调用）。对于新的应用来说，为了避免书写大量的COM开发代码，最好使用C++/CX进行开发了。</p>
<h2>3.4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; C++/CX</h2>
<p>为什么会有C++/CX呢？这可以联想n年前我们为了避免C++开发COM的冗长的代码，转而使用C开发关键程序，而使用Visual Basic创建COM组件。现在时间到了2012年，VB6已经不在考虑范围之内了，于是C++/CX取代了他的位置。</p>
<p>C++/CX是Native的，但是它的语法为什么能够和C++ CLI保持近乎一致呢？这是因为Win RT本身虽然是Native的，但它以.NET兼容的方式暴露了元数据。但是我们在编程中要时刻想到，我们在操作实打实的Native对象。根本没有什么垃圾收集器在帮助我们。</p>
<p>那么为什么不单纯使用.NET开发Metro App呢？这是因为对于移动设备来说，CPU的速度和电池是两大局限，因此在近一年，Go Native的大潮终于袭来。目前：</p>
<p>（1）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; iOS使用Objective-C进行程序开发，而且在移动设备上也是没有垃圾收集器的，需要手动释放使用的内存；</p>
<p>（2）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Android一开始使用Java进行开发，但是在糟糕的性能和社区的强大压力下，终于开放了C/C++开发接口；</p>
<p>（3）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WP7/8也出现了类似Android的情况。</p>
<p>目前客户端应用向更薄（核心应用向服务器移动），更快（运行速度快，耗电小），交互更丰富（没有动画你都对不起观众）的方向发展。因此开放Native接口是大势所趋，C/C++顺理成章的在Windows 8强势回归了。</p>
<p>但是，用.NET开发Metro应用也是一个不错的选择，尤其你的应用没有密集的运算（游戏）的情况下。你可以参考幻灯片中的Cheat Sheet。</p></div><img src ="http://www.cppblog.com/jackdongy/aggbug/193391.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jackdongy/" target="_blank">jackdong</a> 2012-10-16 23:56 <a href="http://www.cppblog.com/jackdongy/archive/2012/10/16/193391.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>