Disons que je le code suivant qui est exécuté dans un thread d'une application COM multi-thread:Comment utiliser LoadLibrary dans plusieurs threads COM Accross?
// Thread 1
struct foo {
int (*DoSomething)(void ** parm);
};
HMODULE fooHandle = LoadLibrary("pathToFoo");
typedef int (*loadUpFooFP)(foo ** fooPtrPtr);
loadUpFooFP loadUpFoo;
loadUpFoo = (loadUpFooFP)GetProcAddress(fooHandle, "fooLoader");
foo * myFoo;
loadUpFoo(&myFoo);
Tout cela fonctionne très bien et je peux alors appeler
myFoo->DoSomething(&parmPtr);
Cela fonctionne aussi ! Maintenant, un autre fil vient et charge son foo:
// Thread 2
foo * myFooInThread2;
loadUpFoo(&myFooInThread2);
Et cela, aussi, fonctionne très bien. Dans fil 2, je peux appeler DoSomething:
// Thread 2
myFooInThread2->DoSomething(&anotherParmPtr);
Maintenant, lorsque le fil 1 éventuellement en va, j'ai un problème. Je remarque que déboguer dans Visual Studio que l'adresse de DoSomething ne peut plus être évaluée. Après le premier fil meurt, quand j'appelle:
myFooInThread2->DoSomething(&anotherParmPtr);
Je reçois une violation d'accès. Le pointeur myFooInThread2 est toujours valide, mais pas le pointeur de fonction. Ce pointeur de fonction a été défini par un appel dans loadUpFoo qui à son tour était dans une DLL chargée par LoadLibrary.
Ma question est: où est-ce que je commence à chercher la raison pour laquelle cela échoue? Est-ce un problème avec la façon dont la DLL externe (que je charge avec LoadLibrary) définit le pointeur de fonction dans mon foo struct? Ou est-ce quelque chose à voir avec des threads différents utilisant la même bibliothèque? Ou, pourrait-il être lié d'une manière ou d'une autre à mon utilisation de COM dans cette application (l'appel de CoUninitialize dans le premier thread libérerait-il en quelque sorte cette mémoire ou bibliothèque)?
Je peux fournir plus de détails sur l'installation COM si cela peut être responsable. Merci!
Modifier: Merci pour les suggestions pour le moment. La structure foo est opaque - je ne connais pas vraiment son implémentation. La structure foo est déclarée dans un en-tête que j'importe. Il n'y a pas de méthodes de comptage de références que j'appelle explicitement et il n'y a pas d'autres interactions avec la bibliothèque chargée avec LoadLibrary. Je suis assez sûr que la structure foo n'est pas mappée en mémoire à une classe COM, mais comme je l'ai dit, elle est opaque et je ne peux pas dire avec certitude.
Les durées de vie des pointeurs foo sont correctement gérées (pas supprimées). La structure foo est une bibliothèque de chiffrement, donc je ne suis pas libre de divulguer plus. À ce stade, je suis convaincu qu'il n'y a rien de fondamentalement mauvais avec mon utilisation de LoadLibrary sur différents threads et dans une application COM (et je suppose que le nettoyage de la mémoire du pointeur de fonction est provoqué par quelque chose dans la bibliothèque en dehors de mon contrôle).
Le code que vous avez montré n'utilise pas COM. C'est juste l'utilisation normale de DLL. –