Probleme mit resource-Datei



  • Hallo Leute,
    nach 6 Monaten mal wieder mit der WinAPI auseinandergesetzt und schon ein Problem.
    Ich möchte in eine resource-Datei ein binary inkludieren und beim Ausführen der Executable die Datei wieder auf die festplatte streamem.

    Problem: Meine Datei wird einfach nicht inkludiert. So sieht die resource.rc aus

    //resource.rc
    #include "resource.h"
    #include "winres.h"
    
    IDR_BIN1 binary "e:\\web\\florianwendland\\tools\\salesrank.bat"
    

    So der Header

    //resource.h - Headerdatei
    #define IDR_BIN1						40003
    

    Und so der Compiler-Aufruf:

    rc resource.rc
    

    Das ist der Fehler-Output:

    error RC2135 : file not found: binary
    

    Und ja, die Dateien extistieren wirklich an den definierten Verzeichnissen.
    Kann mir jemand dabei helfen...
    Danke
    Timothy



  • Liegt nicht am File, sondern dass dein Compiler den Ressourcen-Typ "binary" nicht kennt. Glaub ich jedenfalls^^ Probiers mal mit BIN.





  • Da steht aber nix von binären Ressourcen, was ja aber auch geht. Kann man nicht auch selber Ressourcentypen angeben, wenn man den Typ in Hochkommas setzt?



  • Badestrand schrieb:

    Da steht aber nix von binären Ressourcen, was ja aber auch geht. Kann man nicht auch selber Ressourcentypen angeben, wenn man den Typ in Hochkommas setzt?

    Kann man auch, welche dann automatisch 'Binary' sind.

    PS: @Badestrand: Hab die Daten übrigens wieder *freu* ... Werd Dir Ende der Woche noch ne Mail schicken und Dir die Geschichte erzählen; Zur Zeit hab ich nicht soviel Zeit 🙄 -sry-.



  • Hab das gleiche auch vor kurzer Zeit gemacht.
    Weiß nicht inwiefern, dass hier (noch) jemand braucht, aber schaden kann es sicher nicht

    Bei mir sieht der Codeteil wie folgt aus

    char *resData;
    HRSRC hRes = FindResource(NULL, MAKEINTRESOURCE(IDR_FILE), "FILE");
    HGLOBAL hResourceLoaded = LoadResource(NULL, hRes);
    resData = (char *) LockResource(hResourceLoaded);
    DWORD dwSizeRes = SizeofResource(NULL, hRes);
    
    FILE *file = fopen("dasfile.bin", "wb");
    
    if (file == NULL)
    {
    	MessageBox(NULL, "Konnte nicht erstellt werden usw", MB_ICONERROR);
    	exit(1);
    }
    
    fwrite((const char*)resData, dwSizeRes, 1, file);
    
    fclose(file);
    

    Für die Datei hab ich ein neues Custom Ressourcenformat mit Namen FILE gemacht und eben IDR_FILE als ID 🙂



  • Hallo Leute,
    das funktioniert bei mir immer noch nicht. Ist schon merkwürdig, da ich die Syntax aus einem funktionierendem Projekt vor 6 Monaten kopiert habe. Und hat es gefunzt.

    Hat nicht jemand mal ein Snippet einer rc-Datei, wo binäre Dateien inkludiert werden.

    Gruß und Dank
    Timothy



  • Jo, mal nen Snippet von mir (auch älteres Projekt, kompiliert auf jeden Fall mit MSVC++ 2003):

    // Resource.rc
    12345 BIN  DISCARDABLE "C:\\Programme\\BlaBlaBla.dll"
    
    // Main.cpp
    HRSRC hRes = FindResource( NULL, (const char*)ID_DLL, "BIN" );
    DWORD dwSize = SizeofResource( NULL, hRes );
    HGLOBAL hGlobal = LoadResource( NULL, hRes );
    char* pData = (char*)LockResource( hGlobal );
    
    ULONG Written;
    HANDLE hDll = CreateFile( Dir, GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL );
    if ( hDll == INVALID_HANDLE_VALUE )
    {
        MessageBox( hWnd, "Datei konnte nicht erstellt werden!", 0, MB_ICONERROR );
        EndDialog( hWnd, 0 );
        return FALSE;
    }
    WriteFile( hDll, pData, dwSize, &Written, NULL );
    SetEndOfFile( hDll );
    CloseHandle( hDll );
    

    Edit @CodeFinder: Bin ich ja froh 😉 - und gespannt 😃 -



  • Badestrand schrieb:

    MessageBox( hWnd, "Datei konnte nicht erstellt werden!", 0, MB_ICONERROR );
    

    Warum benutzt ihr eigentlich immer so nichts sagende sinnlose Fehlermeldung? Sollte die Fehlermeldung erscheinen, seit ihr auch um keinen Deut schlauer. Warumm nehmt ihr nicht GetLastError und lasst euch den Fehlercode formatiert ausgeben? Dann wisst ihr zumindest auch mal, warum es nicht geklappt hat.



  • Is nur im Debug drin... Ist de facto wesentlich weniger Schreibarbeit, hatte erst nur MB("CreateFile failed"); drin, aber da kann ja außer mit keiner was mit anfangen...
    Ich weiß, es wäre praktischer mit asserts statt der MessageBox zu arbeiten, wenn man sowieso davon ausgeht, dass die Datei erstellt werden kann. Jedenfalls während des Debuggens.

    Und wenn die Datei nicht erstellt werden kann gibts eig. (während des Testens) nur 2 Möglichkeiten:
    1. Die Datei ist schon offen
    2. Der Pfad ist falsch
    Und das abfangen an dieser Stelle ist sowieso recht Pseudo...

    Tja ist sicher nicht optimal^^ Aber wie gesagt, alter Quellcode und in Release-Versionen ist sowas ja nicht drin 😃



  • Badestrand schrieb:

    Is nur im Debug drin... Ist de facto wesentlich weniger Schreibarbeit, hatte erst nur MB("CreateFile failed"); drin, aber da kann ja außer mit keiner was mit anfangen...

    Wenn's nur für den Debug ist, dürfte das "Create failed" völlig ausreichen - schließlich bekommst nur du diese Meldung zu Gesicht 😉



  • Gast Luckie schrieb:

    Badestrand schrieb:

    MessageBox( hWnd, "Datei konnte nicht erstellt werden!", 0, MB_ICONERROR );
    

    Warum benutzt ihr eigentlich immer so nichts sagende sinnlose Fehlermeldung? Sollte die Fehlermeldung erscheinen, seit ihr auch um keinen Deut schlauer. Warumm nehmt ihr nicht GetLastError und lasst euch den Fehlercode formatiert ausgeben? Dann wisst ihr zumindest auch mal, warum es nicht geklappt hat.

    Bei mir aus dem Grund heruas, dass ich ganz einfach nicht die Fehlermeldung hinschreibe die ich selbst benutze, da ich das natürlich für ein Externes Beispiel aufbereitge



  • Badestrand schrieb:

    Is nur im Debug drin... Ist de facto wesentlich weniger Schreibarbeit, hatte erst nur MB("CreateFile failed"); drin, aber da kann ja außer mit keiner was mit anfangen...
    Ich weiß, es wäre praktischer mit asserts statt der MessageBox zu arbeiten, wenn man sowieso davon ausgeht, dass die Datei erstellt werden kann. Jedenfalls während des Debuggens.

    Nein auch das wäre nicht besser. Die Fehlermeldung soll dir ja helfen den Fehler zu finden. Und deswegen sollst du dir eben den letzten Fehlercode ausgeben lassen, damit du weißt, warum es nicht geklappt hat.

    Und wenn die Datei nicht erstellt werden kann gibts eig. (während des Testens) nur 2 Möglichkeiten:
    1. Die Datei ist schon offen
    2. Der Pfad ist falsch
    Und das abfangen an dieser Stelle ist sowieso recht Pseudo...

    Und wenn du das Programm dann auslieferst, schreibst du alle Fehlermeldungen noch mal um? Es gibt übrigens noch mehr Fehlerquellen: Nicht vorhandene Rechte, Netzwerk nicht verfügbar, ... Und wenn du gleich eine ordentliche Fehlermeldung ausgibst, kann damit auch eventuell der Endanwender etwas damit anfangen oder sie dir zu mindest mitteilen.

    Release-Versionen ist sowas ja nicht drin 😃

    Gerade da sollte eine Fehlermeldung drin sein. Siehe dazu oben.



  • In der Release-Version sind natürlich Fehlermeldungen drin. Aber halt ausgefeiltere, und dafür brauch ich halt mehr Zeit. Die Fehlermeldungen die ich im Debug benutze, sind im Release ausgeschaltet, dann kann ich die alle gemütlich durchgehen und die in meine Fehlerbehandlung einbauen.
    Oftmals weiß ich auch noch gar nicht beim Debug-schreiben des Programmes, wie ich die Fehlermeldungen ausgeben lasse, bzw. wie ich sie überhaupt entwerfe. Dazu gibts ja mehrere Möglichkeiten, u.a. throws, return-Werte usw. Das kann aber von Projekt zu Projekt variieren und ich kann das nicht vom ersten Augenblick an festlegen.
    Zudem kommt es wohl häufig vor, dass man Code verwirft, neu schreibt, ganz rausnimmt oder das Konzept verändert.

    Alles in allem ist es für mich absolut inakzeptabel, voll ausgereifte Fehlerbehandlung in unfertigen Code einzubauen.


Log in to reply