2012-11-09 8 views
1

Pendant que je réalise le développement VB6, je pense que c'est un problème plus large. J'ai trouvé que parfois dans l'IDE VB nous obtenons une erreur: [BadImplementsRefInCompatLib]. À l'aide de la visionneuse de bibliothèque de types fournie avec «Advanced Visual Basic 6» par Matt Curland, elle indique que la bibliothèque de types de mon composant contient une référence à une bibliothèque de types introuvable, mais pas ce qu'elle est. L'erreur sous-jacente est avec le composant TLI lorsqu'il essaie de trouver une interface qui est définie dans une autre bibliothèque de types.Références de bibliothèque de type externe non valides ("Erreur lors du chargement de la DLL")

J'ai également essayé OLE View - pour essayer de recompiler l'IDL - mais encore une fois, il a donné un message d'erreur en essayant d'obtenir le type externe, sans identifier la valeur erronée.

J'ai renvoyé l'erreur proprement dite à la référence de la bibliothèque de types dans le registre, pointant vers un composant, mais la version majeure était incorrecte. Le remplacement de la version majeure a corrigé le problème. J'ai utilisé un éditeur binaire pour voir si je pouvais voir quelles informations sont utilisées dans la bibliothèque de types. Et en effet, j'ai trouvé les noms (pas de chemins) des composants auxquels elle fait référence, mais je n'ai pas pu trouver le format. En fait, j'espérais trouver une table de GUID de bibliothèque de types et de numéros de version. Je suppose que je pourrais écrire du code pour extraire ces noms, et éliminer les références «de travail», mais c'est un peu grossier.

Est-ce que quelqu'un sait comment une bibliothèque de types référence des types externes?

+1

Les bibliothèques de types ont un numéro de version pour une bonne raison. Vous pouvez modifier ce problème, mais cela génère simplement une erreur non détectable à l'exécution lorsque vous appelez une procédure qui a été modifiée. Le seul moyen d'obtenir et d'enregistrer la bibliothèque de types correcte est la solution. –

+0

@HansPassant - Je comprends parfaitement le point de la version de la bibliothèque de types.Malheureusement, le comportement du composant TLI n'est pas très utile - il génère une erreur sans fournir une certaine forme d'information sur * pourquoi * il n'a pas pu résoudre la référence afin que je puisse prendre les mesures appropriées. En ce moment, je dois deviner pourquoi ça n'a pas marché! –

Répondre

2

[BadImplementsRefInCompatLib] signifie que la typelib de votre cible compatible binaire a une référence à un typelib externe et que cette typelib externe n'est pas enregistrée.

Par exemple, si vous avez un groupe de projet avec plusieurs DLL ActiveX qui sont mis à la compatibilité de version compatible binaire etProject2 références Project1 (utilise des types de Projet1 sur les fonctions/propriétés prototypes d'une classe publique) lorsque la compatibilité Project1 pauses et est recompilé Project2 La cible de compatibilité a une typelib qui référence une typelib externe qui n'est pas enregistrée (à savoir l'ancienne version du composant Project1).

Dans notre boutique, nous avons des références à travers les projets VB6, mais n'utilisons jamais de types de core sur les méthodes/propriétés publiques des classes. Ces paramètres sont déclarés As Object et descendent dans le code, ce qui pose moins de problèmes que de lier des composants avec des références croisées externes. Le EditTLB de Curland est utilisé régulièrement pour repérer les classes fautives.

Aucune idée de la manière dont une bibliothèque de types fait référence à des types externes. Je juste importlib("component.tlb") en idl et utilise des types de component à volonté. Btw, un moyen très simple de "protéger" un composant COM (DLL/OCX) contre une utilisation dans VB6 IDE est de référencer un struct dans un typelib externe personnalisé (param à une méthode publique) puis "oublier" pour expédier ce typelib externe. VB6 IDE s'étouffe avec "Error loading DLL" lors de l'ajout d'une référence à la DLL/OCX mais le composant fonctionne et s'enregistre parfaitement, à condition de ne pas appeler cette méthode "obfusquée" cross threads (in-process ou pas).

+0

ouais, j'ai compris l'essentiel de mes propres expériences. Malheureusement, je travaille avec le code de plus de 10 ans de développement, et il y a plus de 150 composants, qui ont tous des dépendances croisées. Il est intéressant de voir que votre boutique a essentiellement abandonné l'utilisation de vos propres types sur les interfaces publiques. Rétrospectivement, c'est ce qui aurait dû être fait avec le code avec lequel je travaille. Cependant, je suis coincé avec ce que j'ai, et ce serait bien d'avoir un moyen de retracer la chaîne des dépendances pour ce genre d'erreurs de développement seulement et de les corriger facilement. –

+0

Comment compilez-vous ces 150+ composants? Vous devez les trier de manière topologique sur leurs dépendances croisées. Vous devez donc conserver ces références documentées. Si vous avez un serveur de build, les développeurs n'auront jamais besoin de compiler des composants sur leurs machines (s'ils en ont besoin, lancez simplement la construction sur le serveur). Nous gardons vbp dans la compatibilité des projets sur les machines dev, et n'obtenons jamais '[BadImplements]'. L'EDI est beaucoup plus réactif dans la compatibilité des projets. – wqw

+0

Nous utilisons Nant pour construire ces composants. Et oui, nous devions trier toutes les dépendances. La seule chose que nous ne faisons pas est d'utiliser la compatibilité du projet sur les machines de développement. Pour être honnête, je pensais que c'était seulement important pour la compilation de composants. Est-ce que l'utilisation de la compatibilité de projet dans l'exécution du projet dit essentiellement à l'EDI de "fixer" toutes les références? –

Questions connexes