Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi 3 Fragen zu DLLs als Resource Datei für Text und Bilder (https://www.delphipraxis.net/12166-3-fragen-zu-dlls-als-resource-datei-fuer-text-und-bilder.html)

Karsten 22. Nov 2003 00:49


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

himitsu 22. Nov 2003 02:26

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.

Luckie 22. Nov 2003 03:20

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.

OLLI_T 22. Nov 2003 08:57

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

Karsten 22. Nov 2003 11:39

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

OLLI_T 22. Nov 2003 12:07

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

Karsten 22. Nov 2003 12:15

Re: 3 Fragen zu DLLs als Resource Datei für Text und Bilder
 
Hallo Olli,

bitte definiere "reinrassiges WINAPI".


Gruß,

Karsten

Karsten 23. Nov 2003 02:05

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:
function GetHighIndex: Integer; stdcall;
begin
  Result := HighIndex; // Konstante (3)
end;
nur das Auslesen der Bilder...

Vorher, wo sich die Funktion noch im Hauptprogramm befand war es recht einfach (nach Beitragsvorlagen):

Delphi-Quellcode:
...
  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);
...
nur jetzt kann ich ja wohl schlecht in der dll-Datei die dll-Datei laden, und

Delphi-Quellcode:
Result.Picture.Bitmap.LoadFromResourceName(HInstance, LoadPic);
geht nicht weil ich ja Jpegs laden will, und ein TJpegImage als Zwischenvariante erscheint mir auch nicht so ganz zu funktionieren.

Delphi-Quellcode:
TempJpeg.LoadFromStream(...
        .LoadFromClipboardFormat(...
        .LoadFromFile(...
Hat da jemand eine Idee ?

Gruß,
Karsten

Luckie 23. Nov 2003 03:25

Re: 3 Fragen zu DLLs als Resource Datei für Text und Bilder
 
Gib als Handle hInstance bei TRessoueceStream.Create an.

scp 23. Nov 2003 04:54

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:
...
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);
...
Die einzige Funktion, die in der DLL sein muss ist die GetHighIndex, wie sie oben schon erklärt wurde.

Karsten 23. Nov 2003 11:43

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:
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
 
  ...
Ich habe HInstance als Handle angegeben, klingt irgendwie logisch. Dummerweise bekomme ich eine Fehlermeldung bein Ausführen des Progs:

Access violation at address 01301805 in Module 'MYDLL.DLL'. Read of address FFFFFFFF.

Ich denke mal das es sich hierbei um
Delphi-Quellcode:
TempJpeg.LoadFromStream(ResStream);
handeln kann.

Wie kann ich ein Tracing in der dll bewerkstelligen ? Oder hat jemand eine Idee was hier falsch sein könnte ?


Gruß,
Karsten

scp 23. Nov 2003 21:45

Re: 3 Fragen zu DLLs als Resource Datei für Text und Bilder
 
Zitat:

Zitat von Karsten
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.

Das du die andere Variante zum laufen kriegen willst kann ich jetz verstehen.
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.

Karsten 24. Nov 2003 09:21

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

Karsten 26. Nov 2003 21:38

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:
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');

...
Beim durchlaufen des codes habe ich festgestellt das die Zeile
Code:
    Result.Picture.Bitmap.Assign(TempJpeg);
die Fehlermeldung liefert.

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 06:42 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz