我一直在网上搜索。我明白了:
C++/WinRT 作为标准 C++17 头文件库提供
但它到底是什么?它是古老的 Win32 API 的新的面向对象的替代品吗?它是 Windows 上 Qt 框架的替代品吗?它是一个网络库吗(大多数例子似乎都是关于网络的)。它是一个 GUI 框架吗?它是编写新 Windows 应用程序的首选方式吗?它是臭名昭著的 MFC 库的替代品吗?
本周早些时候,Kenny Kerr 在CppCon 2016 1上展示了C++/WinRT.它是基于Modern的Windows Runtime的标准C++投影.
据我所知,C++/CX编译器/预处理器/代码生成器不接触标准C++代码,而C++/WinRT是标准C++库,这是我天真的解释,C++/CX和C++/WinRT都可以在同一个项目中使用.
问题:
如果重要的话,那些问题的答案让我现在可以决定如何将我的C++/CX项目推向未来.
我有以下WinRT代码,可以很好地发现活动的VPN配置文件:
VpnManagementAgent vpn;
auto profiles = vpn.GetProfilesAsync().get();
wprintf(L"Found %d profiles\n", profiles.Size());
for (auto vp : profiles)
{
wprintf(L"Found profile %s\n", vp.ProfileName().c_str());
}
Run Code Online (Sandbox Code Playgroud)
我想检查ConnectionStatus,但这在IVpnProfile接口上不可用。我尝试添加以下内容无济于事,因为具体的VpnPlugInProfile和VpnNativeProfile类中的ConnectionStatus可用:
VpnPlugInProfile pp = vp.as<VpnPlugInProfile>();
if (pp != nullptr)
wprintf(L"ConnectionStatus = %d\n", pp.ConnectionStatus());
Run Code Online (Sandbox Code Playgroud)
这只是给出一个无效的句柄错误。
有没有办法从IVpnProfile获取ConnectionStatus?
C++/WinRT 提供了 3 种用于 COM 对象的智能指针 -Microsoft::WRL::ComPtr基于com_ptr、 和 ATL 的智能指针CComPtr。
就我而言,它是一个 COM-lite 对象,这意味着它不是进程内或进程外 COM 对象,它是作为 C++ 对象创建的。
在这种情况下,我应该在 C++/WinRT 组件中使用哪个智能指针?
我正在使用C++/WinRT为 UWP 控件编写 C++ 协程:
winrt::fire_and_forget MyControl::DoSomething()
{
if (/* some condition */)
{
// Why does this work?!
return;
}
co_await winrt::resume_foreground(Dispatcher());
// Do some stuff
co_return;
}
Run Code Online (Sandbox Code Playgroud)
这是为我编译的,但据我所知,C++ 协程不允许简单的return语句。这是编译器中的错误吗?
(有趣的是,我无法将 更改co_return为return;我收到编译器错误。是否只能在or之后返回语句?)co_awaitco_yieldco_return
免责声明:我在微软工作。
尝试编译以下代码:
#include <winrt/base.h>
int main() {}
Run Code Online (Sandbox Code Playgroud)
使用以下编译器选项:
/permissive- /std:c++latest
Run Code Online (Sandbox Code Playgroud)
随着最近发布的Visual Studio 15.8 Preview 3.0导致以下编译错误:
1>------ Build started: Project: test1, Configuration: Debug x64 ------
1>Source.cpp
1>c:\program files (x86)\windows kits\10\include\10.0.17134.0\cppwinrt\winrt\base.h(2185): error C3861: 'from_abi': identifier not found
1>c:\program files (x86)\windows kits\10\include\10.0.17134.0\cppwinrt\winrt\base.h(2185): note: This diagnostic occurred in the compiler generated function 'conditional<_Test,T,_Ty2>::type winrt::impl::as(From *)'
1> with
1> [
1> _Ty2=winrt::com_ptr<T>
1> ]
1>c:\program files (x86)\windows kits\10\include\10.0.17134.0\cppwinrt\winrt\base.h(2209): error C3861: 'from_abi': identifier not found
1>c:\program files (x86)\windows kits\10\include\10.0.17134.0\cppwinrt\winrt\base.h(2209): note: This diagnostic occurred in the compiler generated …Run Code Online (Sandbox Code Playgroud) 我有WPF c#服务器应用程序(WCF),并希望在其中使用c ++/WinRT动态库.我可以通过使用带有WPF应用程序的UWP桌面桥和包含我的dll的UWP空应用程序来完成此操作.这适用于没有提升权限的应用程序,但WCF服务需要以管理员身份运行它.我可以通过以管理员身份启动我的应用程序或在项目清单文件中添加标签来实现此目的(requireAdministrator对于WPF和allowElevationUWP).
我的问题就在这里开始我得到的异常System.TypeLoadException与内部异常 System.Runtime.InteropServices.COMException的代码0x80040154 (REGDB_E_CLASSNOTREG))从System.StubHelpers.StubHelpers.GetWinRTFactoryObject(IntPtr pCPCMD)我办的应用程序作为管理员.
这种行为类似于我在没有桌面桥项目的情况下使用c ++/WinRT库时的行为.有这样的问题的解决方案吗?
我编译了针对Windows 10 1809(17763)版本的所有项目.
编辑:
我不关心桌面桥,但我只能找到用c ++/WinRT连接c#的方法.我想要的是使用通过MSIDL导出的类到c#应用程序.
在VS 2017中重新创建此问题的说明(要求是使用Windows 10 1809或更高版本):
1.首先,请从nuget安装C++/WinRT项目模板.
2.接下来创建Windows运行时组件(C++/WinRT)的新项目,选择目标和最低版本的Windows到1809.您应该获得单个类的项目Class.
3.现在在同一个解决方案中创建C#WPF App项目(Framework 4.7.2).在其中添加对运行时组件项目的引用,并为此引用将Copy Local设置为False.Class在WPF项目中使用(例如,在MainWindow类中创建字段RuntimeComponent1.Class c = new RuntimeComponent1.Class();)
此时,两个项目都应该是可编译的,但WPF项目将在运行时抛出异常(TypeLoadException可能是内部异常或根异常).此步骤也是我想要实现的,所有后续步骤对我来说都是多余的,但是创建工作应用程序是必需的.
4.接下来创建Windows Universal Blank App(将平台版本设置为1809),并像之前的WPF一样添加对运行时组件项目的引用,并将Copy Local设置为False.
5.之后创建Windows应用程序打包项目(目标和最低平台版本设置为1809),在其中添加UWP和WPF应用程序(应该无法添加库项目).将WPF应用程序设置为入口点.
6.此时,打包项目应该是可编译的,可以运行而不会出错.此外,应该可以从菜单启动以管理员身份运行Packaging应用程序,但它会产生运行时异常(TypeLoadException).
7.最后,默认情况下,使用提升权限运行应用程序,添加到WPF项目Application Manifest File并将requestedExecutionLevel标记更改为<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />.此外,在Package.appxmanifest内包装项目添加<rescap:Capability Name="allowElevation" />后<rescap:Capability Name="runFullTrust" />.此步骤需要以1809作为最低版本构建.
在thous steps之后,应用程序将抛出TypeLoadException(因为root或内部异常取决于如何使用Class).实际上显示它抛出的东西而不是仅仅是死亡将WPF项目类型更改为控制台,然后它会在死亡前短暂打印异常.
Windows Hello 摄像头使用红外摄像头和红外发射器,并将两者结合起来感测帧中的深度。它类似于 Apple 的 FaceID 或 Xbox Kinect 中的技术。访问 Windows Hello 摄像头的深度传感功能对于研究人员和应用程序开发人员来说可能非常有价值。
\n我能够创建一个应用程序,该应用程序能够访问嵌入在启用 Windows Hello 的网络摄像头中的红外摄像头。然而我发现红外发射器的行为不一致。我已将代码发布到上面链接的 github 存储库中。
\n在我能够访问红外摄像机的每一帧后,我意识到我的摄像机没有打开Infrared Torch(摄像机红外发射器 LED)。但我知道红外手电筒可以工作,因为当我使用 Windows Hello 的面部识别功能时,红外手电筒确实会打开。
我发现驱动程序级别的 Windows 红外摄像头具有以下红外手电筒模式:
\n| 触摸模式 | 描述 |
|---|---|
| KSCAMERA_EXTENDEDPROP_IRTORCHMODE_OFF | Off |
| KSCAMERA_EXTENDEDPROP_IRTORCHMODE_ALWAYS_ON | Always on |
| KSCAMERA_EXTENDEDPROP_IRTORCHMODE_ALTERNATING_FRAME_ILLUMINATION … |
我正在尝试使用 C++/WinRT 在代码中实现自定义 XAML 控件。然而,我尝试的实现未能编译。作为概念证明,我使用了这段代码:
#pragma once
#include <winrt/Windows.UI.Xaml.Controls.h>
namespace MyApp
{
struct MyControl : winrt::implements<MyControl, winrt::Windows::UI::Xaml::Controls::Control>
{
};
}
Run Code Online (Sandbox Code Playgroud)
这导致了以下编译器错误:
Run Code Online (Sandbox Code Playgroud)1>MyControl.cpp 1>c:\program files (x86)\windows kits\10\include\10.0.17134.0\cppwinrt\winrt\base.h(6416): error C2079: 'winrt::impl::producer<D,winrt::Windows::UI::Xaml::Controls::Control,void>::vtable' uses undefined struct 'winrt::impl::produce<D,I>' 1> with 1> [ 1> D=MyApp::MyControl 1> ] 1>c:\program files (x86)\windows kits\10\include\10.0.17134.0\cppwinrt\winrt\base.h(7163): note: see reference to class template instantiation 'winrt::impl::producer<D,winrt::Windows::UI::Xaml::Controls::Control,void>' being compiled 1> with 1> [ 1> D=MyApp::MyControl 1> ] 1>c:\xxx\mycontrol.h(8): note: see reference to class template instantiation 'winrt::implements<MyApp::MyControl,winrt::Windows::UI::Xaml::Controls::Control>' being compiled
我无法理解编译器错误。显然,您无法像实现 Windows 运行时使用的其他类型一样实现 XAML 控件。
在代码中实现 …
我正在使用一个原生C++应用程序,它有一个插件系统,它将在LoadLibrary()/ GetProcAddress().dll上调用函数.我想实现其中一个插件,在插件中我想使用持久性框架来保存/加载一个复杂的对象图到磁盘.
看起来Windows上支持最多的ORM是实体框架,这个页面说实体框架核心是最现代的风格.这个页面好像说,为了使用Entity Framework Core,你的数据模型必须用C#编写.
所以,听起来我必须从C++调用C#.幸运的是,似乎Entity Framework Core 支持通用Windows运行时,它应该使语言之间的调用变得容易.
此演示文稿似乎表示从C++与Universal Windows Runtime交互涉及创建Windows运行时组件,编译步骤可以从Windows运行时组件的.winmd文件生成粘合代码.
因此,我可以制作一个包含两个项目的Visual Studio解决方案:外部"C++ Windows桌面动态链接库"项目和内部"C#通用Windows运行时组件".
然后,文档说"引用Windows运行时组件的Windows运行时元数据(.winmd)文件,然后构建." 但是,当我在外部项目中添加引用时,当我尝试选择内部项目时出现错误,并且没有选项可以浏览以选择任意项.winmd.
即使我进入解决方案管理器并删除除x86两个项目之外的所有平台,也会发生此错误.
这是令人惊讶的,因为这篇Windows博客帖子明确表示本机代码应该能够通过添加对该引用的引用来调用UWP代码.winmd(尽管帖子使用较旧的C++/CX语法).
如果我重新开始并使用"C++/WinRT Windows运行时组件"而不是"C++ Windows桌面动态链接库"项目,我仍然有问题.
如果我这样做,我可以添加参考就好了.
但是,当我尝试构建时,我遇到了构建失败.
1>------ Build started: Project: InnerCSharp, Configuration: Debug x86 ------
1> InnerCSharp -> C:\Users\lithe\source\repos\EntityFrameworkInsideC++\InnerCSharp\bin\x86\Debug\InnerCSharp.winmd
2>------ Build started: Project: OuterC++WinRT, Configuration: Debug Win32 ------
2>MIDLRT Processing C:\Users\lithe\source\repos\EntityFrameworkInsideC++\OuterC++WinRT\Class.idl
2>Class.idl
2>MIDLRT Processing C:\Program Files (x86)\Windows Kits\10\Include\10.0.17134.0\winrt\winrtbase.idl
2>winrtbase.idl
2>MIDLRT Processing …Run Code Online (Sandbox Code Playgroud)