[Windows翻译]xlang和C++/WinRT的入门知识

568 阅读4分钟

原文地址:kennykerr.ca/2019/01/25/…

原文作者:kennykerr.ca/

发布时间:2019年1月25日

随着xlang项目的揭幕,C++/WinRT现在是一个完全开源的项目。虽然C++/WinRT一直以来都是为Windows开发提供一个开源的头文件库,但生成头文件的cppwinrt编译器仍然是一个闭源项目。xlang项目代表了C++/WinRT编译器的重写。这并不像看起来那么戏剧性。在C++/WinRT编译器的历史上,我已经重写了无数次。我不认同 "我所有的代码都很珍贵 "的软件开发理念。值得注意的是,这是编译器的第一个版本,在这个版本中,我有自己完全用可移植和标准的C++编写的winmd解析器。以前的迭代依赖于从.NET项目继承的元数据API,现在作为一组COM APIs包含在Windows中。像MIDL这样的工具继续使用这些API,但它们不必要的复杂,有些错误,而且不适合高效或简洁的C++消费。

我很快就会写更具体的关于xlang的元数据库的文章,但今天我想告诉你如何从一般的xlang入手,从一无所知到编译自己的C++应用。而且我会用一个控制台应用来处理所有的事情,再次强化一个事实,那就是没有 "商店 "或应用容器的要求,很多开发者似乎仍然相信。我们正在慢慢拆除所有剩余的要求,即代码在应用容器中运行,而C++/WinRT特别是从来没有施加过任何这样的限制。好了,我们开始吧。

这些说明是针对Windows开发者的。你也可以在Linux上构建xlang,正如我们的日常构建可以证明的那样,但我仍然是一个Windows家伙,所以我将使用它。

打开一个Visual Studio开发者命令。我建议使用最新的Visual Studio 2019预览版,因为在处理cmake项目时,它的bug略少。我不是cmake专家,但我们使用cmake是为了在必要时更容易支持跨平台构建。

在开发者命令提示符下,克隆xlang repo。

C:\sample> git clone https://github.com/Microsoft/xlang

有了xlang repo之后,可以选择用Visual Studio打开项目。

C:\sample> devenv xlang

Visual Studio对cmake的支持还有点粗糙,但大部分情况下都能正常工作,我在这个项目上的大部分开发工作都是使用它。

另外,有一个脚本可以让你直接在命令提示符下使用cmake进行构建。

C:\sample> xlang\src\scripts\windows\build.cmd -b Release cppwinrt

一旦完成,你应该会发现cppwinrt编译器已经被建立了。

C:\sample> dir /s /b cppwinrt.exe
C:amplexlang_build_Windowsx64_Release_tool_cpp_cppwinrt_cppwinrt.exe

然后你可以把它复制到本地,方便。

C:sample> copy C:sample/xlang/build/Windows/x64/Release/tool/cppp/cppwinrt/cppwinrt.exe

现在你已经准备好制作你自己的头文件了。一个简单的方法是针对你当前安装的Windows的元数据进行制作。

