Delphi-PRAXiS

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:

EWeiss 1. Apr 2008 07:08

Re: Dll von *.res Datei laden
 
Zitat:

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

bitte nicht zu ernst nehmen :drunken: :mrgreen:

Nein ;)

Bin auch nicht so pingelig..
Meine Datei ist die BassVis welche von Developern im Forum von Un4Seen in deren projekte eingebunden wird
um verschiedene arten von Visualisations Plugins auszuführen.

Ich will denen nicht zumuten sich mit dieser zusätzlichen DLL rumzuschlagen deshalb will ich allen eventualitäten vorbeugen.
Die müssen ja nicht wissen das in BassVis noch ne DLL versteckt ist.

auch wenn man es jetzt weiss.
Zitat:

HA! ich habs... du hast keine Lizenz für die komerzielle DLL !!!
na hab sie selbst unter schwersten bedingungen in C++ geschrieben mit unterstützung natürlich
ist lediglich ein Wasabi Wrapper für die neuen Winamp Plugins der code in c++ läßt sich leider in Delphi
wegen der Classen nicht übersetzen .. aber eagl

gruss EMil

Luckie 1. Apr 2008 08:24

Re: Dll von *.res Datei laden
 
Zitat:

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

Und was ist an deiner DLL so geheimnisvoll, dass sie auf keinen Fall abgespeichert werden darf?

Zitat:

und bei Vista .. keine Ahnung wie sich das verhält könnte es probleme geben
wenn man sich nicht an gewisse Regeln hält.
Nein auch bei Vista hat der Benutzer uneingeschränkten Zugriff auf sein temporäres Verzeichnis, sonst würden wahrscheinlich mehr als die Hälfte aller Programme nicht mehr laufen.

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
Warum sollte er alle Funktionen in einer Klasse kapseln? Das macht bei einer DLL eigentlich nur Probleme, da man nicht ohne weiteres Objektinstanzen zwischen Exe und DLL austauschen kann. Und welche Aufrufkonvention erwählt, ist so ziemlich egal. Er muss sich eben nur daran halten.

Wenn du sie unbedingt aus der Ressource laden willst, dann dürftest du wesentlich mehr Probleme unter Vista bekommen, als wenn du sie ins temporäre Verzeichnis entpackst. Du kannst dir ja mal Nicos Code angucken, wie er eine Exe aus den Speicher ausführt: http://www.michael-puff.de/Developer.../Importe/Nico/ -> inmemexe.zip.

EWeiss 1. Apr 2008 09:11

Re: Dll von *.res Datei laden
 
Zitat:

Und was ist an deiner DLL so geheimnisvoll, dass sie auf keinen Fall abgespeichert werden darf?
Na ja will ich nicht sagen das sie nicht darf..

Es sind halt undokumentierte Wasabi Funktionen enthalten die ich mir mühsam erarbeitet habe.
Bei offenlegung der DLL kann sie jeder für seine zwecke nutzen nur dafür habe ich mir nicht die mühe gemacht.
In verbindung mit BassVis kein problem solange sie nur dort verwendet wird.

Nicht mal im Forum von Winamp wollte man mir helfen.. :wall:
Denke alleine das ist ein grund diese nicht publik zu machen.

Werde mir das Sample mal anschauen .. Danke

gruss Emil

QuickAndDirty 1. Apr 2008 09:49

Re: Dll von *.res Datei laden
 
Wenn du wirklich nur die Funktionen brauchst und nicht die Load und Unload Events
dann könnte ich mir vorstellen das du darauf zugreifen kannst.
Du müstest vorher die relativen Adressen der
Funktionen mit GetProcAddress ermitteln und notieren.
Dann die Res in den Stream laden und die Proceduralen
variablen mit den entsprechenden Zeigern belegen.

Ich weiß nicht ob das bei DLLs funktioniert aber mit *.com Dateien (kein Datenregister) konnte man sowas früher machen.

Und du wirst bei solchen Actionen (s. inmemexe.exe) auf jedenfall probleme mit Virenscannern bekommen. Mein Kasperski meckert
einen heur.Trojan.generic an bei Michaelpuffs inmemexe und heutzutage verzichtet kaum ein Scanner auf heuristic.

Tatsächlich willst du ja Daten als Code ausführen...das ist das verhalten eines Virus.


Vielleicht hilft es Dir die Datei nicht nur im $TempDir abzulegen sondern auch ein flag zu setzen dem Zufolge die Datei beim Schließen vom Betriebssystem gelöscht wird...das macht zwar auch probleme mit Virenscannern....

EWeiss 1. Apr 2008 09:55

Re: Dll von *.res Datei laden
 
Zitat:

