Autor |
Beitrag |
Siluro
      
Beiträge: 74
Win XP Prof., Win XP64 Prof., Win 7 Prof.
Delphi 7 Ent., Delphi XE, Delphi XE5
|
Verfasst: Fr 04.02.05 13:14
Hi,
ich habe ein Problem beim erstellen und auslesen von Resource-Dlls.
Ich bin folgendermaßen vorgegangen:
//Erstellen einer rc-Datei "Test.rc".
1 BITMAP 1.bmp
2 BITMAP 2.bmp
3 BITMAP 3.bmp
usw.
//rc-Datei Compilieren
brcc32 Test.rc
//Dann bekomme ich den Fehler "Error Test.rc 1 14: Invalid bitmap format",
//also habe ich ein bisschen experimentiert und wenn die Einträge in der
//rc-Datei so aussehen
1 BMP 1.bmp
2 BMP 2.bmp
3 BMP 3.bmp
usw.
//funktioniert das Compilieren.
//Dann habe ich eine neue DLL erstellt in die ich die "Test.res" einbinde
{$R Test.res}
//Jetzt möchte ich die Resourcen aus der Dll auslesen, das sieht so aus:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| procedur TForm1.LoadResource; var h: THandle; bmp: TBitmap; begin h:=LoadLibrary('Test.dll'); if h<>0 then begin bmp:=TBitmap.Create; bmp.LoadFromResourceName(h, '1'); Combobox1.AddItem('', bmp); FreeLibrary(h); end; end; |
Hoffentlich kann mir einer sagen was ich da falsch mache.
Ich bedanke mich schonmal im Vorraus für eure Hilfe.
MfG
Siluro
|
|
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Fr 04.02.05 13:31
Siluro hat folgendes geschrieben: | Hoffentlich kann mir einer sagen was ich da falsch mache. |
Da wäre wohl erst mal wichtig zu erfahren, welches Problem denn auftritt. Wobei ich sagen muss, dass meine RC-Dateien mit Bitmaps so aussehen:
Quelltext 1: 2: 3:
| 100 BITMAP "toolbar.bmp" 200 BITMAP "masked.bmp" 300 BITMAP "24bit.bmp" |
und sich auch problemlos kompilieren lassen (Ressourcencompiler von Delphi 5).
|
|
Siluro 
      
Beiträge: 74
Win XP Prof., Win XP64 Prof., Win 7 Prof.
Delphi 7 Ent., Delphi XE, Delphi XE5
|
Verfasst: Fr 04.02.05 14:08
Das ändert bei mir nur die Nummer der Fehlermeldung vom Resourcecompiler
(statt "16: Invalid bitmap format" bekomme ich dann "14: Invalid bitmap format").
Ich versuche das mit dem Resourcecompiler von Delphi 6 zu Compilieren.
Ich versuch das problem mal etwas genauer zu beschreiben. Beim Debuggen
des Programms bleibt das Programm immer beim Ausführen von
"bmp.LoadFromResourceName(h, '1');"
hängen.
Ich befürchte aber das das Problem schon bei den rc-Datein beginnt, da
der Resourcecompiler halt probleme mit "BITMAP" hat. Müssen die Bitmaps
irgendwelche bestimmten Eigenschaften (Farbtiefe, Auflösung, etc.)
haben?
MfG
Siluro
|
|
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Fr 04.02.05 14:11
Eigentlich nicht. Ich meine, du kannst anhand des Dateinamens "24bit.bmp" ja sicher erraten, dass es sich um eine 24-Bit-BMP handelt. Hast du den Begriff BITMAP vllt. vorher in der RC-Datei benutzt? Als ID für irgendwas? Eine andere Fehlerquelle wüsste ich nicht. Und ich kann mir auch nicht vorstellen, dass der Ressourcencompiler von Delphi 6 schlechter ist.
|
|
Siluro 
      
Beiträge: 74
Win XP Prof., Win XP64 Prof., Win 7 Prof.
Delphi 7 Ent., Delphi XE, Delphi XE5
|
Verfasst: Fr 04.02.05 14:16
Ne, als IDs benutze ich nur Zahlen von 1-85, das kanns nicht sein.
Im internet steht auch überall das es so gehen muss, aber bei mir
klappts halt nicht.
MfG
Siluro
Zuletzt bearbeitet von Siluro am Fr 04.02.05 16:22, insgesamt 1-mal bearbeitet
|
|
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Fr 04.02.05 15:28
Zeig doch einfach mal deine komplette RC-Datei. So umfangreich wird sie ja nicht sein.
|
|
Siluro 
      