C:\sample> cppwinrt.exe -in local -verbose
tool: C:\sample\cppwinrt.exe (C++/WinRT v2.0.000000.0)
in: C:\WINDOWS\System32\WinMetadata\Windows.AI.winmd
in: C:\WINDOWS\System32\WinMetadata\Windows.ApplicationModel.winmd
in: C:\WINDOWS\System32\WinMetadata\Windows.Data.winmd
in: C:\WINDOWS\System32\WinMetadata\Windows.Devices.winmd
in: C:\WINDOWS\System32\WinMetadata\Windows.Foundation.winmd
in: C:\WINDOWS\System32\WinMetadata\Windows.Gaming.winmd
in: C:\WINDOWS\System32\WinMetadata\Windows.Globalization.winmd
in: C:\WINDOWS\System32\WinMetadata\Windows.Graphics.winmd
in: C:\WINDOWS\System32\WinMetadata\Windows.Management.winmd
in: C:\WINDOWS\System32\WinMetadata\Windows.Media.winmd
in: C:\WINDOWS\System32\WinMetadata\Windows.Networking.winmd
in: C:\WINDOWS\System32\WinMetadata\Windows.Perception.winmd
in: C:\WINDOWS\System32\WinMetadata\Windows.Security.winmd
in: C:\WINDOWS\System32\WinMetadata\Windows.Services.winmd
in: C:\WINDOWS\System32\WinMetadata\Windows.Storage.winmd
in: C:\WINDOWS\System32\WinMetadata\Windows.System.winmd
in: C:\WINDOWS\System32\WinMetadata\Windows.UI.Xaml.winmd
in: C:\WINDOWS\System32\WinMetadata\Windows.UI.winmd
in: C:\WINDOWS\System32\WinMetadata\Windows.Web.winmd
out: C:\sample\
time: 801ms

正如你所看到的,"local "输入指示cppwinrt从系统的WinMetadata文件夹中读取元数据。由此产生的winrt文件夹包含了所有的C++/WinRT头文件,现在你可以将其包含在内。

C:\sample> dir /b winrt
base.h
impl
Windows.AI.MachineLearning.h
Windows.AI.MachineLearning.Preview.h
Windows.ApplicationModel.Activation.h
Windows.ApplicationModel.AppExtensions.h
Windows.ApplicationModel.Appointments.AppointmentsProvider.h
Windows.ApplicationModel.Appointments.DataProvider.h
Windows.ApplicationModel.Appointments.h
Windows.ApplicationModel.AppService.h
Windows.ApplicationModel.Background.h
Windows.ApplicationModel.Calls.Background.h
Windows.ApplicationModel.Calls.h
Windows.ApplicationModel.Calls.Provider.h
Windows.ApplicationModel.Chat.h
Windows.ApplicationModel.CommunicationBlocking.h
Windows.ApplicationModel.Contacts.DataProvider.h
Windows.ApplicationModel.Contacts.h
.
.
.

是时候写一些代码了! 不如做一个简单的控制台应用程序,使用Syndication API打印出我最近的博客文章。

C:\sample> type app.cpp

#pragma comment(lib, "windowsapp")
#include "winrt/Windows.Foundation.Collections.h"
#include "winrt/Windows.Web.Syndication.h"
#include <stdio.h>
 
using namespace winrt;
using namespace Windows::Foundation;
using namespace Windows::Web::Syndication;
 
int main()
{
    Uri uri{ L"https://kennykerr.ca/feed" };
    SyndicationClient client;
    SyndicationFeed feed = client.RetrieveFeedAsync(uri).get();
 
    for (auto&& item : feed.Items())
    {
        hstring title = item.Title().Text();
 
        printf("%ls\n", title.c_str());
    }
}

然后你可以使用Visual C++编译器编译它,如下所示。

C:\sample> cl /EHsc /std:c++17 /permissive- /W4 /I . app.cpp

当然,如果你喜欢,也可以使用Clang。然后,你可以简单地按照以下方式运行应用程序,正如你所看到的,这只是一个老式的控制台应用程序。

C:\sample> app.exe
The State of C++ on Windows
xlang
Compilers and Conformance
New in C++/WinRT: Mastering Strong and Weak References
New in C++/WinRT: Async Cancellation Callback for Coroutines
C++/WinRT on Wikipedia
New Features and Changes Coming to C++/WinRT: Header Isolation
C++/WinRT and Beyond
C++/WinRT: Creating Collections Simply and Efficiently
C++/WinRT: Coroutines and the Calling Context

我还在为这次更新做最后的润色。一旦结束,xlang版的C++/WinRT将成为C++/WinRT项目的下一次重大更新,通过常规渠道发布。

今天就讲到这里。希望大家喜欢探索xlang和使用C++/WinRT构建应用程序。更多精彩内容请继续关注。