Ressource Dateien verwenden



  • Hi zusammen,

    ich habe nun bereits 2-3 Stunden alle möglichen Threads zu diesem Thema gelesen. Dort läuft es letzendlich immer auf Resource DLLs hinaus. Irgendwie brauch ich das aber nicht.
    Ich möchte eine Resource-Datei haben, die ein paar Jpegs beinhaltet (~200kb insgesamt) und die statisch in die exe gelinkt wird.

    Ich habe zuvor noch nicht mit rc-Dateien gearbeitet.

    Ich arbeite mit dem Embarcadero Builder 2010.
    Im Projekt befindet sich eine *.rc Datei:

    JpgControlTime RCData "Images\\Valve\\ControlTime.JPG"
    JpgControlTime_EVG RCData "Images\\Valve\\ControlTime_EVG.JPG"
    JpgControlTime_EVGH RCData "Images\\Valve\\ControlTime_EVGH.JPG"
    ...
    ...

    Ich weiß nicht ob die Bezeichner case sensitiv sind (habe aber schon NUR Groß ausprobiert und hat auch nicht funktioniert).
    Ich kann sie alleine erzeugen und es entsteht eine *.res Datei.
    Ich bin mir aber nicht im klaren ob man irgendwas spezielles machen muss, damit sie statisch gelinkt wird? Ich habe es noch nicht geschafft Zugriff auf den Inhalt zu erlangen.

    Einem anderen Thread folgend habe ich es so probiert:

    TResourceStream *rcStream=new TResourceStream( 0 , "JpgControlTime" , UnicodeString("RCDATA").w_str() );
    

    Ich habe auch schon eine Ressourcen-DLL erzeugt und Zugriff zu erhalten:

    HINSTANCE hinstDLL=LoadLibrary("meine.dll");
    TResourceStream *rcStream=new TResourceStream( (int)hinstDLL , "JpgControlTime" , UnicodeString("RCDATA").w_str() );
    

    Egal was ich tue, ich bekomm immer die Fehlermeldung mit "EResNotFound" , dass die Ressource nicht gefunden worden ist.

    Ich scheine irgendwas essentiell falsch zu machen. Muss man irgendwo explizit sagen, dass er die Datei einbinden soll? . Also wie gesagt, ich brauche keine DLLs. Mir reicht es wenn die Bilder statisch in der Exe gelinkt sind und ich Zugriff auf sie habe... was mache ich falsch? 😕



  • Warum nimmst du nicht den einfachen und normalen Weg über den Menüpunkt
    Projekt/Ressourcen? Bild-Dateien auswählen, benennen, fertig.

    Zum Weg über RC-Dateien: Die musst du dem Projekt/Hinzufügen.
    Sollte immer noch kein Erfolg dasein, die erzeugte RES-Datei aus dem Projekt entfernen, Projekt neu erstellen
    und danach wieder die RES-Datei hinzufügen.



  • Also ich mach dies so (BCB6, laden von 2 Bitmaps)

    bmpSortUp = new Graphics::TBitmap;
    bmpSortDown = new Graphics::TBitmap;
    bmpSortUp -> LoadFromResourceName(DWORD(HInstance), "PIC_SORT_UP");
    bmpSortDown -> LoadFromResourceName(DWORD(HInstance), "PIC_SORT_DOWN");
    

    Das Ressource script muß dem Projekt hinzugefügt werden.
    pic.rc

    PIC_SORT_UP   BITMAP "SORT_UP.BMP"
    PIC_SORT_DOWN BITMAP "SORT_DOWN.BMP"
    

    Die RC Datei ist das Ressource Script, und die RES-Datei ist das fertige Binary welches mitgelinkt wird.
    MfG Stephan



  • @kpeter

    ich gehe doch den Weg. Projekt/Ressourcen. Dort wird aber letztendlich auch nur eine Ressourcendatei erzeugt (mit dem Inhalt, den ich gepostet habe)

    Aber wie greife ich darauf zu?? 😞 Ich will irgendwo in meinem Programm jetzt das Bild verwenden. Irgendwie muss ich ja auf dieses Ressourcen zugreifen... aber wie... X_x?



  • Unter dem Bezeichner, den das Bild im Ressource-Hinzufügen-Dialog von dir bekommen hat,
    wird es so geladen.

    Image1->Picture->Bitmap->LoadFromResourceName(0,(AnsiString)"BILD1");
    

    ed:Tags



  • Exakt die gleiche Problematik:

    "..EResNotFound mit der Meldung 'Ressource CT nicht gefunden'..."

    Der gleiche Fehler wie bei allen anderen Versuchen ... Da stimmt irgendwas nicht.



  • Folgendes:

    Es funktioniert mit BMP Dateien.

    Bei Jpegs (RCData) hingehen nicht.





  • Olli85 schrieb:

    Es funktioniert mit BMP Dateien.
    Bei Jpegs (RCData) hingehen nicht.

    Ja, ist ein anderer Res-Typ.

    Es gibt eventuell einen kürzeren Weg, aber bei RT_RCDATA gehts mMn nur über einen Stream und eine TJPEG-Image.

    Folgendes hab ich eben mal getestet:

    HINSTANCE hInst;
    hInst = reinterpret_cast<HINSTANCE>(HInstance);
    HRSRC hRes;
    
    hRes = FindResource( HInstance, "BILD1",  RT_RCDATA );
    if ( hRes != NULL) {
    
    	TResourceStream  *mstream = 
               new TResourceStream((int)HInstance,
    	   L"BILD1", MAKEINTRESOURCEW(10));
    
            // Bild dekomprimieren	
    	TJPEGImage* jpimg  = new TJPEGImage();
    	jpimg->CompressionQuality	= 90;
    
    	jpimg->Grayscale	= false;
    	jpimg->Performance 	= jpBestQuality;
    	jpimg->ProgressiveDisplay	= false;
    	jpimg->ProgressiveEncoding	= false;
    	jpimg->Scale		= jsFullSize;
    	jpimg->Smoothing	= true;
    	jpimg->PixelFormat  = TJPEGPixelFormat::jf24Bit;
    	jpimg->LoadFromStream(mstream);
    	int wi = jpimg->Width;
    	int hi = jpimg->Height;
    	// ZwischenBitmap
    	Graphics::TBitmap* pBmp = new Graphics::TBitmap();
    	pBmp->SetSize(wi, hi);
    	// zuweisen
    	pBmp->Assign(jpimg);
    	Image1->Picture->Assign(pBmp);
    	delete jpimg;
    	delete pBmp;
    	delete mstream;
    }
    

    edit: unnötiges entfernt
    mfg
    kpeter



  • @Braunstein
    Das Tutorial habe ich auch schon gelesen. Es lief immer auf den gleichen Fehler hinaus, trotz DLL.

    @kpeter
    Sehr genial. Irgendwie fehlt mir noch das Fachwissen für die ganzen Handle ..HINSTANCE ... usw.
    Ich acker das mal durch , viel Dank.

    Beste Grüße,
    Oliver


Anmelden zum Antworten