Autor Beitrag
Siluro
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 74

Win XP Prof., Win XP64 Prof., Win 7 Prof.
Delphi 7 Ent., Delphi XE, Delphi XE5
BeitragVerfasst: 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:
ausblenden 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



BeitragVerfasst: 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:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 74

Win XP Prof., Win XP64 Prof., Win 7 Prof.
Delphi 7 Ent., Delphi XE, Delphi XE5
BeitragVerfasst: 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



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 74

Win XP Prof., Win XP64 Prof., Win 7 Prof.
Delphi 7 Ent., Delphi XE, Delphi XE5
BeitragVerfasst: 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



BeitragVerfasst: Fr 04.02.05 15:28 
Zeig doch einfach mal deine komplette RC-Datei. So umfangreich wird sie ja nicht sein.
Siluro Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 74

Win XP Prof., Win XP64 Prof., Win 7 Prof.
Delphi 7 Ent., Delphi XE, Delphi XE5
BeitragVerfasst: Fr 04.02.05 16:05 
Kein Problem, hier ist sie

ausblenden volle Höhe 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:
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 74

Win XP Prof., Win XP64 Prof., Win 7 Prof.
Delphi 7 Ent., Delphi XE, Delphi XE5
BeitragVerfasst: 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.

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1247
Erhaltene Danke: 2

Apple Mac OSX 10.11

BeitragVerfasst: Sa 05.02.05 12:26 
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 5284
Erhaltene Danke: 27

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1826
Erhaltene Danke: 11

Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 74

Win XP Prof., Win XP64 Prof., Win 7 Prof.
Delphi 7 Ent., Delphi XE, Delphi XE5
BeitragVerfasst: 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:

ausblenden 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