Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » Resourcen aus einer Dll/exe in eine andere kopieren

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
11.06.2007, 11:41 Uhr
david-h



Hi,
ich arbeite zurzeit bei einem größeren Projekt mit. Meine Aufgabe ist es, einen Resourcen-Kopierer zu entwickeln, der alle Bilder, Icons und Cursor aus einer Windows-Binary (Dll oder Exe) in eine andere kopiert.
Dabei habe ich aber ein paar Probleme.

Das habe ich bis jetzt:

1. Der Pfad der Quell- und Zieldatei wird jeweils als Parameter übergeben, dann lade ich die Quelldatei als 'HMODULE' mittel 'LoadLibraryEx' und die Zieldatei in ein globales 'HANDLE' mittels BeginUpdateResource.
2.Mittels EnumResourceType lasse ich mir alle Resourcetypen auflisten und prüfe, ob es sich um Bilder, Icons oder Cursor handelt. Wenn ja, liste ich die Resourcenamen mittels EnumResourceNames.
3. In der Callback Funktion von EnumResourceNames rufe ich einfach EnumResourceLangs auf.
4. In der Callback-Funktion von EnumResourceLangs soll dann die Resource kopiert werden.
Zunächst finde ich die Resource mittels FindResourceEx. Dann lade ich die Resource mit LoadResource. Dann rufe ich noch LockResource auf und als letztes 'UpdateResource'

Doch leider wird keine einzige Resource kopiert.

Muss ich noch irgendeine Funktion aufrufen oder mache ich einfach nur irgendetwas falsch?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
11.06.2007, 13:30 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


Hi,
zeig mal deinen genauen Code, evtl steckt der Fehler im Detail.
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
11.06.2007, 14:31 Uhr
david-h



Das ist die Funktion die vom Benutzer aufgerufen werden soll:


C++:
extern "C" RESOURCECOPIER_API bool CopyResources(char *szSourceFile, char *szTargetFile)
{
    //Dll´s laden
    HMODULE hSourceLib = LoadLibraryExA(szSourceFile, NULL, DONT_RESOLVE_DLL_REFERENCES | LOAD_LIBRARY_AS_DATAFILE);
    g_hTargetLib = BeginUpdateResourceA(szTargetFile, TRUE);

    if (hSourceLib == NULL || g_hTargetLib == NULL)
    {
        //Fehler beim Laden!
        MessageBox(NULL, L"Konnte eine der beiden Dll´s nicht laden!", L"Error", 0);
        return false;
    }
    
    //Typen der Resourcen auflisten
    EnumResourceTypesA(hSourceLib,
        (ENUMRESTYPEPROCA) EnumTypesFunc,
        0);

    return true;
}


Hier ist EnumResourceTypes und EnumResourceNames:


C++:
BOOL EnumTypesFunc(
    HMODULE hModule,
    LPCSTR lpType,    
    LONG_PTR lParam)
{
    if (lpType == MAKEINTRESOURCEA(2) || lpType == MAKEINTRESOURCEA(3) || lpType == MAKEINTRESOURCEA(1)) //Icons, Cursor und Bilder kopieren
    {
        EnumResourceNamesA(hModule, lpType, (ENUMRESNAMEPROCA) EnumNamesFunc, 0);
    }
    return true;
}

BOOL EnumNamesFunc(
    HMODULE hModule,
    LPCSTR lpType,
    LPCSTR lpName,
    LONG_PTR lParam)
{
     // Sprachen auflisten & Resource kopieren
    EnumResourceLanguagesA(hModule, lpType, lpName, (ENUMRESLANGPROCA)EnumLangsFunc, 0);
    return true;
}


Und zu guter letzt die Callback-Funktion von EnumResourceLangs, die dann die Resource auch kopieren soll:


C++:
BOOL EnumLangsFunc(
    HMODULE hModule,
    LPCSTR lpType,
    LPCSTR lpName,
    WORD wLang,
    LONG_PTR lParam)
{
    HRSRC hResInfo = FindResourceExA(hModule, lpType, lpName, wLang);
    if (hResInfo == NULL)
    {
        MessageBoxA(NULL, "Konnte Resource nicht finden!", "Error", 0);
        return false;
    }
    HGLOBAL hResHandle;
    void *lpResData;

    //Resource laden
    hResHandle = LoadResource(hModule, hResInfo);
    if (hResHandle == NULL)
    {
        MessageBoxA(NULL, "Konnte Resource nicht laden!", "Error", 0);
        return false;
    }

    lpResData = LockResource(hResHandle);
    if (lpResData == NULL)
    {
        MessageBoxA(NULL, "Fehler beim locken der Resource!", "Error", 0);
        return false;
    }

    //geladene Resource in Ziel-Dll speichern
    if (UpdateResourceA(g_hTargetLib, lpType, lpName, wLang, lpResData, SizeofResource(hModule, hResInfo)) == false)
    {
        MessageBoxA(NULL, "Konnte Resource nicht in die Ziel-Dll kopieren!", "Error", 0);
        return false;
    }

    return true;
}


Was ich oben vergessen habe zu sagen:
Der Code kompiliert einwandfrei, er tut nur nicht das, was er soll.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
11.06.2007, 15:21 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


hi,
ohne EndUpdateResource werden die Daten nicht geschrieben.
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
11.06.2007, 17:25 Uhr
david-h



Vielen Dank, ich hätte vielleicht die Dokumentation genauer lesen sollen.

Funktioniert jetzt einwandfrei!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: