关于WinRT的MSDN参考:http://msdn.microsoft.com/en-us/library/windows/apps/hh454062(v=VS.110).aspx
先声明,这里的Hello,World程序不是Metro Style的WinRT,在Metro中使用WinRT的程序可以找到很多相关的资料了(当然,网上很多文章不适合入门,都弄得太复杂)。个人还是喜欢从简单开始,所以从Desktop程序来开始了解WinRT不是更好?
(1) 神马是WinRT?
关于什么是WinRT,去网上搜吧,很多人在讨论(当然,这玩意目前大多数都停留在讨论阶段,毕竟还是preview)。
大概来说,WinRT是win8提供的新的API集合,不同于传统的win32在于,WinRT以OO的方式提供API,而且WinRT支持Desktop程序,也支持Metro程序(当然,两者支持不是完全一样)。另外,WinRT编译后也可以得到winmd文件,winmd是win8里面的一个很重要的东西,类似于com、.net这样的吧,winmd可以在不同的语言(C#、C++、VB、JS)之间交叉调用(当然,是Metro程序了),个人理解winmd类似于接口定义或者接口导出的文件吧,具体慢慢研究就能理解了。
(2) WinRT for desktop app
简单来说,对于桌面程序,WinRT更多的可以理解为一个语法扩展了,里面有一些新的类,一些语法的扩展等。
(3) WinRT编译和链接
http://msdn.microsoft.com/en-us/library/windows/apps/hh441567(v=VS.110).aspx
编译选项:
/ZW enable WinRT language extensions /AI<dir> add to assembly search path <dir> is the folder where the compiler searches the winmd files /FU<file> forced using assembly/module force the inclusion of the specified winmd file /D "WINAPI_FAMILY=2" set this define to compile against the ModernSDK subset of Win32链接选项:
/APPCONTAINER[:NO] marks the executable as runnable in the appcontainer (only) /WINMD[:{NO|ONLY}] emits a winmd; if “ONLY” is specified, does not emit the executable, but just the winmd /WINMDFILE:filename name of the winmd file to emit /WINMDDELAYSIGN[:NO] /WINMDKEYCONTAINER:name /WINMDKEYFILE:filename used to sign the winmd file选项就不一一介绍了,说得很清楚了,关键还是来试试。
(4) Hello, World with WinRT
如下:
// File: hello_winRT.cpp #include <stdio.h> #include <windows.h> #include <iostream> #include <string> using namespace Platform; int main() { String^ str1="a test"; std::wstring wstr(str1->Data()); std::wstring wstr1(str1->Data(), str1->Length()); std::wcout<< wstr << std::endl; std::wcout<< wstr1 << std::endl; // printf("%s\n",wstr.c_str()); // printf("%s\n",wstr1.c_str()); system("pause"); return 0; } // Compile with: // set_vs_vars.bat // cl hello_winRT.cpp /ZW /AI%winmd% /EHsc /MD // Result: // hello_winRT.cpp(24) : warning C4447: 'main' signature found without threading model. Consider using 'int main(array<Platform::String^>^ args)'.说明:在命令行下运行这里的命令编译就可以了,为了简化书写,我先用了一个简单的bat设置了一下环境变量,如下:
@echo OFF rem ## file: set_vs_vars.bat set winmd="C:\Program Files (x86)\Windows Kits\8.0\Windows Metadata" echo winmd: echo %winmd% rem ##set env of vs echo setting vs environment... call "C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\Tools\vsvars32.bat"; echo done这个,你懂的。
说明一下上面的CPP的内容:
这里使用的是WinRT的String,using namespace Platform;是必须的,WinRT的命令空间吧,String^是WinRT的类型吧,其它就没什么了。关于编译选项,/ZW和/AI是必须的,指定使用WinRT和搜索winmd文件的路径(WinRT定义在winmd文件中),/MD也是必须的,不知道为何/MT编译会出错,神马重定义了,这个没去研究,有兴趣的可以去看看。/EHsc不是必须的,不使用会有一个警告,这个选项是设置是否使用VS的异常了。另外,使用上面的选项编译后,还是有一个警告,说main的签名不对,还给出了建议,结果,我改成它的建议之后,就说没有入口点,尼玛玩我啊!没有具体去研究这个“入口”的问题,参考下面的文章,有这么使用main的,不过都是用vs编译的吧,没试过:
http://msdn.microsoft.com/en-us/library/br229585
http://code.msdn.microsoft.com/DWriteHelloWorld-760793d2/sourcecode?fileId=44736&pathId=309807482
PS:关于winmd文件,有时间再去研究,这里有一篇文章http://www.cnblogs.com/waninlezu/articles/win8MetaData.html,貌似可以用ILSpy打开winmd文件。上面的hello,world编译后会生成一个winmd文件和一个exe文件,后面再研究这个吧。