Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Dll von *.res Datei laden (https://www.delphipraxis.net/111242-dll-von-%2A-res-datei-laden.html)

EWeiss 1. Apr 2008 05:18


Dll von *.res Datei laden
 
Habe eine Resourcendatei erstellt und dort eine DLL eingebunden
wie kann ich die jetzt aus dieser laden ?
Hab hier schon gesucht aber keine Infos gefunden

Also nicht aus einer EXE oder DLL sondern aus der *.res Datei

gruss Emil

cruiser 1. Apr 2008 06:06

Re: Dll von *.res Datei laden
 
Beim Programmstart aus der Ressource ins Temp-Dir extrahieren,

während der laufzeit dynamisch drauf zugreifen und

bein Beenden wieder vom Filesystem entfernen.

EWeiss 1. Apr 2008 06:11

Re: Dll von *.res Datei laden
 
Zitat:

Zitat von cruiser
Beim Programmstart aus der Ressource ins Temp-Dir extrahieren,

während der laufzeit dynamisch drauf zugreifen und

bein Beenden wieder vom Filesystem entfernen.

hmmm die funktionsweise leuschtet mir wohl ein
dann will ich sie auch nicht auf die Platte schreiben sondern mit MemoryModule direkt im speicher ausführen.
Die DLL hat nur eine größe von 3,5 K da macht es keinen sinn die Datei im projekt mit auszuliefern.

mit welcher API
oder reicht da

Delphi-Quellcode:
var
 DLL : Pointer;
begin
  irgendwas.machmal := DLL, Pchar('geladen');
end;

nein im ernst ein kleines sample wäre nicht schlecht oder zumindest die API
funktionen die ich benutzen muss.

gruss Emil

cruiser 1. Apr 2008 06:30

Re: Dll von *.res Datei laden
 
Ungebrüft und absolut ungetestet !!!

Ressource extrahieren
DP: Ressource ... extrahieren

DLL dynamisch laden
Delphi-Quellcode:
type
  TMyFunc = function (p: PChar): Boolean;
var
  mylib: THandle;
  myfunc: TMyFunc;
begin
  mylib := LoadLibrary(PChar('Pfad\zu\meiner.dll'));
  if mylib <> 0 then begin
    myfunc := TMyFunc(GetProcAddress(mylib, PChar('myfunc')));
    if myfunc(PChar('blah')) then begin
      { weiss auch nich :P }
    end;
  end;
  FreeLibrary(mylib);
end;
Am besten kapselst du die DLL-Funktionen in eine Klasse, dann bleibt der Code schön aufgeräumt

EWeiss 1. Apr 2008 06:35

Re: Dll von *.res Datei laden
 
Zitat:

Zitat von cruiser
Ungebrüft und absolut ungetestet !!!

Ressource extrahieren
Momento...

DLL dynamisch laden
Delphi-Quellcode:
type
  TMyFunc = function (p: PChar): Boolean;
var
  mylib: THandle;
  myfunc: TMyFunc;
begin
  mylib := LoadLibrary(PChar('Pfad\zu\meiner.dll'));
  if mylib <> 0 then begin
    myfunc := TMyFunc(GetProcAddress(mylib, PChar('myfunc')));
    if myfunc(PChar('blah')) then begin
      { weiss auch nich :P }
    end;
  end;
  FreeLibrary(mylib);
end;

danke für den Tip .. ja das ist klar nur es gibt keine DLL welche du von irgendeinen Pfad laden kannst
habe es aber auch oben geschrieben .. trotzdem Danke

Ich möchte meine DLL welche sich in meiner 'additional.res' befindet in den speicher zu laden.
dort wird sie direkt ausgeführt ohne sie auf die Platte zu speichern

EDIT:
habe mir das beispiel mal angeschaut!

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  ResStream: TResourceStream;
begin
  ResStream := TResourceStream.Create(HInstance, 'Sounds', 'WAV');
  ResStream.SaveToFile('Sound1.wav'); // brauch ich nicht
  ResStream.Free;
end;
für was steht HInstance?
Da ich keine dll vom Pfad lade .. reicht es nicht wenn man anstelle dessen nur ein 0 übergibt?

gruss Emil

cruiser 1. Apr 2008 06:42

Re: Dll von *.res Datei laden
 
Was spricht dagegen sie über einen TRessourcestream und Savetofile ins Tempdir zu extrahieren?

Wie das geht hab ich im Post oben mal was hier aus dem Board verlinkt.

Wie du ans Tempdir kommst findest du in der Library

Ah ja... hab es oben nicht so explizit geschrieben... kapsel am besten alle Funktionen der DLL in eine Klasse. Bei einer c-DLL gehört hinter den Func-Type glaube(!!!) noch ein cdecl; als Aufrufkonvention

Ich hab mich das letzte mal vor Jahren durch sowas gequält und freu mich derzeit mehr an C# und .NET und denke deshalb Andern können dir bei näheren Problemen (oder meinen gelegten Bug-Eiern) besser helfen.

Edit zu deinem Edit: HInstance ist das Modul, dass gerade ausgeführt wird, also deine Exe-Datei, die auch die Ressource drin hat. HInstance ist eine Konstante. Ich weiss nicht ob die 0 ist... also nimm einfach HInstance :mrgreen:

EWeiss 1. Apr 2008 06:50

Re: Dll von *.res Datei laden
 
Zitat:

Zitat von cruiser
Was spricht dagegen sie über einen TRessourcestream und Savetofile ins Tempdir zu extrahieren?

Wie das geht hab ich im Post oben mal was hier aus dem Board verlinkt.

Wie du ans Tempdir kommst findest du in der Library

Ja danke aber das weiss ich doch wie man eine DLL einläd darum geht es doch nicht ;)
----
eigentlich nur das die Datei nicht öffentlich werden soll
und bei Vista .. keine Ahnung wie sich das verhält könnte es probleme geben
wenn man sich nicht an gewisse Regeln hält.

