2012-07-30 2 views
1

Je suis actuellement la conception d'une application avec le cadre de l'application Metro qui comprend une fonctionnalité de chat vidéo en direct. J'utilise le MFT GrayscaleTransform inclus dans l'exemple MediaCapture (à ce stade simplement copier-coller de l'échantillon). Cependant, lorsque j'essaie d'ajouter l'effet de niveaux de gris au flux d'images de la caméra, j'obtiens une erreur fatale "class not registered". Je comprends que c'est parce que je dois 'activer et enregistrer' l'extension média, mais je ne sais pas comment. Comment enregistrer l'extension média?Metro Style App MFT "Classe non enregistrée" Erreur

Toute aide est grandement appréciée et j'accepte toujours une réponse!

MISE À JOUR: Mon fichier IDL GrayScale est indiqué ci-dessous:

import "Windows.Media.idl"; 

#include <sdkddkver.h> 

namespace GrayscaleTransform 
{ 
[version(NTDDI_WIN8), activatable(NTDDI_WIN8)] 
runtimeclass GrayscaleEffect 
{ 
    [default] interface Windows.Media.IMediaExtension; 
} 
} 

Répondre

2

L'extension des médias est spécifié comme <Extension> (ou point d'extension) dans la section de paquetages Extensions, mais vous devez insérer manuellement (c.-à- ouvrir le appxmanifest code au lieu de double-clic)

en utilisant l'exemple GrayscaleTransform, dans le Media extensions sample, ouvrez le package.appxmanifest du projet MediaExtensions (code) et chercher cela dans la section <Extensions>.

<Extension Category="windows.activatableClass.inProcessServer"> 
    <InProcessServer> 
     <Path>GrayscaleTransform.dll</Path> 
     <ActivatableClass ActivatableClassId="GrayscaleTransform.GrayscaleEffect" ThreadingModel="both" /> 
    </InProcessServer> 
</Extension> 

Il y a un peu plus d'informations générales sur les extensions dans App contracts and extensions.

+0

La modification manuelle des extensions ne devrait généralement pas être nécessaire: si vous avez une référence à un projet ou à un SDK d'extension, la construction ajoutera automatiquement des éléments Extension pour chaque classe activable dans le projet référencé ou le SDK d'extension.Le problème ici semble être que les classes MediaExtensions ne sont pas annotées avec [activatable] dans l'IDL, elles ne sont donc pas attribuées avec ActivatableAttribute dans leurs WinMD respectifs. C'est un peu particulier. –

+0

Bien que cette solution fonctionne, il semble étrange que j'ai besoin de modifier directement le fichier manifeste pour le faire fonctionner. J'accepterai cette réponse demain si je n'ai pas trouvé de meilleure solution d'ici là. – danielmhanover

+0

J'essaye de faire la même tâche, cependant, je ne veux pas avoir cette DLL supplémentaire (GrayscaleTransform.dll). Donc, j'ai copié tous les fichiers de ce projet dll sur ma DLL principale, mais cela ne fonctionne pas. Y a-t-il quelque chose que je dois faire? – Pavel

0

Comme l'explique Chris Bowen dans his answer, le fichier AppXManifest de votre application ne contient pas les éléments d'extension requis pour les classes activables dans les modules d'extension de média. Toutes les classes activables (non fournies par Windows) doivent être répertoriées dans le manifeste AppX. La solution consistant à ajouter les nœuds Extension au AppXManifest fonctionnera, et c'est ce que les exemples d'application MediaExtensions semblent avoir fait.

Cependant, vous ne devriez normalement pas devoir modifier à la main la liste des extensions. Si vous ajoutez une référence à un projet Windows Runtime Component, un fichier WinMD lâche ou un SDK d'extension, la génération doit automatiquement générer des éléments Extension pour chacune des classes activables dans les composants référencés.

La raison pour laquelle cela ne se produit pas est que les extensions de support ne sont pas annotées avec l'attribut [activatable] dans IDL, elles ne sont donc pas attribuées à l'attribut ActivatableAttribute dans le WinMD généré. Au lieu de modifier manuellement AppXManifest, vous pouvez déclarer le type activable dans sa définition IDL.

Par exemple, pour mettre à jour GeometricSource.GeometricSchemeHandler, vous pouvez modifier sa définition IDL de:

[version(NTDDI_WIN8)] 
runtimeclass GeometricSchemeHandler 
{ 
} 

à:

[version(NTDDI_WIN8), activatable(NTDDI_WIN8)] 
runtimeclass GeometricSchemeHandler 
{ 
    [default] interface Windows.Media.IMediaExtension; 
} 

Notez l'attribut ajouté activatable et ajouté une interface [default]. Si vous apportez ces modifications à chacune des extensions et nettoyez/reconstruisez, vous n'avez pas besoin de spécifier explicitement les types activables dans votre AppXManifest: le système de génération les ajoutera automatiquement.

+0

J'ai essayé ce qui précède, mais je reçois toujours l'erreur "class not registered", même après le nettoyage et la reconstruction de la solution. J'ai mis à jour ma question avec mon fichier IDL. Je ne sais pas si c'est pertinent, mais je n'ai pas non plus de fichier WinMD. – danielmhanover

+0

Le projet GrayscaleTransform génère un fichier .winmd dans le cadre de sa construction. Si vous référencez le projet à partir de votre application, ce fichier WinMD doit également être intégré dans votre application lorsque vous le déployez. –

+0

Je vois. Mais pourquoi l'extension n'est-elle pas ajoutée au manifeste lorsque la solution est construite? – danielmhanover

Questions connexes