在本机C ++应用程序中注册Windows运行时组件c ++ winrt

问题描述

本地c ++应用程序正在使用c ++ / winrt类实例化并使用winrt::Windows::Media::Audio::AudioGraph
AudioGraph内部,可以向图节点添加效果。有一些已经创建的效果(如回声效果),但也有可能创建自定义音频效果
自定义音频效果类必须为Windows Runtime Component。通过在idl文件中使用Windows.Media.Effects.IBasicAudioEffect接口创建类(并提供实现),可以在Windows运行时组件c ++ / winrt项目中创建自定义音频效果。这将生成winmd,lib和winrt头文件
在这一点上,一切都很好并且可以正常工作。但是要实例化音频效果,需要先注册它,而这种陡峭的空间我不见了。当我要实例化音频效果类时,应用程序在运行时抛出“ Class not register”消息异常,并且当我要在AudioGraph节点中实例化音频异常时也抛出异常“无法激活音频效果”。

我不知道如何从本机c ++应用程序注册Windows运行时组件。

此处https://docs.microsoft.com/en-us/windows/uwp/audio-video-camera/custom-audio-effects描述了创建和使用自定义音频效果的步骤。代码在C#中,并在UWP应用程序中使用,但可以将其几乎1:1转换为c ++ / winrt。

解决方法

本文解决了这个问题:

https://blogs.windows.com/windowsdeveloper/2019/04/30/enhancing-non-packaged-desktop-apps-using-windows-runtime-components/

可以通过修改应用程序清单文件(而不是文档中建议的Windows运行时组件软件包清单)来使用免注册WinRT(从Windows 10 1903开始):

<?xml version="1.0" encoding="utf-8"?>
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">  
<assemblyIdentity version="1.0.0.0" name="MyApplication.app"/>
 
  <file name="WinRTComponent.dll">
    <activatableClass
        name="WinRTComponent.Class1"
        threadingModel="both"
        xmlns="urn:schemas-microsoft-com:winrt.v1" />
    <activatableClass
        name="WinRTComponent.Class2"
        threadingModel="both"
        xmlns="urn:schemas-microsoft-com:winrt.v1" />
  </file>
 
</assembly>