Das möchte ich alles vermeiden.

Für den Tip bzw. das suchen von TRessourcestream nochmal danke.. hilft mir schonmal weiter
Wenn man nicht weiss wonach man suchen soll ist das schon aussichtlos von vornherein ;)

Zitat:

Ah ja... hab es oben nicht so explizit geschrieben... kapsel am besten alle Funktionen der DLL in eine Klasse. Bei einer c-DLL gehört hinter den Func-Type glaube(!!!) noch ein cdecl; als Aufrufkonvention
Alles schon erledigt und funktioniert auch alles bisher von der Platte
aber das soll es ja nachher nicht mehr.

Zitat:

Edit zu deinem Edit: HInstance ist das Modul, dass gerade ausgeführt wird, also deine Exe-Datei, die auch die Ressource drin hat. HInstance ist eine Konstante. Ich weiss nicht ob die 0 ist... also nimm einfach HInstance
Nein hat sie nicht, denke mal dann ist es das Modul von meiner DLL in der die DLL als resource eingebunden ist.
Werde das mal so versuchen :)

gruss Emil

cruiser 1. Apr 2008 06:54

Re: Dll von *.res Datei laden
 
Zitat:

Zitat von EWeiss
... eigentlich nur das die Datei nicht öffentlich werden soll ...

mhpuh.. dafür ist das verpacken in die Ressourcen aber auch keine Lösung. Stichwort: Ressource-Editor

Zitat:

Zitat von EWeiss
... und bei Vista .. keine Ahnung wie sich das verhält könnte es probleme geben
wenn man sich nicht an gewisse Regeln hält. ...

Darum ins Tempdir und nicht in irgendein temporäres Dir ;)

Notfalls entpack die Datei halt als "~tmp1456.dat" wenn du dir nur über die Endung sorgen machst. Sollte LoadLibrary auch schlucken (hoff ich). Aber wirklich sicher bekommste es nicht.

EWeiss 1. Apr 2008 06:58

Re: Dll von *.res Datei laden
 
Zitat:

mhpuh.. dafür ist das verpacken in die Ressourcen aber auch keine Lösung. Stichwort: Ressource-Editor
naja mit UPX gepackt und verschlüßelt da ist nix mit Resource Editor
Zitat:

Notfalls entpack die Datei halt als "~tmp1456.dat"
puhh dann kennst du sie ja.. hihiihhi

gruss Emil

cruiser 1. Apr 2008 07:04

Re: Dll von *.res Datei laden
 
Dann hol ich das Modul eben spätestens aus dem Speicher... mal im Ernst... wenn es alles sooo top-secret ist wirst du um eine verschlüsselte Verbindung zu einem Webservice nicht herum kommen.

HA! ich habs... du hast keine Lizenz für die komerzielle DLL !!!

bitte nicht zu ernst nehmen :drunken: :mrgreen:


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:15 Uhr.
Seite 1 von 4  1 23     Letzte »    

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