WTL -Möglichkeit, Ressourcen zum Laden von einer DLL in einer Nicht -MFC -App zu zwingen? (Wir verwenden WTL/ATL, nicht gerade Win32)

StackOverflow https://stackoverflow.com/questions/5341850

Frage

Ich habe gepostet diese Frage Früher und jetzt haben die lokalisierten Zeichenfolgen geladen (die, die wir mit LoadString () erhalten), aber ich muss auch alle anderen Ressourcen aus der Satelliten -DLL laden.

MFC hat den AFXSetResourceHandle () -Anruf, aber ich brauche etwas Äquivalentes für eine Nicht-MFC-App? Ich vermute, ich muss das im Initialisierungscode irgendwo festlegen, damit alle meine Ressourcen aus einer anderen DLL geladen werden. Wie mache ich das in einem WTL -Kontext (Windows -Vorlagenbibliothek)?

BEARBEITEN:

Dies fasst unser Problem zusammen.

Wir verwenden nicht gerades Win32, sondern ATL und WTL für Windows -Sachen. Wir können uns also nicht auf das MFC -Zeug verlassen und haben keine niedrige Kontrolle über das Laden von Menüs und Dialogressourcen.

EDIT: Hmmm ...Dies scheint eine Antwort zu haben, aber ich hatte auf etwas Besseres gehofft. Beispielsweise - eine setResourceinstance () -Methode analog zu getResourceinstance () in einem Cappmodule -Objekt.

War es hilfreich?

Lösung

Die Ressourcenfunktionen (FindResource, LoadResource) nutzen ein Modul als einen der Parameter.

Verwenden GetModuleHandleEx Um den Modulgriff für die DLL zu erhalten.

Bearbeiten: Zusätzliche Informationen für ATL/WTL.

WTL verwendet ATL::_AtlBaseModule.GetResourceInstance() Für das Modulgriff in seinen Win32 -Anrufen. Da ist ein SetResourceInstance Funktion, die Sie aufrufen können, um das verwendete Modul zu ändern. So etwas sollte zu Beginn Ihres Programms funktionieren:

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

Andere Tipps

Gelegentlich ist die obige Methode nicht verwendbar, z. B. wenn Sie Windows 2000 aus irgendeinem Grund noch unterstützen müssen. In diesem Fall ist es gut, den folgenden Trick zu haben.

Wir deklarieren eine statische Variable, was bedeutet, dass seine Adresse innerhalb des Moduls sein wird, in das sie verknüpft war. Wir verwenden dann die Adresse zu dieser Variablen, um die Basisadresse dieses zugewiesenen Bereichs abzufrage, was das ist, was das ist HMODULE ist.

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

Dies tut keineswegs ungültig, Marks Antwort! Denken Sie einfach als Fallback -Option im Auge, wenn Sie Ihre Programme benötigen, um auf alten Systemen auszuführen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top