WinRT 语法

(1)WinRT对象和引用计数

  1. Platform::String^ str1 = "str1";  
  2. Platform::String^ str2 = str1;  
  3. Platform::String^ str3 = ref new Platform::String(L"str3");  
Platform::String^ str1 = "str1"; Platform::String^ str2 = str1; Platform::String^ str3 = ref new Platform::String(L"str3");注意:这里的str1,是对象的“指针”,和std::string的使用不一样。

(2)WinRT中的数字类型

  1. bool    b    = true;  
  2. char    c8   = 'A';  
  3. char16  c16  = L'A';                // same as wchar_t  
  4. int8    i8   = 0x12;                // same as char  
  5. int16   i16  = 0x1234;              // same as short  
  6. int32   i32  = 0x12345678;          // same as int, long  
  7. int64   i64  = 0x1234567890abcdef;  // same as long long, __int64  
  8. int8    ui8  = 0x12;                // same as unsigned char  
  9. int16   ui16 = 0x1234;              // same as unsigned short  
  10. int32   ui32 = 0x12345678;          // same as unsigned int, unsigned long  
  11. int64   ui64 = 0x1234567890abcdef;  // same as unsigned long long, __uint64  
  12. float32 f32 = 12.34E-23;            // same as float  
  13. float64 f64 = 1234.56E-234;         // same as double, long double  
bool b = true; char c8 = 'A'; char16 c16 = L'A'; // same as wchar_t int8 i8 = 0x12; // same as char int16 i16 = 0x1234; // same as short int32 i32 = 0x12345678; // same as int, long int64 i64 = 0x1234567890abcdef; // same as long long, __int64 int8 ui8 = 0x12; // same as unsigned char int16 ui16 = 0x1234; // same as unsigned short int32 ui32 = 0x12345678; // same as unsigned int, unsigned long int64 ui64 = 0x1234567890abcdef; // same as unsigned long long, __uint64 float32 f32 = 12.34E-23; // same as float float64 f64 = 1234.56E-234; // same as double, long doubleC++的数字类型会被自动转换为WinRT对应的类型,比如从一个标准的C++函数返回一个数字值,赋值给winRT类型。

说明:这些类型都定义在Platform命名空间中。

(3)ref class实现自定义类

用ref class标记一个自定义类,就可以使用winRT的对象的方式使用这个类了。当然,在类中,是可以混合使用标准C++的一些类型的。

(4)Value struct结构体

如果一个类只包含数据成员,那么就可以使用value struct定义


(5)WinRT中的property

在WinRT中,使用property关键字声明共有数据成员,而且,还可以为property设置访问它的时候get()、set()的逻辑。

 Public ref class LangSample {
//…
// Backing store for propertyA.
int _propertyAValue;

// Property that has custom setter/getter
property int PropertyA
{
    int get() { return _propertyAValue; }
    void set(int propertyAValue) 
    {
        if (propertyAValue != _propertyAValue)
        {
            _propertyAValue = propertyAValue;
            //fire event. (See event example below.)
            propertyChangedEvent(this, propertyAValue);
         }
    }
}

// Trivial get/set property that has a compiler-generated backing store.
property Platform::String^ PropertyB;
}
(6)WinRT定义接口

WinRT也能实现类似于标准C++的接口功能,当然,标准C++本身并没有提供接口这一概念(很多新的语言如c#、java都有提供),但是标准C++使用纯虚类是可以实现这一功能的。WinRT使用interface关键字来定义一个类为接口类(只需要声明方法,而不需要实现的类),然后就可以被其它的ref class去继承和实现接口了。


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

WinRT还有一些其他的语法扩展,委托、事件等,发现这些扩展都跟C#一样了,所以不继续废话了。直接看参考链接吧。

PS:以为会有一些特别的地方,发现都是C#的旧东西了。



参考:

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


http://blog.youkuaiyun.com/gengshenghong/article/details/7047795



转载于:https://www.cnblogs.com/niannian/archive/2012/05/02/2721766.html

<think>好的,我现在需要帮助用户比较C++/WinRT在Visual Studio 2017中的使用情况,以及开发支持方面的对比。首先,我需要回顾一下C++/WinRT的基本概念和它在不同版本的Visual Studio中的支持情况。 根据用户提供的引用,特别是引用[1]、[2]、[3],用户提到在Visual Studio 2017中编译OpenJDK12时遇到了一些问题,比如源文件无法打开,这可能涉及到头文件路径或SDK版本的问题。接下来,我需要了解C++/WinRT在VS2017中的官方支持情况。 C++/WinRT是微软推出的一个基于标准C++的Windows运行时(WinRT)库,它允许开发者使用现代C++语法访问WinRT API。通常,微软推荐使用较新的Visual Studio版本(如VS2019或VS2022)来获得更好的支持,但用户可能由于项目需求必须使用VS2017。 接下来,我需要检查C++/WinRT对VS2017的支持。查阅微软官方文档,发现C++/WinRT从VS2017版本15.7开始提供支持,但需要安装特定的SDK和工作负载。因此,用户需要确认他们的VS2017版本是否满足最低要求,并且是否正确安装了Windows 10 SDK(版本1803或更高)。 另外,引用[3]中提到用户遇到了无法打开源文件的问题,路径指向Windows Kits的某个特定版本。这可能是因为在安装SDK时未正确选择组件,或者项目配置中包含了错误的头文件路径。需要指导用户检查项目属性中的包含目录和SDK版本设置。 接下来,比较VS2017与更高版本(如VS2019)在使用C++/WinRT时的差异。例如,VS2019可能内置了更完善的C++/WinRT工具链,包括项目模板和更好的IntelliSense支持,而VS2017可能需要手动配置更多步骤,如手动添加NuGet包或修改项目文件。 此外,用户可能需要处理兼容性问题,比如C++17特性的支持程度。VS2017对C++17的支持是部分的,而C++/WinRT依赖于某些现代C++特性,如协程(在VS2017中需要额外的编译器选项或更新)。 最后,总结出在VS2017中使用C++/WinRT的可行步骤,包括安装必要的SDK、配置项目属性、处理可能的编译错误,并建议升级到更新的Visual Studio版本以获得更好的开发体验。 在回答中需要引用用户提供的引用[1]、[2]、[3],尤其是关于安装VS2017和SDK的部分,以及可能遇到的源文件问题。同时,生成的相关问题需要围绕C++/WinRT在不同VS版本中的使用、配置技巧和兼容性处理等方面。</think>### C++/WinRT在Visual Studio 2017中的使用对比与开发支持 #### 1. **C++/WinRT在VS2017中的支持情况** - **基础支持**:C++/WinRT从Visual Studio 2017版本15.7开始正式支持,但需要手动配置Windows SDK(版本1803或更高)。用户需确保安装了对应SDK,并在项目属性中正确设置包含路径[^1][^3]。 - **依赖项管理**:VS2017不提供内置的C++/WinRT项目模板,需通过NuGet包管理器手动安装`Microsoft.Windows.CppWinRT`包,或直接引用头文件路径`<winrt/base.h>`[^3]。 - **编译器要求**:需启用C++17标准(在项目属性中设置`/std:c++17`),但VS2017对C++17的支持有限,部分特性(如协程)可能需要额外配置或补丁。 #### 2. **VS2017与更高版本(如VS2019/2022)的对比** - **工具链优化**: - **VS2019+**:内置C++/WinRT项目模板,自动生成IDL到C++的绑定代码,简化开发流程。 - **VS2017**:需手动执行`cppwinrt.exe`工具生成代码,或通过自定义生成步骤实现。 - **调试支持**: - **VS2019+**:提供更完善的XAML热重载和运行时类型检查。 - **VS2017**:调试体验较弱,需依赖日志输出或第三方工具。 - **SDK兼容性**:VS2017可能因Windows SDK版本冲突导致头文件缺失(如引用[3]中的`winrt`路径问题),需确保SDK版本一致性。 #### 3. **配置步骤(以VS2017为例)** 1. **安装Windows 10 SDK 1803+**:通过Visual Studio安装器选择对应版本。 2. **项目属性设置**: - 添加包含路径:`C:\Program Files (x86)\Windows Kits\10\Include\<SDK版本>\cppwinrt\winrt`。 - 启用C++17:`C/C++ > Language > C++ Language Standard > /std:c++17`。 3. **代码生成**:使用命令行工具生成绑定: ```bash cppwinrt.exe -input %WindowsSdkDir%Include\<SDK版本>\winrt -output GeneratedFiles ``` #### 4. **常见问题与解决方案** - **头文件无法打开**:检查SDK安装路径是否正确,并确认项目包含目录中未包含冲突版本(如引用[3]中路径需与实际安装版本匹配)。 - **协程支持问题**:若使用`co_await`,需安装`cppwinrt.exe`的2.0+版本,并在代码中添加`#include <winrt/Windows.Foundation.h>`。 - **NuGet包冲突**:手动管理`Microsoft.Windows.CppWinRT`版本,避免与其他库产生依赖冲突。 #### 5. **开发建议** - **升级到VS2019/2022**:微软官方推荐使用更高版本,以获得更完整的工具链和更少的配置成本。 - **隔离环境**:使用虚拟化或容器技术(如Docker)避免SDK版本污染。 - **兼容性验证**:在混合开发环境中,优先验证C++/WinRT API在不同Windows 10版本中的行为。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值