2010-08-26 4 views
0

Nous avons une très grande application MFC avec 16 projets dans la solution. Chaque projet est une DLL. Quatre (4) de ces projets sont ce que nous appelons «réseau». Dans chaque réseau, il y a une boîte de dialogue que nous appellerons X. Cette boîte de dialogue est très différente dans chacun des réseaux mais le nom de la boîte de dialogue elle-même est le même dans chacune des ressources. Dans resource.h, ils ont également le même ID (valeur). Ce qui est arrivé maintenant, c'est que quand je suis sur le réseau 1 et charge la classe avec le dialogue X, il essaie d'utiliser la boîte de dialogue du réseau 2. Comme ils n'ont pas tous le même contrôle dedans, il se bloque dans DoDataExchange en essayant de trouver des contrôles qui n'existent pas dans l'autre réseau.Boîte de dialogue de chargement de l'application MFC à partir d'une autre DLL

Est-ce que quelqu'un sait ce que cela peut causer? Attemps à changer le nom dans le réseau qui ne fonctionne pas n'a rien changé puisqu'il utilise l'ID ...

Je pense toujours que la DLL utilisait son propre resource.h mais maintenant il semble que ce n'est pas le cas ...

Quelqu'un peut-il aider? Merci

+0

Cet article semble dire que chaque DLL regarde en soi avant de regarder ailleurs ... (http://support.microsoft.com/kb/150121/fr-fr). Est-ce un moyen de connaître l'ordre de ce processus? –

Répondre

3

Il semble que vous devez appeler AfxSetResourceHandle pour spécifier la DLL à partir de laquelle charger la boîte de dialogue.

Editer: Compte tenu de votre description, vous aurez besoin de l'appeler avec la bonne valeur tous les fois que vous affichez une boîte de dialogue. Changer des choses comme l'ordre de chargement DLL ne va pas résoudre le problème - à tout moment, MFC va essayer d'utiliser un pour que les DLL/EXE puissent charger toutes les boîtes de dialogue, et c'est modal, donc il reste le même jusqu'à ce que vous le changiez. Étant donné le même ID de ressource ayant besoin de faire référence à différentes ressources à différents moments, vous devez lui indiquer lequel à un moment donné - sinon, vous obtenez la première chose qu'il trouve avec le bon ID, et presque aucun contrôle sur lequel cela va être.

+0

Merci pour la réponse. Je l'essaie et ça marche ... MAIS comme MSDN dit: 'L'instance ou le module gère un fichier .EXE ou DLL à partir duquel les ressources de l'application sont chargées.' et ceci est mauvais parce que d'autres dialogues pourraient utiliser d'autres dll que celui-ci donc une autre partie de l'application ne pourrait pas fonctionner ... Toutes les dll sont chargées, je pense que c'est quelque chose lié à l'ordre de la charge mais je ne trouve pas où c'est ... –

+0

Merci pour votre réponse. J'ai finalement utilisé la solution dans ce post: (http://www.codeguru.com/forum/archive/index.php/t-304181.html) donc dans le destructeur, je remets tout comme avant et ça marche super bien. Je vous remercie. –

Questions connexes