Beiträge: 74
Win XP Prof., Win XP64 Prof., Win 7 Prof.
Delphi 7 Ent., Delphi XE, Delphi XE5
|
Verfasst: Fr 04.02.05 16:05
Kein Problem, hier ist sie
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85:
| 1 BITMAP "1.bmp" 2 BITMAP "10.bmp" 3 BITMAP "11.bmp" 4 BITMAP "12.bmp" 5 BITMAP "13.bmp" 6 BITMAP "14.bmp" 7 BITMAP "15.bmp" 8 BITMAP "16.bmp" 9 BITMAP "17.bmp" 10 BITMAP "18.bmp" 11 BITMAP "19.bmp" 12 BITMAP "2.bmp" 13 BITMAP "20.bmp" 14 BITMAP "21.bmp" 15 BITMAP "22.bmp" 16 BITMAP "23.bmp" 17 BITMAP "24.bmp" 18 BITMAP "25.bmp" 19 BITMAP "26.bmp" 20 BITMAP "27.bmp" 21 BITMAP "28.bmp" 22 BITMAP "29.bmp" 23 BITMAP "3.bmp" 24 BITMAP "30.bmp" 25 BITMAP "31.bmp" 26 BITMAP "32.bmp" 27 BITMAP "33.bmp" 28 BITMAP "34.bmp" 29 BITMAP "35.bmp" 30 BITMAP "36.bmp" 31 BITMAP "37.bmp" 32 BITMAP "38.bmp" 33 BITMAP "39.bmp" 34 BITMAP "4.bmp" 35 BITMAP "40.bmp" 36 BITMAP "41.bmp" 37 BITMAP "42.bmp" 38 BITMAP "43.bmp" 39 BITMAP "44.bmp" 40 BITMAP "45.bmp" 41 BITMAP "46.bmp" 42 BITMAP "47.bmp" 43 BITMAP "48.bmp" 44 BITMAP "49.bmp" 45 BITMAP "5.bmp" 46 BITMAP "50.bmp" 47 BITMAP "51.bmp" 48 BITMAP "52.bmp" 49 BITMAP "53.bmp" 50 BITMAP "54.bmp" 51 BITMAP "55.bmp" 52 BITMAP "56.bmp" 53 BITMAP "57.bmp" 54 BITMAP "58.bmp" 55 BITMAP "59.bmp" 56 BITMAP "6.bmp" 57 BITMAP "60.bmp" 58 BITMAP "61.bmp" 59 BITMAP "62.bmp" 60 BITMAP "63.bmp" 61 BITMAP "64.bmp" 62 BITMAP "65.bmp" 63 BITMAP "66.bmp" 64 BITMAP "67.bmp" 65 BITMAP "68.bmp" 66 BITMAP "69.bmp" 67 BITMAP "7.bmp" 68 BITMAP "70.bmp" 69 BITMAP "71.bmp" 70 BITMAP "72.bmp" 71 BITMAP "73.bmp" 72 BITMAP "74.bmp" 73 BITMAP "75.bmp" 74 BITMAP "76.bmp" 75 BITMAP "77.bmp" 76 BITMAP "78.bmp" 77 BITMAP "79.bmp" 78 BITMAP "8.bmp" 79 BITMAP "80.bmp" 80 BITMAP "81.bmp" 81 BITMAP "82.bmp" 82 BITMAP "83.bmp" 83 BITMAP "84.bmp" 84 BITMAP "85.bmp" 85 BITMAP "9.bmp" |
Ist eigentlich nichts besonderes darn.
MfG
Siluro
|
|
Siluro 
      
Beiträge: 74
Win XP Prof., Win XP64 Prof., Win 7 Prof.
Delphi 7 Ent., Delphi XE, Delphi XE5
|
Verfasst: Fr 04.02.05 18:31
Also das eigentliche Problem hat nichts mit der DLL zu tun.
Hab die rc-Datei jetzt mit Hilfe von VC++ kompiliert und
da hats super funktioniert.
Bin aber mit dem ursprünglichen Problem trotzdem noch nicht
weiter.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| procedur TForm1.LoadResource; var h: THandle; bmp: TBitmap; begin h:=LoadLibrary('Test.dll'); if h<>0 then begin bmp:=TBitmap.Create; bmp.LoadFromResourceName(h, '1'); Combobox1.AddItem('', bmp); FreeLibrary(h); end; end; |
Sieht jemand wo der Fehler in diesem Quelltext sein könnte?
MfG
Siluro
|
|
bis11
      
