Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Ressource in einer DLL von außen aufrufen (https://www.delphipraxis.net/7812-ressource-einer-dll-von-aussen-aufrufen.html)

blackdrake 22. Aug 2003 01:58


Ressource in einer DLL von außen aufrufen
 
Hallo. Ich habe eine Ressourcen-DLL in Delphi gemacht und habe das jetzt so hinbekommen, dass ich die Ressource, hier ein Bitmap, direkt im Explorer aufrufen kann...

res://C:\ressource.dll/bitmap.bmp

Jetzt wollte ich die Ressource in eine TImage laden und es geht nicht: Die Funktion LoadFromFile kapiert keine res:// Dateien. :(
In einigen C++ Programmen hab ich das schon gesehen, dass HTMLs in eine DLL geladen werden. Wie kann ich das mit Delphi machen?
Muss ich da die Funktion LoadFromFile umschreiben, oder geht das auch leichter? (Ich will auch DelphiX, WaveSounds, Animationen und Texte in die DLL einfügen, deswegen wäre das eine schlechte Lösung)
Am besten wäre es natürlich, wenn eine Funktion sich die Datei res://C:\ressource.dll/bitmap.bmp holen, tempoär speichern und dann den neuen Dateinamen ausgeben würde... Etwa so...

Code:
Image1.LoadFromFile(Translate('res://res://C:\ressource.dll/bitmap.bmp'));
Danke schon mal im vorraus.

Assarbad 22. Aug 2003 02:07

Re: Ressource in einer DLL von außen aufrufen
 
Weil es Quatsch ist. Was der Internet Explorer und Explorer machen ist etwas komplett anderes. Die handlen das selber ... wenn du exakt sowas willst, mußt du es auch selber handlen.

1. LoadLibrary (um die DLL zu laden) -> hModule (Modul-Handle)
2. hBitmap := LoadBitmap(hModule, ...)

... Dann damit arbeiten ... das Handle sollte man TBitmap zuweisen können!

negaH 22. Aug 2003 04:15

Re: Ressource in einer DLL von außen aufrufen
 
Schau dir mal TBitmap in der Hilfe an, besonders .LoadFromResourceName()/.LoadFromResouceID().

Delphi-Quellcode:
procedure LoadBitmapFromResource(Bitmap: TBitmap; const FileName,BitmapName: String);
begin
  Lib := LoadLibraryEx(FileName, LOAD_LIBRARY_ASDATAFILE);
  if Lib = 0 then
    raise Exception.Create('Ungültige DLL');
  try
    Bitmap.LoadFromResourceName(Lib, BitmapName);
  finally
    FreeLibrary(Lib);
  end;
end;
Gruß Hagen

Luckie 22. Aug 2003 04:34

Re: Ressource in einer DLL von außen aufrufen
 
@Hagen: Da hat dich dein Ggedächnis im Stichgelassen. In meinem pDSK ist LoadLibraryEx wie folgt deklariert:
Code:
HMODULE LoadLibraryEx(
  LPCTSTR lpFileName,
  HANDLE hFile,
  DWORD dwFlags
);
Wobei:
Zitat:

hFile
This parameter is reserved for future use. It must be NULL.
Ich hätte den Code auch anders aufgebaut. Ich hätte auf ungleich null getestet und dann weitergemacht.
Delphi-Quellcode:
Lib := LoadLibraryEx(FileName, 0, LOAD_LIBRARY_AS_DATAFILE);
if Lib <> 0 then
begin
  try
    ...;
  finally
    FreeLibrary(Lib);
  end;
end
else
  RaisLastOSError();
Aber das ist Geschmackssache.

negaH 22. Aug 2003 06:06

Re: Ressource in einer DLL von außen aufrufen
 
Richtig es ist Geschmackssache. Ich bevorzuge bei solchen kurzen Abfragen die sofortige Auswertung da dadurch der Source besser sequentiell lesbar wird. Lade Library, wenn Fehler raise Exception, ansonsten weiter im Source.

Falls ich die Abfrage so wie du gestalte dann aber auf alle Fälle so :)

Delphi-Quellcode:
begin
  Lib := LoadLibrary()
  if Lib <> 0 then
  try
  finally
    FreeLibrary(Lib);
  end else
    raise Exception.Create();
end;
Gruß Hagen

PS: appropo Gedächtnis, 5:15 Uhr und schon 18h vor der Kiste was soll da das Hirn noch bringen ? :)

blackdrake 22. Aug 2003 11:30

Re: Ressource in einer DLL von außen aufrufen
 
Hallo. Ich hab das jetzt so:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  Lib: Integer;
begin
  Lib := LoadLibraryEx('Ressource.dll', 0, LOAD_LIBRARY_AS_DATAFILE);
  if Lib <> 0 then
  try
    Image1.Picture.Bitmap.LoadFromResourceName(Lib, 'TEST.BMP');
  finally
    FreeLibrary(Lib);
  end else
    raise Exception.Create('Fehler in der Ressourcen-DLL...');
end;
Jetzt kommt aber die Meldung, dass Die Ressource "Test.bmp" nicht gefunden worden ist. Was mache ich falsch?

Wie muss ich es eigentlich machen, wenn ich DelphiX-Dateien, Texte für Memos ect. auch einbinden will? Gibts denn keine RessourceToStream-Funktion?

[edit=Daniel B]Delphi-Tags korrigiert. Mfg, Daniel B[/edit]

blackdrake 22. Aug 2003 23:45

Re: Ressource in einer DLL von außen aufrufen
 
Ich denke mal, dass der Fehler in der DLL liegt...

Was mache ich falsch?

Code:
+ Bitmap
  + 123
    + 0 (Neutral)
Ich hab die Ressourcen mit Resource Hacker der *.dll hinzugefügt.

Feldermeldung: Die Ressource 123 wurde nicht gefunden.

negaH 22. Aug 2003 23:59

Re: Ressource in einer DLL von außen aufrufen
 
LoadFromResourceID(, 123);
oder
LoadFromResourceName(, MakeIntResource(123));

Gruß Hagen

blackdrake 23. Aug 2003 00:58

Re: Ressource in einer DLL von außen aufrufen
 
Hallo. Ich hab jetzt folgendes:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  Lib: Integer;
begin
  Lib := LoadLibraryEx('Ressource.dll', 0, LOAD_LIBRARY_AS_DATAFILE);
  if Lib <> 0 then
  try
    Image1.Picture.Bitmap.LoadFromResourceName(Lib, MakeIntResource(222));
  finally
    FreeLibrary(Lib);
  end else
    raise Exception.Create('Fehler in der Ressourcen-DLL...');
end;
Jetzt erhalte ich eine Access Violation :(

[edit=Daniel B]Delphi-Tags korrrigiert. Mfg, Daniel B[/edit]

Flogo 24. Nov 2003 20:04

Re: Ressource in einer DLL von außen aufrufen
 
Ich habe genau das gleiche Problem:

Zitat:

Zitat von blackdrake
Ich hab die Ressourcen mit Resource Hacker der *.dll hinzugefügt.

Feldermeldung: Die Ressource 123 wurde nicht gefunden.

Wenn ich die dll mit delphi "von Hand" erstelle geht alles glatt;
Delphi-Quellcode:
(mit r := TResourceStream.Create(dll, Name, 'BMP')
Wenn ich allerdings mit dem Resource Hacker Bilder hinzufüge findet er sie nicht. Hab grade das Board durchsucht und bin auf viele verschiedene Möglichkeiten gestoßen wie man Bilder aus dlls öffnen kann aber keine hat mit dem ResHacker getan.

Wie funktioniert das mit der ID bzw. loadfromresourceNAME()? Wozu ist das MakeIntResource() und tut das nur mit Zahlen oder auch mit Namen?

Mein Prog sieht im Moment genauso aus wie in Blackdrakes letztem Post nur das statt dem 222 eine stringvariable steht und liefert den fehler "Resource 'blabla' nicht gefunden".

Ich hoffe jemand kann mir helfen


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:07 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