2009-09-27 10 views
1

Je suis confronté à la configuration suivante: IE charge C++ activeX (application LOADER qui charge C# COM ActiveX (EXECUTOR) qui utilise la réflexion commence application C# UI (l'application principale) qui utilise un héritage C++ COM dll.Problème manifeste avec IE et l'application activeX

J'essaie d'éviter l'enregistrement de ces legs C++ COM (je veux utiliser manifeste). Mais sans succès.

S'il y a un moyen de spécifier manifeste pour l'ActiveX avec la section "fichier" qui pointe vers ces dlls?

I t Ried à créé manifeste pour IE sans succès, mettant Native.manifest dans le répertoire où l'héritage situé, aussi - pas de succès.

Il semble que XBAP au lieu du chargeur et de l'exécuteur devrait résoudre le problème. Mais, des idées comment résoudre le problème dans l'architecture actuelle?

grâce

Répondre

1

Vous ne possédez pas IE vous ne devriez pas être en train de créer un manifeste pour elle. Si vous allez mettre des données d'enregistrement COM dans un manifeste, vous devrez indiquer au système d'examiner ce manifeste pour les données d'enregistrement. Puisque vous ne contrôlez pas l'application hôte, la façon de le faire est d'utiliser le Activation Context APIs, notamment CreateActCtx pointant vers le bon manifeste, suivi par ActivateActCtx sur ce thread. Vous pouvez ensuite CoCreateInstance ce que vous souhaitez, et le suivre avec un DeactivateActCtx/ReleaseActCtx.

La raison pour laquelle un XBAP pourrait fonctionner pour vous est que puisqu'il s'agit d'un exécutable distinct, le manifeste est automatiquement activé par le système et lié à votre processus XBAP au démarrage du processus. Lorsque vous hébergez dans IE, vous devez faire plus de travail puisque vous ne contrôlez pas le processus.

0

Si vous créez votre propre processus et que vous hébergez le contrôle du navigateur Web, vous pouvez fournir à votre application un fichier manifeste contenant les informations COM. Comme vous le suggérez, il peut contenir les entrées pour chaque composant COM existant (avec les informations progid et comClass, etc.). Ensuite, lorsque le javascript chargé dans votre contrôle de navigateur hébergé effectue un nouvel appel ActiveXObject(), le chargeur COM (côte à côte) sans registre est activé et il résout ce dont il a besoin pour utiliser le fichier manifeste.

Vous pouvez obtenir cette solution en moins de 15 minutes juste pour une preuve de concept: créez simplement une nouvelle application .net avec le contrôle webbrowser intégré, écrivez la page html de test avec javascript pour créer votre composant hérité et appelez un méthode dans votre composant COM et enfin créer le fichier .manifest pour votre exe avec l'entrée du composant hérité. Définissez simplement la propriété de contrôle du navigateur Web sur votre fichier html de test. N'oubliez pas d'annuler l'enregistrement de votre composant COM et de mettre à jour l'exe avec votre fichier .manifest.

Un exemple d'un fichier d'entrée manifeste serait comme:

<file name="mycom.dll"> 
    <typelib tlbid="<YOUR TYPELIB ID>" version="1.0" helpdir="" resourceid="0" flags="HASDISKIMAGE" /> 
    <comClass clsid="<YOUR COCLASS ID>" threadingModel="Apartment" tlbid="<YOUR TYPELIB ID>" progid="mycom.class.1" description="mycom.class" /> 
</file> 

Plus d'informations sur les manifestes de fichiers peuvent être trouvés ici:

http://msdn.microsoft.com/en-us/library/aa375632(v=VS.85).aspx