6

Nous essayons d'ajouter des tests unitaires à l'ancienne application COM C++. Nous avons également besoin de nos machines de construction pour pouvoir exécuter les tests unitaires afin de s'assurer que chaque build n'a pas introduit d'erreurs. Cependant, nous ne voulons pas que les machines de build enregistrent les DLLs de sorte qu'une machine de build puisse construire plusieurs versions en parallèle. Nous avons supposé que nous pouvions utiliser l'enregistrement gratuit avec les fichiers manifest, mais j'ai du mal à le faire fonctionner. Pas encore sur notre base de code mais juste sur l'exemple de base fourni par Microsoft.
Je l'ai utilisé cette page http://msdn.microsoft.com/en-us/library/ms973913.aspx#rfacomwalk_topic8 et simplement ne fonctionnera pas, lorsque je tente de courir avec le dll non enregistrés d'utiliser les fichiers manifestes, je reçois la « classe erreur non enregistrée »Comment pouvons-nous tester notre code COM C++ sans enregistrer les dll?

Les échantillons qu'ils fournir du travail bien (en utilisant C++ com server et C++ client), mais quand je les reconstruis, ils ne fonctionnent pas. Nous utilisons Visual Studio 2013 et il me semble qu'il y a eu un grand changement dans la façon dont fonctionne com sans inscription, ce qui rend ce tutoriel incompatible avec le nouveau compilateur. Quelqu'un peut-il me diriger vers des ressources sur l'utilisation de l'enregistrement gratuit com avec la dernière version de Visual Studio? Pour compliquer davantage les choses dans notre propre application quand j'arrive, nous utilisons VS 2013 mais en ciblant le compilateur 2010, j'espère que cela ne fera pas beaucoup de différence.

De même, s'il existe une meilleure façon d'exécuter des tests unitaires C++ sur des composants com sans s'enregistrer que des fichiers manifest, j'aimerais en entendre parler également.

Merci pour votre aide.

+0

Nous sommes confrontés au même problème. Nous avons un composant COM avec un fichier manifeste pour l'activation gratuite de l'enregistrement. Nous vérifions que le manifeste est correct avec une application sandbox. Nous ne pouvons pas répliquer ce sandbox en tant que test natif s'exécutant dans Visual Studio 2013 - le test se charge, s'exécute et échoue avec "class not registered". Il semble que le coureur de test joue avec le contexte d'activation dans lequel le test s'exécute. Nous n'avons aucune idée de la façon de résoudre ce problème. –

Répondre

1

Vous pouvez implémenter votre propre version de CoCreateInstance prenant un paramètre de chemin d'accès DLL supplémentaire. Le code serait quelque chose comme ça (la gestion des erreurs et d'autres détails omis par souci de concision):

HRESULT CoCreateInstanceForTest(dllPath, rclsid, riid, ppv) 
{ 
    HINSTANCE hinst = LoadLibrary(dllPath); // TODO: Maybe it is already loaded 
    dllGetClassObject = GetProcAddress(hinst, "DllGetClassObject"); 
    return dllGetClassObject(rclsid, riid, ppv); 
} 

Outre la gestion des erreurs, vous devez également garder une trace des DLL vous avez déjà chargé. Utilisez une liste ou un tableau dans lequel chaque élément a un tuple pour suivre cela. À un moment donné, vous voudrez peut-être décharger tout ou partie d'entre eux.

Bien sûr, je suppose qu'il s'agit de serveurs COM inproc.

Questions connexes