2011-03-17 1 views
3

J'ai posté this question précédemment et maintenant j'ai chargé les chaînes localisées (celles que nous obtenons avec LoadString()) mais j'ai aussi besoin de charger toutes les autres ressources de la DLL satellite.WTL façon de forcer les ressources à charger à partir d'une DLL dans une application non mfc? (nous utilisons WTL/ATL, win32 pas droit)

MFC a l'appel AfxSetResourceHandle(), mais j'ai besoin de quelque chose d'équivalent pour une application non-mfc? Je suppose que je dois mettre cela dans le code d'initialisation quelque part afin que toutes mes ressources soient chargées à partir d'une autre DLL. Comment faire cela dans un contexte WTL (bibliothèque de templates Windows)?

EDIT:

This summarizes our problem.

Nous n'utilisons pas directement win32, mais ATL et WTL pour Windows. Donc, nous ne pouvons pas compter sur les trucs MFC et nous n'avons pas de contrôle de bas niveau sur le chargement des menus et des ressources de dialogue.

EDIT: Hmmm ... This seems to have an answer, mais j'espérais quelque chose de mieux que cela. Par exemple, une méthode SetResourceInstance() analogue à GetResourceInstance() dans un objet CAppModule.

Répondre

6

Les fonctions de ressource (FindResource, LoadResource) placent un descripteur dans un module comme l'un des paramètres. Utilisez GetModuleHandleEx pour obtenir le handle de module pour la DLL.

Édition: Informations supplémentaires pour ATL/WTL. WTL utilise ATL::_AtlBaseModule.GetResourceInstance() pour le handle de module dans ses appels Win32. Il y a une fonction SetResourceInstance que vous pouvez appeler pour changer le module utilisé. Quelque chose comme cela devrait fonctionner au début de votre programme:

HMODULE hmod; 
::GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_PIN, myDllFuncPtr, &hmod); 
ATL::_AtlBaseModule.SetResourceInstance(hmod); 
+0

Excellent - qui a fait ce que je voulais. – Tim

0

De temps en temps la méthode ci-dessus n'est pas utilisable, par exemple lorsque vous avez encore à soutenir pour une raison quelconque de Windows 2000. Dans ce cas, il est bon d'avoir le tour suivant à portée de main.

Nous déclarons une variable statique, ce qui signifie que son adresse sera dans le module dans lequel elle a été liée. Nous utilisons ensuite l'adresse de cette variable pour interroger l'adresse de base de cette zone allouée, ce qui est le HMODULE.

HMODULE GetCurrentModuleHandle() 
{ 
    MEMORY_BASIC_INFORMATION mbi; 
    static int iDummy; 
    VirtualQuery(&iDummy, &mbi, sizeof(mbi)); 
    return (HMODULE)mbi.AllocationBase; 
} 

Cela n'invalide en aucun cas la réponse de Mark! Gardez cela à l'esprit en tant qu'option de secours si vous avez besoin que vos programmes fonctionnent sur des systèmes anciens.

+0

Ceci est en fait sans rapport avec la question, qui consiste à dire aux classes de base WTL d'utiliser un module spécifique avec des ressources ('SetResourceInstance'). –

Questions connexes