Und du wirst bei solchen Actionen (s. inmemexe.exe) auf jedenfall probleme mit Virenscannern bekommen. Mein Kasperski meckert
einen heur.Trojan.generic an bei Michaelpuffs inmemexe und heutzutage verzichtet kaum ein Scanner auf heuristic.
benutze ich nicht und eine exe ist es auch nicht von daher ?.. ;)

habe da, glaube ich das richtige gefunden
vielleicht ist es auch für andere ganz interessant

http://www.joachim-bauch.de/tutorial...ll_memory.html

This tutorial describes a technique how a dynamic link library (DLL)
can be loaded from memory without storing it on the hard-disk first.

genau das was ich erreichen will.

gruss Emil

Luckie 1. Apr 2008 10:02

Re: Dll von *.res Datei laden
 
Auch wenn es gehen mag, halte ich das für den falschen Weg. Zum einem, weil es wohl undokumentiert ist, das heißt, du musst bei jedem Update prüfen, ob es noch funktioniert und das bei zich Systemen und Konfigurationen. Du wirst also nie sicherstellen können, dass es läuft. Und zum anderem wird jemand der an die Funktionen will und deine Exe debuggt, sehr schnell sehen, was Sache ist und hat sich deine DLL ohne weiteres aus der Ressource mit einem Resourcenhacker extrahiert.


Zitat:

Zitat von EWeiss
Zitat:

Und du wirst bei solchen Actionen (s. inmemexe.exe) auf jedenfall probleme mit Virenscannern bekommen. Mein Kasperski meckert
einen heur.Trojan.generic an bei Michaelpuffs inmemexe und heutzutage verzichtet kaum ein Scanner auf heuristic.
benutze ich nicht und eine exe ist es auch nicht von daher ?.. ;)

Du nicht und die Benutzer deiner Anwendung? Und ich wäre mir nicht so sicher, dass Antivirenscanner bei DLLs, die aus dem Speicher geladen werden nicht auch ansprechen, weil letztendlich unterscheiden sich Exe-Dateien und DLLs nicht großartig, nur dass DLLs eben keinen Einsprungspunkt haben.

EWeiss 1. Apr 2008 10:08

Re: Dll von *.res Datei laden
 
Zitat:

Auch wenn es gehen mag, halte ich das für den falschen Weg.
ja das nehme ich dir ab..

werde es erstmal ausgibig testen davon abgehen kann ich immer noch.
muss mich mal informieren ob das den Leuten genehm ist wenn sie 2 DLL's bekommen

gruss Emil

cruiser 1. Apr 2008 19:02

Re: Dll von *.res Datei laden
 
Zitat:

Zitat von Luckie
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
Warum sollte er alle Funktionen in einer Klasse kapseln? Das macht bei einer DLL eigentlich nur Probleme, da man nicht ohne weiteres Objektinstanzen zwischen Exe und DLL austauschen kann. Und welche Aufrufkonvention erwählt, ist so ziemlich egal. Er muss sich eben nur daran halten.

Klarer Fall von falsch verstanden. Ich meinte nicht das übergeben von Instanzen, sondern das Kapseln der Funktionen. Beim Erzeugen eines Objects kann man die extrahieren und laden, und beim zerstören wieder löschen. Die Methoden der Klasse greifen dann intern auf die Funktionen der DLL zurück. Ich seh da eigentlich keine Probleme, oder habe ich etwas übersehn?

EWeiss 2. Apr 2008 04:02

Re: Dll von *.res Datei laden
 
hab mich jetzt entschieden..
Mache es wie cruiser vorgeschlagen hat.