Beiträge: 1247
Erhaltene Danke: 2
Apple Mac OSX 10.11
|
Verfasst: Sa 05.02.05 12:26
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| procedure TMainControl.FormShow(Sender: TObject); var hDLL : THandle; begin hDLL := LoadLibrary(PChar('ressource.dll')); if hDLL <> 0 then begin try Customer_Administration.Glyph.LoadFromResourceName(hDLL,'normal'); Ordering.Glyph.LoadFromResourceName(hDLL,'createorder'); Stock_Management.Glyph.LoadFromResourceName(hDLL,'lager'); configuration_btn.Glyph.LoadFromResourceName(hDLL,'configuration'); Account_System.Glyph.LoadFromResourceName(hDLL,'useradmin'); beenden.Glyph.LoadFromResourceName(hDLL,'beenden'); finally FreeLibrary(hDLL); end; end; end; |
So mache ich das. Das funktioniert wunderbar. Die Namen wie z.B. 'beenden' mußt Du nur Durch Deine Zahlen ersetzen. Hier werden die Bitmaps in einen Button eingefügt.
|
|
F34r0fTh3D4rk
      
Beiträge: 5284
Erhaltene Danke: 27
Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
|
Verfasst: Sa 05.02.05 14:04
villeicht liegt das problem auch an den bmps ?
warum unterscheidet delphi denn zwischen bmp und bitmap ?
ist das net das selbe ?
|
|
uall@ogc
      
Beiträge: 1826
Erhaltene Danke: 11
Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
|
Verfasst: Sa 05.02.05 14:20
also das problem bekommt man wenn die bitmaps keine gültigen windows bitmaps sind (was auch immer das heißt)
du kannst z.b. mal ne txt oder exe datei in BMP umbenennen und es wird dir auch nicht gelingen diese in der RC als BITMAP einzubinden
alles was nicht das entprechende format ist muss mit RCDATA eingebunden werden (oder halt was anderes wie BMP, dann bindetet der res compiler die einfach ein und prüft nicht den header)
1 BMP 1.bmp <- deshalb geht das bei dir, wird eingebunden als wenn du RCDATA nimmst
1 BITMAP 1.bmp <- geht nicht weil header oder so geprüft wird und deine bimtaps nicht gültig sind, deshalb kannste die auch nicht in deinem programm benutzen wenn du das mit nem anderne compiler einbindest)
|
|
Siluro 
      
Beiträge: 74
Win XP Prof., Win XP64 Prof., Win 7 Prof.
Delphi 7 Ent., Delphi XE, Delphi XE5
|
Verfasst: Mo 07.02.05 12:22
@F34r0fTh3D4rk
Maiden is geil, long live rock 'n' roll
@uall@ogc
Wundert mich halt nur das der Compiler von VC++ keine Probleme mit den Bitmaps hatte.
Hab das Problem jetzt so gelöst:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29:
| procedure TForm1.LoadResources(ResList: TResourceList; comb: TCombobox); var i : integer; ResItem : TResourceItem; MemStream : TMemoryStream; bmp : TBitmap; begin MemStream:=TMemoryStream.Create; for i:=0 to ResList.Count-1 do begin if ResList[i].IsList then begin LoadResources(ResList[i].List, comb); end else if (ResList[i].ResType=rtBitmap) then begin bmp:=TBitmap.Create; ResItem:=TResourceItem(ResList[i]); ResItem.SaveToStream(memstream); MemStream.savetofile('c:\temp\tmp.bmp'); bmp.LoadFromFile('c:\temp\tmp.bmp'); bmp.TransparentColor := clMaroon; bmp.Transparent := true; comb.AddItem(inttostr(i), bmp); MemStream.Clear; end; end; if (FileExists('c:\temp\tmp.bmp')) then DeleteFile('c:\temp\tmp.bmp'); MemStream.Free; end; |
Dazu musste ich allerdings die Units "rxtypes" und "ExeImage" vom Resourceexplorer
(bei Delphi im Demos Ordner zu finden) einbinden. Ist bestimmt nicht die beste
Lösung, aber es funktionier wenigstens. Falls jemandem noch was besseres einfällt,
ich bin für alle Vorschläge offen.
Auf jeden Fall erstmal danke für eure Hilfe.
MfG
Siluro
|
|