Ergebnis 1 bis 3 von 3

Thema: Bitmaps als binary an die Exe anhängen

  1. #1

    Bitmaps als binary an die Exe anhängen

    Hallöchen,

    ich wollte gerade einen Splashscreen für mein Programm basteln und dabei das Bitmap als Binary der Exe anhängen, da fiel mir ein, dass ich ja garnicht weiß, wie man das macht.
    Also ich hab's erstmal so versucht, ein char Array in der Größe von 54.000 byte zu erstellen und dort die Byte des Bitmaps abzulegen. Klappt aber nicht so optimal, die Zeichen liegen als ASCIIs vor und müssten wohl getrennt per Komma in Hochkomma (') stehen (praktisch so: char buffer[] = {'D','♫','◄','ý' ... usw}; ), was mir aber doch etwas zu mühsam ist, die 54.000 Zeichen so zu formatieren.

    Die Frage ist daher, gibt es einen einfachen Befehl wie etwa "include binary" oder sowas, womit man beliebige Dateien einfach ans Programm anhängen kann (und wie ruft man sie dann wieder auf) oder muss man die Daten tatsächlich selbst in ein Speicher-Array übertragen? Wie würde das dann aussehen? So wie oben per Komma und Hochkomma oder kann man das leichter machen?

    EDIT: Arg, ganz vergessen, es handelt sich dabei um C\C++ Code.

    mfg.

    Ynnus

    Geändert von Ynnus (30.06.2005 um 19:16 Uhr)

  2. #2
    Unter Windows kannst du, wenn du GCC (-> MinGW) benutzt, das Programm "windres" nehmen. Das erstellt aus Windows-Ressourcen-Dateien Objekt-Dateien die du in deine Binary linken kannst. In den Ressourcen-Dateien kann man alle möglichen Sachen angeben: Strings, Icons, Bitmaps, Mouse-Cursor, etc. Wie du im Programm auf die Sachen zugreifst weiß ich im Detail jetzt nicht, da müsstest du dann halt selbst nach Windows-Ressourcen und windres. (Es sind irgendwelche Funktionen aus der WinAPI.. LoadImage() oä wirds sein)

  3. #3
    was dingsi sagte, ist in ordnung ... Du kannst aber auch den ResHacker verwenden, um die Daten in deine Exe zu packen ...

    Die API Routine fuer Bitmaps heisst:

    HBITMAP LoadResourceBitmap(HINSTANCE hInstance, LPSTR lpString, HPALETTE FAR* lphPalette)

    Allerdings kannst du damit nur Bitmaps aus der BITMAP Sektion lesen.
    Eine Andere LowLevel moeglichkeit waere, direkt

    HGLOBAL LoadResource(
    HMODULE hModule, // resource-module handle
    HRSRC hResInfo // resource handle
    );

    und

    LPVOID LockResource( HGLOBAL hResData ); // handle to resource to lock

    zu verwenden. Damit kannst du jede beliebige Art von Daten aus den Resourcen einlesen, und dann so interpretieren, wie dus gerne haettest ... Auf diese Art benutze ich auch verschluesselte PNGs in meinem Tastenpatch als Spalchscreen.

    Eine Quick n Dirty Methode waere allerdings noch folgendes ...
    Du oeffnest zum Lesen in deinem Programm die Datei argv[0], also die ausgefuerte Datei selber. Dann ermittelst du die Dateigroesse in byte (filesize() ?) und setzt seinen Lesezeiger auf 4 byte vor Dateiende. Du liest einen Integer (also 4 byte ein) und setzt deinen Lesezeiger um 4+gelesener integer Byte zurueck. Das ist der Anfang deiner Daten mit der Groesse von (gelesener interger) Byte. Dann kompilierst du dein Programm, und macht

    copy myprog.exe + mybitmap.bmp myprog.exe

    anschliessend oeffnest du die Exe noch mit einem hexeditor und fuegst die Groesse des bitmaps an die Datei an (byteorder beachten)

    Statt der Groesseninfo kannst du natuerlich einen ganzen header erstellen, der z.B. auch checksummen enthaellt, sodurch du dann auch sehen kannst, ob ueber haupt sinnvolle daten vorhanden sind am ende der exe ...

    typedef struct myheader
    { char ID[5]='Y','n','n','u','s';
    char bmp[56000];
    }

    mit einem (zweiten) Programm laedst du dein bitmap, fuellst die myheader struktur aus, und schreibst sie ans ende deiner Exe.

    In der Exe oeffnest du sie selber (argv[0]) und gehst an die position filesize() - sizeof(myheader) und laedst ueber ein blockread oder aehnliches die daten direkt in ein myheader struct ein. dann checkst du ID == "Ynnus" und wenn das stimmt, dann ist das BMP korrekt vorhanden. Ist das BMP nicht in der Exe, dann wird in ID sicher nicht Ynnus stehen, und du kannst das Programm ordentlich beenden, und sagen, die exe sei korrupt oder so ...

    Gruss Luki

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •