Inscrire le composant Windows Runtime (c ++ winrt) dans une application c ++ native

Sep 03 2020

L'application native c ++ utilise des classes c ++ / winrt pour instancier et utiliser winrt::Windows::Media::Audio::AudioGraph.
À l'intérieur, AudioGraphil est possible d'ajouter des effets aux nœuds du graphe. Il existe des effets déjà créés (comme l'effet d'écho) mais il est également possible de créer un effet audio personnalisé.
La classe d'effets audio personnalisés doit être un Windows Runtime Component. Il existe un moyen de créer un effet audio personnalisé dans le projet c ++ / winrt du composant Windows Runtime en créant une classe avec une Windows.Media.Effects.IBasicAudioEffectinterface dans un fichier idl (et en fournissant une implémentation). Cela génère des fichiers d'en-têtes winmd, lib et winrt.
Jusqu'à ce point, tout va bien et fonctionne. Mais pour instancier un effet audio, il doit être enregistré et ce raide me manque. L'application au moment de l'exécution lance une exception avec le message «Classe non enregistrée» lorsque je veux instancier une classe d'effet audio et lance également une exception «Échec d'activation de l'effet audio» lorsque je veux l'instancier à l'intérieur du AudioGraphnœud.

Je ne sais pas comment enregistrer le composant Windows Runtime à partir d'une application native c ++.

Les étapes pour créer et utiliser un effet audio personnalisé sont décrites ici https://docs.microsoft.com/en-us/windows/uwp/audio-video-camera/custom-audio-effects. Le code est en C # et utilisé dans l'application UWP, mais il pourrait être converti en c ++ / winrt presque 1: 1.

Réponses

Logman Sep 04 2020 at 03:25

Cet article résout ce problème:

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

Il est possible d'utiliser WinRT sans inscription (à partir de Windows 10 1903) en modifiant le fichier manifeste de l'application (et non le manifeste du package de composants Windows Runtime comme suggéré dans la documentation) comme ceci:

<?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>