Ressourcen entpacken



  • Hi, ich möchte ein Programm schreiben, welches ressourcen enthält die ich dann später benutzten möchte.

    Also, ich bin schonmal soweit, dass ich jede X-beliebige datei mitlinken lassen kann.

    Nur ich komme an diese mitgelikten Daten nichtmehr rann.

    Das ist mein momentaner Code:

    main.c

    #include <windows.h>
    #include "resource.h"
    
    int APIENTRY WinMain(HINSTANCE hInstance,
                         HINSTANCE hPrevInstance,
                         LPSTR     lpCmdLine,
                         int       nCmdShow)
    {
      HRSRC hRes = FindResource(NULL,MAKEINTRESOURCE(ID_MOD_02),"CUSTOM");
      HGLOBAL hResLoaded = LoadResource(NULL, hRes);
      DWORD dwResSize = SizeofResource(NULL, hRes);
      LPVOID pData = LockResource(hResLoaded);
      HANDLE hTemp = CreateFile("NEU.mod", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL);
      DWORD dwBytesWritten;
      WriteFile(hTemp, pData, dwResSize, &dwBytesWritten, NULL);
      CloseHandle(hTemp);
      UnlockResource(hResLoaded);
    //  DeleteFile(szNewFile);
      CloseHandle(hTemp);
      UnlockResource(hResLoaded);
      return 0;
    }
    

    bla.rc :

    ID_MOD_02 CUSTOM "02.MOD"
    

    resource.h

    #define ID_MOD_02 1000
    

    Nunja, wenn man das Programm startet, erstellt sich die "NEU.mod", aber sie ist völlig leer.

    Was mache ich falsch?

    Danke schonmal

    mfg codeworx


  • Mod

    Wieso hast Du bei keinem der Statments hInstance angegeben?
    Was sagen den die Handles bei der Rückgabe. Sind die denn !=0?



  • Hm, hab das grad noch bei meinen Code-Snippets gefunden, vllt. hilfts:

    #include <iostream>
    #include <windows.h>
    #include <conio.h>
    
    #include "resource.h"
    
    bool ExtractReSrcFile(const TCHAR*,WORD,const TCHAR*,HINSTANCE);
    
    int main()
    {
        ExtractReSrcFile(TEXT("FILE"), IDR_FILE, TEXT("C:\\Demo.wav"));
    
        while(!kbhit());
        return (0);
    }
    
    bool ExtractReSrcFile(const TCHAR* pszType, WORD wReSrcID, const TCHAR* pszLocation, HINSTANCE hInst = GetModuleHandle(NULL))
    {
        if(pszType == NULL || pszLocation == NULL)
           return (false);
        HRSRC hSrcFile = FindResource(hInst, MAKEINTRESOURCE(wReSrcID), pszType);
        if(hSrcFile != NULL)
        {
            HGLOBAL hSrcFileLoad  = LoadResource(hInst, hSrcFile);
            void*   pvSrcFileData = LockResource(hSrcFileLoad);
            size_t  stSrcFileSize = SizeofResource(hInst, hSrcFile);
            HANDLE  hReSrcFile    = CreateFile(pszLocation, GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
            if(hReSrcFile == INVALID_HANDLE_VALUE)
               return (false);
            WriteFile(hReSrcFile, pvSrcFileData, stSrcFileSize, NULL, NULL);
            CloseHandle(hReSrcFile);
    
            return (true);
        }
        return (false);
    }
    


  • CodeFinder, ich habe deinen Code mal ausprobiert, aber da entsteht nur ne Endlosschleife.

    Ich muss auch dabei sagen, dass ich zum ersten mal mit Ressourcen arbeite und von WinAPi sogut wie keine Ahnung (bis auf Winsock) habe.

    Ich bin mir auch garnicht sicher, ob meine .rc oder resource.h dateien richtig sind, weil ich habe mal die FindResource() funktion abgefragt und anscheinend wird meine Resource nicht gefunden (falsch deklariert/gelinkt)? (Mit gelinkt wird die Resource auf jedenfall, wenn ich zB ne .mp3 von 3 mb mitlinke, wächst das Programm um 3mb)

    Wäre nett wenn mir jemand ganz genau sagen würde was ich in die .rc und resource.h reinmachen muss.

    mfg


  • Mod

    Ich wiederhole mich: Solange Du den hInst Parameter nicht an die entsprechenden Funktionen übergibst geht es nicht!



  • entschuldigung, aber ich habe über winapi sogut wie keine ahnung (nur winsock)

    und ich weis nicht wie das jetzt genau gehen soll, wäre aber nett wenn du mir den code richtig schreiben könntest :>

    Danke schonmal falls du es machst.

    mfg


  • Mod

    Versuch es doch einfach mal mit Lesen der Anleitung.
    Das ist die Funktion FindResource, diese Funktion nimmt einen ersten Parameter. Dieser Parameter ist die hInstance Deine Programmes. Ohne die weiß FindResource nicht wo es suchen soll!

    Lesen bitte!



  • welche anleitung?!

    bei msdn steht:

    HRSRC FindResource(
    HMODULE hModule,
    LPCTSTR lpName,
    LPCTSTR lpType
    );

    nix hInstace, wobei ich nichtmal weiß was "hInstace" ist.

    Ich habe auchnicht vor mich mit WinApi zu beschäftigen im moment, da ich andersweitig beschäftigt bin.

    Ich habe eigentlich nur vor ressourcen mitzulinken und diese dann zu entpacken, ich wollte jetzt nicht WinApi lernen, sondern nur diese eine sache...

    mfg



  • naja hInstance sollte mit GetModuleHandle(NULL) (wie codefinder sagte) sich schon zufrieden geben. Sollte dir aber trotzdem schon bei FindResource raushauen, weil dein Resourcetype nicht richtig ist (da CodeFinder "FILE" angegeben hat).



  • so, habe mir sagen lassen, das mein typ RT_RCDATA für RawData sein muss, und nix Custom oder FILE.

    das mit hInst will immernochnicht (falsche typen hier, does not match da, usw. usf.).

    Leute, ich suche schon seit mehreren tagen (schon alleine wie man dateien mitlinkt hat mich 2 tage gekostet)

    das mit dem entpacken hab ich bist jetzt nochnet geschafft,...

    Ich habe auchnoch anderes zu tun als nur mich dieser einen Sache zuzuwenden bin bin langsam völlig gernervt.

    Ich weiss ja, man soll google benutzen, man soll die forum suche benutzen, etc pp. hat ich alles gemacht, ich habe seit mehr als 3 tagenfür das mitlinken und entpacken gesucht.

    Sorry, dass ich einfach so "dreist" frage, aber kann mir nicht jemand ein fertiges beispiel (mit .rc file und resource.h) schreiben, was auch funktioniert?

    Ich wäre sehr dankbar.

    mfg



  • codeworx schrieb:

    CodeFinder, ich habe deinen Code mal ausprobiert, aber da entsteht nur ne Endlosschleife.[...]

    lol ?! hm klingt irgendwie unglaubwürdig, da da ja gar keine Schleife (explizit) verwendet wurde... . Was sagt Dir denn der Debugger ?



  • natürlich ist da ne schleife:

    while(!kbhit());

    Das Prog funzt wie es ist nicht bei mir.

    Ich weis auch garnicht ob ic hdie ressourcen richtig im resource script (die .rc) datei richtig deklariert habe, oder ob das was in der resource.h steht richtig ist...

    Ich will einfach nur nen kleinen resourcen entpacker, der die mitgelinkten ressourcen entpackt, mit möglichst wenig aufwand.

    mfg



  • Mannomann...

    // In bla.rc
    #include "resource.h"
    ID_MOD_02  BINARY  "MyFile.xxx"
    
    #include <windows.h>
    #include "resource.h"
    
    int APIENTRY WinMain(HINSTANCE hInstance,
                         HINSTANCE hPrevInstance,
                         LPSTR     lpCmdLine,
                         int       nCmdShow)
    {
       HRSRC hrsrc = FindResource((HMODULE)hInstance, 
                                  MAKEINTRESOURCE(ID_MOD_02), 
                                  "BINARY");
       if(!hrsrc)
          MessageBox(NULL, "Could not find resource", "ERROR", MB_OK|MB_ICONERROR);
    
       LPVOID pData = (LPVOID)LoadResource((HMODULE)hInstance, hrsrc);
       if(!pData)
          MessageBox(NULL, "Could not load resource", "ERROR", MB_OK|MB_ICONERROR);
    
       return 0;
    }
    

    EDIT: Deine resource.h war schon OK. Du musst sie natürlich noch in bla.rc inkludieren (s.o.)


  • Mod

    @webfritzi:
    Warum castest Du hInstance? Das irritiert doch nur und ist Quelle für üble Fehler. Und wenn wäre höchstens ein static_cast hier erlaubt um diese Fehler zu vermeiden... 🕶



  • webfritzi ich liebe dich, ich will ein kind von dir^^ funzt 1a und das mit createfile und writefile konnte ich wie gehabt benutzen....

    mfg



  • Martin Richter schrieb:

    @webfritzi:
    Warum castest Du hInstance? Das irritiert doch nur und ist Quelle für üble Fehler. Und wenn wäre höchstens ein static_cast hier erlaubt um diese Fehler zu vermeiden... 🕶

    Deswegen:

    codeworx schrieb:

    das mit hInst will immernochnicht (falsche typen hier, does not match da, usw. usf.).



  • codeworx schrieb:

    natürlich ist da ne schleife:

    while(!kbhit());

    Das Prog funzt wie es ist nicht bei mir.

    Ich weis auch garnicht ob ic hdie ressourcen richtig im resource script (die .rc) datei richtig deklariert habe, oder ob das was in der resource.h steht richtig ist...

    Ich will einfach nur nen kleinen resourcen entpacker, der die mitgelinkten ressourcen entpackt, mit möglichst wenig aufwand.

    mfg

    OMG! Ich rede von der Funktion die main-Funktion soll doch nur die Verwendung verdeutlichen! Dass das noch anzupassen ist, ist doch wohl klar.



  • Egal, CodeFinder. Du hast ihm nichts neues gegeben. Den Code hatte er doch (in etwa) auch schon.



  • Ne egal ist das nicht. Er soll ja auch verstehen, dass es mir um die Funktion ('ExtractReSrcFile') ging, nicht um die main 🙄 .



  • Ich denke, das war ihm klar. Mit seinem Statement wollte er nur ausdrücken, dass außer einer Endlosschleife da nicht viel passiert. Wie vorher halt auch schon.


  • Mod

    WebFritzi schrieb:

    Deswegen:

    codeworx schrieb:

    das mit hInst will immernochnicht (falsche typen hier, does not match da, usw. usf.).

    Und das glaubst Du?
    1. HMODULE==HINSTANCE siehe defines in windows.h. Der Code funktioniert bei mir ohne cast!
    2. Überflüssige casts sind immer ein Problem
    3. Jederr cast will sehr wohl überlegt sein.


Anmelden zum Antworten