![]() |
3 Fragen zu DLLs als Resource Datei für Text und Bilder
Hallo,
gemäß einiger Beiträge im Forum habe ich es geschafft mir eine dll datei mit jpeg Bildern zu erzeugen, wobei das Laden der Bilder nach einigen Anfangsschwierigkeiten auch funktioniert. Zusätzlich zu den Bildern benötige ich die Anzahl der Bilder und zu jedem Bild 'nen bischen Text. Aufbau: RC-datei mit Bildern -> RES-datei und die RES-datei in die dll geladen. Hintergrund: Ohne die Software (das Prog.) anfassen zu müssen sollte die dll Datei erweiterbar sein, d.h. die Anzahl der Bilder und Beschreibungen sollte variiren können. Frage: Wie kann ich die Anzahl der Bilder in der dll herausbekommen, kann man vieleicht auch eine Integer Value (Constante) aus der dll auslesen ? Und wie bekomme ich den Text in die dll, bzw. wie kann ich ihn auslesen ? Was für Möglichkeiten habe ich generell bei den Resource Dateien bezüglich der Resourcen die man hier einbinden kann ? Danke, Karsten |
Re: 3 Fragen zu DLLs als Resource Datei für Text und Bilder
Zum auslesen der Anzahl kannst du dir ja eine Funktion erstellen, die vom Programm aufgerufen wird und innerhalb der DLL einfach die Anzahl aus den Resourcen oder aus einer in der DLL deklarieren Konstante ausliest.
|
Re: 3 Fragen zu DLLs als Resource Datei für Text und Bilder
Text bekommst du mit StringTablen in die Ressource. Kuck dir dazu das Rssosurcen-Tutorial von tommy-lie anz. Zu finden in meinen Win32API-Tutorials für Delphi auf meiner Seite.
|
Re: 3 Fragen zu DLLs als Resource Datei für Text und Bilder
Hallo Karsten!
Willkommen im JPEG-Club. *ggg* Wieso änderst Du nicht einfach die Ressourcen und compilierst die DLL neu? Dann exportiert Deine DLL ne kleine Funktion, die die Anzahl der Bilder ans Prog durchreicht. Die Anzahl deklarierst Du einfach als Konstante in der DLL. Die Funktionen, die Bilder bzw. Strings aus den Ressourcen saugen, würd ich dann auch gleich in die DLL packen und dafür entsprechende Fkt exportieren. Viel Erfolg! OLLI |
Re: 3 Fragen zu DLLs als Resource Datei für Text und Bilder
Danke,
wenn man bedenkt das es prinzipiell doch nicht so kompliziert ist, war ich gestern doch wohl zu lange auf... :drunken: O.k.: Die Anzahl der Bilder wird durch eine Konstante in der dll angegeben und kann direkt über eine Funktion die von der dll mitgeliefert wird ausgelesen werden. Ich denke das man das auch mit dem Text (ShortString oder PChar sollt ohne extra dll auskommen) machen kann. Die Funktion zum auslesen der Bilder würde dann auch in die dll verlagert, wobei... :idea: Die Anzahl der Bilder in der dll zu kennen hat nur den einzigen nutzen das man nicht auf ein Bild zugreifen will was es gar nicht gibt, d.h. wenn ich die Funktion (zum auslesen der Bilder) in die dll packe brauche ich keine Funktion zum auslesen der Anzahl, weil ich dann ja direkt auf die Konstante zugreifen kann. Wenn wir schon dabei sind alles in die dll zu packen, kann man auch die komplette Form die die jeweiligen Bilder mit Text anzeigen soll in die dll packen ? Wenn ja, wie ? Gruß und Danke, Karsten |
Re: 3 Fragen zu DLLs als Resource Datei für Text und Bilder
Lass die VCL aus der DLL raus und verwende dort nur reinrassiges WINAPI. Sonst kannst Du Dir den Aufwand mit der DLL gleich schenken!
Meine Meinung OLLI |
Re: 3 Fragen zu DLLs als Resource Datei für Text und Bilder
Hallo Olli,
bitte definiere "reinrassiges WINAPI". Gruß, Karsten |
Re: 3 Fragen zu DLLs als Resource Datei für Text und Bilder
Hallo Leute,
das Auslesen der Konstanten aus der dll ist recht einfach:
Delphi-Quellcode:
nur das Auslesen der Bilder...
function GetHighIndex: Integer; stdcall;
begin Result := HighIndex; // Konstante (3) end; Vorher, wo sich die Funktion noch im Hauptprogramm befand war es recht einfach (nach Beitragsvorlagen):
Delphi-Quellcode:
nur jetzt kann ich ja wohl schlecht in der dll-Datei die dll-Datei laden, und
...
Lib := LoadLibrary(PChar(ExtractFilePath(ParamStr(0)) + 'MyDll.dll')); if Lib <> 0 then begin LoadPic := 'Bild' + IntToStr(Index); ResStream := TResourceStream.Create(Lib, LoadPic, 'JPEG'); TempJpeg := TJpegImage.Create; TempJpeg.LoadFromStream(ResStream); Result.Picture.Bitmap.Assign(TempJpeg); ...
Delphi-Quellcode:
geht nicht weil ich ja Jpegs laden will, und ein TJpegImage als Zwischenvariante erscheint mir auch nicht so ganz zu funktionieren.
Result.Picture.Bitmap.LoadFromResourceName(HInstance, LoadPic);
Delphi-Quellcode:
Hat da jemand eine Idee ?
TempJpeg.LoadFromStream(...
.LoadFromClipboardFormat(... .LoadFromFile(... Gruß, Karsten |
Re: 3 Fragen zu DLLs als Resource Datei für Text und Bilder
Gib als Handle hInstance bei TRessoueceStream.Create an.
|
Re: 3 Fragen zu DLLs als Resource Datei für Text und Bilder
Wieso willst du die Ladefunktion in der DLL einbauen?
Machs doch so z.B.
Delphi-Quellcode:
Die einzige Funktion, die in der DLL sein muss ist die GetHighIndex, wie sie oben schon erklärt wurde.
...
var GetHighIndex : function : Integer; stdcall; ... Lib := LoadLibrary(PChar(ExtractFilePath(ParamStr(0)) + 'MyDll.dll')); @GetHighIndex := nil; if (Lib <> 0) then begin GetHighIndex := GetProcAddress(Lib, 'GetHighIndex'); If Assigned(GetHighIndex) then HighIndex := GetHighIndex; end; if (Lib <> 0) then for Index := 1 to HighIndex do begin LoadPic := 'Bild' + IntToStr(Index); ResStream := TResourceStream.Create(Lib, LoadPic, 'JPEG'); TempJpeg := TJpegImage.Create; TempJpeg.LoadFromStream(ResStream); Result.Picture.Bitmap.Assign(TempJpeg); ... |
Re: 3 Fragen zu DLLs als Resource Datei für Text und Bilder
Hallo,
@scp so in der Art hatte ich es ja auch am Anfang. Nur befindet sich in der dll 'ne absolut Optionale Funktion die wenn die dll sich im Programm-Verzeichnis befindet bein Programmstart ausgeführt wird und der Vorschlag von OLI_T klingt irgendwie gut. Im grunde ist es relativ egal wo die Funktionen sich befinden aber hier ist es jetzt zu einer Frage der Ehre geworden. Die Lesefunktion muß aus der dll exportiert werden weil ich es jetzt so angefanen habe, irgendwie muß es funktionieren und es gilt jetzt herauszufinden wo bei mir das Problem ist. Ich sehe das ganze eher als Vorbereitung auf eine weiterführende Benutzung von dll-Dateien. @Luckie
Delphi-Quellcode:
Ich habe HInstance als Handle angegeben, klingt irgendwie logisch. Dummerweise bekomme ich eine Fehlermeldung bein Ausführen des Progs:
function GetImage(Index: Integer): TImage; stdcall;
var LoadPic: String; TempJpeg:TJpegImage; ResStream: TResourceStream; begin Result := nil; LoadPic := 'Bild' + IntToStr(Index); ResStream := TResourceStream.Create(HInstance, LoadPic, 'JPEG'); TempJpeg := TJpegImage.Create; try TempJpeg.LoadFromStream(ResStream); Result.Picture.Bitmap.Assign(TempJpeg); finally ... Access violation at address 01301805 in Module 'MYDLL.DLL'. Read of address FFFFFFFF. Ich denke mal das es sich hierbei um
Delphi-Quellcode:
handeln kann.
TempJpeg.LoadFromStream(ResStream);
Wie kann ich ein Tracing in der dll bewerkstelligen ? Oder hat jemand eine Idee was hier falsch sein könnte ? Gruß, Karsten |
Re: 3 Fragen zu DLLs als Resource Datei für Text und Bilder
Zitat:
Aber noch etwas zu meiner Variante: Wenn du genauer hinsiehst, die Funktion wird ja nur aufgerufen, wenn die DLL vorhanden ist und die Funktion auch. Ansonsten würde nichts passeieren, auch kein Fehler. Deshalb kann die DLL auch optional sein. |
Re: 3 Fragen zu DLLs als Resource Datei für Text und Bilder
@scp
natuerlich hast Du mit Deiner Aussage recht, es gibt halt diese 2 Wege. Nur waehre die komplette Auslagerung in die dll mal 'ne klasse Uebung fuer weitere dll-vorhaben. Ich denke sogar das sich in meinem aktuellen Fall der Code eher verdoppelt wenn ich die Funktionen in die dll auslagere. Es ist halt 'ne Frage der Ehre. Sollte ich bis Ende der Woche meine dll nicht 100 %ig am Laufen haben, dann werde ich die Funktionen wieder in das Hauptprogramm verlagern und dann hat Samurei keine Ehre mehr :oops: . Aber Samurei kann auch nicht mit der staendig auftretenden Fehlermeldung leben. Gruss, Karsten |
Re: 3 Fragen zu DLLs als Resource Datei für Text und Bilder
Hallo,
ich kämpfe noch. Innerhalb der dll habe ich ja die Funktion GetImage definiert. Da ich nicht weiß wie ich ein Tracing innerhalb der dll bewerkstellige habe ich einfach mehrere ShowMessage eingefügt.
Code:
Beim durchlaufen des codes habe ich festgestellt das die Zeile
function GetImage(Index: Integer): TImage; stdcall;
... Result := nil; LoadPic := 'Bild' + IntToStr(Index); ShowMessage(LoadPic); <-- Ist in der Resource Datei, kann also nicht das Problem sein ResStream := TResourceStream.Create(HInstance, LoadPic, 'JPEG'); try TempJpeg.LoadFromStream(ResStream); ShowMessage('Loaded from Stream'); Result.Picture.Bitmap.Assign(TempJpeg); ShowMessage('Assigned to picture'); ...
Code:
die Fehlermeldung liefert.
Result.Picture.Bitmap.Assign(TempJpeg);
Was ich jetzt bisher noch nicht weiß ist ob das TempJpeg.LoadFromStream(ResStream); ins Leere greift und in TempJpeg kein gültiges Bild geladen wurde oder ob es wirklich Result.Picture.Bitmap.Assign(TempJpeg); ist was den Fehler verursacht. Access violation at address 01301805 in Module 'MYDLL.DLL'. Read of address FFFFFFFF. Hat hier vieleicht noch jemand eine Idee wie man das Problem noch weiter eingrenzen kann ? Danke, Karsten |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:21 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz