2010-05-05 4 views
5

Contexte:COM Extrayez ProgID exe sans l'enregistrer

Je voudrais extraire les données COM d'une application VB6 je peux enregistrer correctement si (selon Microsoft bonnes pratiques) l'application. J'utilise WiX 3.0 et heat.exe n'extraira pas les données (problème connu avec la chaleur) et je n'ai pas accès au fichier TLB associé. L'application VB6 n'a pas de compatibilité activée, donc elle régénère les GUID COM chaque build (Ils veulent que l'application puisse fonctionner côte à côte avec une ancienne version.)

J'ai créé une application C# qui va collecter les TypeLib, l'interface et les informations CoClass à partir de l'application VB6 sans l'enregistrer et créer un fichier wxs pour la bougie à utiliser. Mon entreprise a plusieurs autres applications plus anciennes comme celle-ci et j'aimerais en faire une solution plus générique.

Les enjeux:

1.Le il un moyen de recueillir la « vraie » ProgID (programmeur prévu un) de l'application avec le projet ou d'un fichier TLB et sans l'enregistrer?

2. Existe-t-il un moyen de connaître le modèle de thread souhaité à partir d'une DLL sans l'enregistrer? (J'ai l'intention qu'il peut gérer tous les éléments COM actifs, pourrait aussi bien être complet) Merci.

+0

OLE-COM Object Viewer fourni avec Visual Studio peut le faire, c'est donc certainement possible. Bonne question! + 1 – ParmesanCodice

+1

Cela se fait généralement en configurant la redirection de registre et en invoquant l'auto-inscription. Le composant COM n'est pas enregistré et je ne sais pas si cela satisfait la partie "sans l'enregistrer" de la question. J'utilise une version modifiée de suif: http://www.unicontsoft.com/upload/tallow/ – wqw

+0

Mon intention était de voir si il n'y avait pas de faire des appels au registre. Je vais lire sur la redirection Merci. – mangelo

Répondre

1

Oui et non. Pour autant que je sache, il n'existe pas de moyen générique d'obtenir des ProgIDs à ​​partir d'un typelib ou d'un serveur COM.

Le point d'entrée pour les DLL est DllRegisterServer qui est censé écrire des informations d'enregistrement dans le registre, et pour les serveurs EXE, ils ont généralement un argument de ligne de commande qui a la même implication.

Les bibliothèques de types contiennent une description de toutes les interfaces et coclasses du composant, mais elles contiennent rarement le ProgID lisible par l'utilisateur.

La seule façon claire que je peux voir et recommander est de remplacer la clé HKCR \ CLSID pour pointer temporairement quelque part, puis d'appeler DllRegisterServer. Comme les remplacements de clés de registre sont process-local, cela ne fonctionnera que pour les serveurs en cours de traitement (DLL).

Voir http://msdn.microsoft.com/en-us/library/ms724901(v=VS.85).aspx pour plus d'informations sur les clés de registre prioritaires.

Inspectez ensuite le registre de travail et observez les modifications apportées, par ex. CLSID < -> Mappages ProgID, modèle de thread, etc.

+0

Je vais regarder dans cela. Comme je suis maintenant concentré sur un projet différent, cela peut prendre quelques jours à une semaine. – mangelo

+0

Je me demande si je vous ai peut-être égaré ... Si vous regardez de plus près 'RegOverridePredefKey' ne remplace que le processus actuel (pour des raisons évidentes), vous ne pouvez pas l'utiliser pour collecter des données d'enregistrement à partir d'un exécutable. Je suis en train d'éditer ma réponse pour refléter cela. –

Questions connexes