标签: winrt-component

对于在 C++/WinRT 组件中使用 COM-lite 对象的智能指针有什么建议吗?

C++/WinRT 提供了 3 种用于 COM 对象的智能指针 -Microsoft::WRL::ComPtr基于com_ptr、 和 ATL 的智能指针CComPtr

就我而言,它是一个 COM-lite 对象,这意味着它不是进程内或进程外 COM 对象,它是作为 C++ 对象创建的。

在这种情况下,我应该在 C++/WinRT 组件中使用哪个智能指针?

c++ winrt-component c++-winrt cppwinrt

9
推荐指数
1
解决办法
1526
查看次数

无法将 WinRT/C++ 组件加载到我的 UWP/C# 应用程序

我需要将 WebRTC c++ 库包装到 WinRT 组件中,并从我的 UWP/C# 应用程序中使用它。有一篇很好的文章how to use native c++ in uwp描述了我遵循的所有集成步骤。简要地:

  • 我已经创建了 Dll/C++DLL1库并链接了我的静态库libwebrtc_full.a。打了所有必要的电话
  • 然后,我在我的 WinRT/C++ 项目中引用了 DLLWindowsRuntimeComponent1MyClass成功创建了公共引用类,这使得所有必要的调用来自DLL1
  • 我的 UWP 应用程序正确App1查看MyClass及其公共方法,App1引用了 WindowsRuntimeComponent。

在运行应用程序时,只要我尝试使用在 WindowsRuntimeComponent1

The specified module could not be found.
(Exception from HRESULT: 0x8007007E)
Run Code Online (Sandbox Code Playgroud)

我创建并上传了一个示例项目以将我的问题重现到GDrivelibwebrtc.a在示例项目中也包含了我的静态数据,以防它是问题的根本原因。

我已经过上这样类似的问题去了,最相似的我的问题是这样的一个。不同之处在于我引用了该项目并且仍然得到相同的异常。

编辑1:

这是MyClass这样的:

namespace WindowsRuntimeComponent1
{
    public ref class MyClass sealed
    {
    public:
        MyClass(int sampleRate);
        virtual ~MyClass(); …
Run Code Online (Sandbox Code Playgroud)

c# c++ c++-cx winrt-component uwp

5
推荐指数
0
解决办法
168
查看次数

从 C# 使用 C++/WinRT 组件

我有一个用 C++/CX 编写的项目(动态库),该项目由用 C# 编写的 Windows 10 通用应用程序(针对 x86 和 ARM32)使用。
我想将库重写为C++/WinRT,以便使用普通 C++。

问题 1:是否可以创建 C++/WinRT DLL 并从 C# 中使用它?
问题 2:如何设置 C++/WinRT 项目以使其能够从商店应用程序中使用?

c# windows-runtime c++-cx winrt-component c++-winrt

5
推荐指数
1
解决办法
2073
查看次数

使用 WinRT 的 BLE:执行写入特征的“GetCharacteristicsForUuidAsync()”时访问被拒绝

也许有人可以帮助我,因为我在 Windows 10 上使用 WinRT 的蓝牙 LE 遇到了非常棘手的情况(就像这里假设的:.Net (C#) 中的蓝牙低功耗)。

\n

我需要在 Win32 经典桌面应用程序中使用 BLE。\n我们的代码使用 .NET 运行时(v4.0.30319、.NET Framework 4.6.2)在 32 位框架应用程序中运行。我能够管理所有其他问题(强命名一些 NuGet 程序集 (Shiny.BluetoothLE),在BluetoothAdapter.GetRadioAsync()64 位 Windows 上运行时在 64 位 COM 代理 DLL 中运行),但现在我完全陷入困境,这里\xe2\x80 \x99s 其中:

\n

执行时出现问题,var result = await gattDeviceService.GetCharacteristicsForUuidAsync(uuid, BluetoothCacheMode.Cached);请参阅此处https://learn.microsoft.com/de-de/uwp/api/windows.devices.bluetooth.genericattributeprofile.gattdeviceservice.getcharacteristicsforuuidasync?view=winrt-20348。\n获取读取特征时,是result.Status并且GattCommunicationStatus.Success结果包含所需的特征。\n但是当然我也需要获得写入特征并且我总是得到GattCommunicationStatus.AccessDenied!\n因为结果不包含特征。

\n

有人知道这是为什么吗?我真的需要帮助,因为我现在有点迷路\xe2\x80\xa6

\n

我也尝试AccessPermission通过注册表进行设置,就像这里假设的那样,但根本没有运气\xe2\x80\xa6

\n

PS:我使用 Windows 10 SDK Kit Build 20348,如上所述,它是一个 C# .NET Framework 4.6.2 项目,并且由于使用 GAC,我们的所有程序集都是强命名的。如果我缺少任何内容,请随时与我联系。

\n

.net c# windows-runtime bluetooth-lowenergy winrt-component

5
推荐指数
1
解决办法
1285
查看次数

用于立即返回内容的异步方法的模式

如果我写一个简单的函数,我可以立即得到一个结果.如果我使用async/await并返回一个Task- 该方法将在完成任务后返回,但是如果我需要编写一个需要立即返回的方法,然后继续更新结果并可能最终完成任务呢?另外,如果我想在WinRT组件库之外公开它以供其他语言的组件使用,该怎么办?我如何在C#中完成它,我将如何在C++/CX中完成?或JS或许?

例1:

我想公开一个返回一个的属性,ImageSource所以我可以立即将它从我的MVVM视图模型绑定到XAML视图.加载方法ImageSource将在一个单独的类中,该类在WinRT组件外部公开(它是一个公共方法).现在我希望该方法是可以等待的,或者至少以某种方式返回我可以等待的任务但也立即返回ImageSource所以我调用它的属性可以立即返回,因为属性不能是异步的.调用者不知道ImageSource将是什么类型,因此它无法实例化它,因为ImageSource它实际上是一个抽象类型,通常表示为BitmapImageWriteableBitmap在我的情况下,两者都可以从方法返回.显然,该方法本身立即知道它是否将返回任何类型的对象,但是它需要一些时间来读取/创建和/或解码图像.

我在想C#中的签名可能是这样的

public async Task<ImageSource> GetImage(
    object key,
    out ImageSource bitmap,
    CancellationToken cancellationToken)
Run Code Online (Sandbox Code Playgroud)

我只是不等待属性访问器中的方法的结果,但我想我能够立即返回位图参数,而当我在其他地方调用或在我的视图模型的代码中的其他地方事件时我会能够等待或取消任务.

例2:

我希望能够列出磁盘中的文件,并在列出所有文件后获得完成的任务,但会立即返回一个IObservableVector视图模型,表示在我的XAML UI中使用的文件,这些文件更新为文件页面异步加载.

在这里,我可能会做类似的事情:

public async Task<int> GetImages(
    object queryParemeters,
    out ObservableCollection<CustomFileInfoType> files,
    CancellationToken cancellationToken)
Run Code Online (Sandbox Code Playgroud)

问题

现在上面看起来几乎不错,但是我认为我不能在WinRT组件之外暴露一个TPL任务,因为Task它不是WinRT类型,所以我可能给出了一个类似上面的内部方法和一个包含结果的公共方法作为IAsyncOperation通过调用AsyncInfo.Run(),传递任务和取消标记.ObservableCollection也只是.NET,所以我可能需要在它周围创建一个包装器来实现,IObservableVector因为我不认为它在.NET中可用.这些可能存在其他潜在问题,我不确定这种设计是否正确.

那么 - 我将如何在C++/CX中完成所有这些工作?还是JS?

c# async-await windows-runtime c++-cx winrt-component

4
推荐指数
1
解决办法
759
查看次数

将 Platform::String 转换为 std::string

我在String^Windows Phone 8 项目的 Cocos2dx 游戏中从我的 C++ WinRT 组件中的 C# 组件回调中得到which包含一些印度语言字符。

每当我将其转换为std::string印地语时,其他字符都会变成垃圾字符。我无法找到为什么会发生这种情况。

这是一个示例代码,我刚刚Platform::String^在此处定义,但考虑它是C++ WinRT Component从 C# 组件传递给的

String^ str = L"?????, ?????, ?????, Vikas";
std::wstring wsstr(str->Data());
std::string res(wsstr.begin(), wsstr.end());
Run Code Online (Sandbox Code Playgroud)

c# c++ cocos2d-x windows-phone-8 winrt-component

4
推荐指数
1
解决办法
7349
查看次数

如何使用 midlrt.exe 将 .idl 编译为 .winmd?

背景:我需要构建一个 Windows 运行时组件,作为设置为使用CMake生成其构建系统的系统的一部分。作为准备步骤,我试图在命令行上构建它。


从一个简单的 .idl 文件 (MyType.idl) 开始

namespace NS
{
    [default_interface]
    runtimeclass MyType
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用midlrt.exe工具生成匹配的 .winmd 文件。下面的命令行(为了可读性分成几行)

midlrt
    /metadata_dir "%WindowsSdkDir%References\%WindowsSDKVersion%Windows.Foundation.FoundationContract\3.0.0.0"
    /reference "%WindowsSdkDir%References\%WindowsSDKVersion%Windows.Foundation.FoundationContract\3.0.0.0\Windows.Foundation.FoundationContract.winmd"
    /winmd MyType.winmd
    /notlb
    /winrt
    /nomidl
    /nologo
    /enum_class
    /ns_prefix
    /client none
    /server none
    MyType.idl
Run Code Online (Sandbox Code Playgroud)

生成 MyType.winmd 文件就好了,但我不知道为什么。我对/metadata_dir/reference选项特别困惑。跑步midlrt /help提供以下功能:

/metadata_dir      Specify one or more directories containing platform metadata files
/reference         Specify one or more WinMD files to import
Run Code Online (Sandbox Code Playgroud)

/metadata_dir上的官方文档对此没有增加太多(除了令人困惑的评论:“使用此开关指定 Windows 的主元数据文件的位置,该文​​件名为 windows.winmd。”)。没有关于/reference …

midl windows-runtime winrt-component c++-winrt

3
推荐指数
1
解决办法
627
查看次数