aus resource extrahieren
Attribute auf hidden , dann nach Anwender /Lokale Einstellungen/temp
Beim beenden dll löschen (was es nicht immer tut (Zugriff verweigert)
---------
Eigentlich müßte das gehen DLL (Winamp Plugin) wird entladen
in "Finalize" der letzte aufruf bevor BassVis geschlossen wird
mit DeleteFile zum Pfad der extrahierten dll diese löschen..

dürfte eigentlich kein zugriff mehr sein.

gruss Emil

EWeiss 2. Apr 2008 15:46

Re: Dll von *.res Datei laden
 
Uwe sagt mir das ich eine *.obj Datei in Delphi einbinden kann
Nun habe ich diese dem Projekt hinzugefügt als Meldung kommt

[Pascal Error] Winamp_IO.pas(138): E2045 Bad object file format: GetAPIService.obj'

Delphi-Quellcode:
{$MINENUMSIZE 4}
{$ALIGN ON}
{$L GetAPIService.obj}
jetzt frage ich mich ob es daran liegt das sie mit MSVC erstellt wurde..

jemand irgendwelche informationen darüber warum es nicht geht ?
bzw.. geht es theoretisch wenn ich diese mit Borland c++ erstelle und compiliere.(müßte dann erst noch installieren)

Das wäre denke ich die optimale lösung für mein DLL problem

gruss Emil

QuickAndDirty 2. Apr 2008 15:53

Re: Dll von *.res Datei laden
 
Der linker ist passend konfiguriert?

EWeiss 2. Apr 2008 16:00

Re: Dll von *.res Datei laden
 
Zitat:

Zitat von QuickAndDirty
Der linker ist passend konfiguriert?

Bitte mehr inputs

gruss Emil

EWeiss 3. Apr 2008 19:45

Re: Dll von *.res Datei laden
 
Kann mir jemand sagen ob ich mit C++ Builder ein Object von einer MSVC DLL erstellen kann
oder muss diese mit C++ Builder compiliert sein ?

gruss Emil

Luckie 3. Apr 2008 20:33

Re: Dll von *.res Datei laden
 
Eventuell musst du bei deinem C-Compiler noch irgendwelche Einstellungen vornehmen, damit Delphi die generierte Objektdatei akzeptiert. Guck doch mal, was du da für Einstellungen vornehmen kannst.

EWeiss 3. Apr 2008 22:32

Re: Dll von *.res Datei laden
 
Zitat:

Zitat von Luckie
Eventuell musst du bei deinem C-Compiler noch irgendwelche Einstellungen vornehmen, damit Delphi die generierte Objektdatei akzeptiert. Guck doch mal, was du da für Einstellungen vornehmen kannst.

Hab geschaut da ist nichts zu machen..
Hab ne neue DLL estellt mit Borland C++ Builder die wird aktzeptiert <vcl.h> eingebunden

Aber neues problem..

Bei der released addiert der Linker hunderte Exports die er unter Delphi eingebunden haben will.
Bei der debug function _memcmp

Scheint nicht wirklich zu funktionieren ein Obj einzubinden...
Kann aber auch sein das ich einfach zu blöd dafür bin.

gruss Emil

Luckie 4. Apr 2008 08:03

Re: Dll von *.res Datei laden
 
Doch das geht. Das haben schon andere Leute gemacht. Nur leider gehöre ich nicht zu diesen, so dass ich dir nicht helfen kann.

EWeiss 4. Apr 2008 08:31

Re: Dll von *.res Datei laden
 
Zitat:

Zitat von Luckie
Doch das geht. Das haben schon andere Leute gemacht. Nur leider gehöre ich nicht zu diesen, so dass ich dir nicht helfen kann.

da kann man nichts machen ..
Du hast es auf jedenfall versucht.Das rechne ich dir hoch an.

Muss halt warten ob sich ein C++ Delveloper bereit erklärt sich das mal anzuschauen.
Habe auch die vermutung das Msvc und C++ Builder nicht die gleichen syntaxe verwenden
gibt nicht umsonst so tools wie VCTOBPR scheint es aber nicht mehr zu geben.

gruss Emil

Luckie 4. Apr 2008 08:55

Re: Dll von *.res Datei laden
 
Ich wüsste jemanden, aber der hat sich leider hier im Forum abgemeldet: Nico Bendlin aka NicoDE.

EWeiss 4. Apr 2008 09:03

Re: Dll von *.res Datei laden
 
Zitat:

Zitat von Luckie
Ich wüsste jemanden, aber der hat sich leider hier im Forum abgemeldet: Nico Bendlin aka NicoDE.

ja schade wenn fähige Köpfe sich abmelden.

gruss Emil

bitsetter 22. Apr 2008 14:36

Re: Dll von *.res Datei laden
 
Zitat:

Zitat von EWeiss
Zitat:

Zitat von Luckie
Ich wüsste jemanden, aber der hat sich leider hier im Forum abgemeldet: Nico Bendlin aka NicoDE.

ja schade wenn fähige Köpfe sich abmelden.

gruss Emil

IMHO hat sich Nico Bendlin als nicodex wieder angemeldet.

Luckie 22. Apr 2008 14:58

Re: Dll von *.res Datei laden
 
Zitat:

Zitat von bitsetter
Zitat:

Zitat von EWeiss
Zitat:

Zitat von Luckie
Ich wüsste jemanden, aber der hat sich leider hier im Forum abgemeldet: Nico Bendlin aka NicoDE.

ja schade wenn fähige Köpfe sich abmelden.

gruss Emil

IMHO hat sich Nico Bendlin als nicodex wieder angemeldet.

Korrekt, wobei ich mir ziemlich sicher bin, dass Daniel sein Konto nie wirklich gelöscht hatte. ;)


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