Discussion:
Dll in exe einbinden
(zu alt für eine Antwort)
B.Rauschenbach
2005-07-18 20:47:32 UTC
Permalink
Hallo NG,

Mein Programm benötigt eine .dll Datei um zu funktionieren.

Ist es möglich diese als Ressource einzubinden, so das sie quasi in meinem
Programm enthalten ist.
Bei Wave-Dateien habe ich soetwas schonmal gemacht.

Danke für Hilfe vorab!

Gruss,
B. Rauschenbach
Martin Hentrich
2005-07-19 05:15:52 UTC
Permalink
On Mon, 18 Jul 2005 22:47:32 +0200, "B.Rauschenbach"
Post by B.Rauschenbach
Mein Programm benötigt eine .dll Datei um zu funktionieren.
Ist das *deine* DLL oder eine *fremde*?
Post by B.Rauschenbach
Ist es möglich diese als Ressource einzubinden, so das sie quasi in meinem
Programm enthalten ist.
Das widerspricht ja wohl dem Sinn der DLL. Und was ist bei
Versionskonflikten, falls die DLL schon auf dem System vorhanden, ggf
sogar geladen ist?

Oder willst du nur eine *fremde* DLL quasi verstecken, weil du sie
eigentlich gar nicht weitergeben darfst?

Warum schreibst du nicht fie Funktionen in dein Programm?

Du willst die DLL ja wohl nicht nur einbinden (das geht) - du willst
sie ja auch nutzen.
Post by B.Rauschenbach
Bei Wave-Dateien habe ich soetwas schonmal gemacht.
Da ist es auch kein Problem.

Martin
Heiko Luettge
2005-07-19 06:31:08 UTC
Permalink
Hallo B.

Du kannst sie genau wie bei den Wave vor Gebrauch "auspacken" in dein
Exe-Verzeichnis,
dort Laden mit LoadLibrary.
Die statische Einbindung (imports ..) klappt dann nat. nicht,
du muss alles über GetProcAddress machen.

Bedenke aber, dass viele Admins keine Schreibrechte im Programme-Pfad
erlauben.
dann hast du ein Problem ;)


Heiko
Markus Gronotte
2005-07-19 09:02:59 UTC
Permalink
"Heiko Luettge"
Post by Heiko Luettge
Du kannst sie genau wie bei den Wave vor Gebrauch "auspacken" in dein
Exe-Verzeichnis,
dort Laden mit LoadLibrary.
Die statische Einbindung (imports ..) klappt dann nat. nicht,
du muss alles über GetProcAddress machen.
Bedenke aber, dass viele Admins keine Schreibrechte im Programme-Pfad
erlauben.
dann hast du ein Problem ;)
Das ist nicht wirklich ein Problem. Die Rechte kann man sich unter
Microsoftbetriebssystemen sehr einfach geben. Im worstcase ist
gerade mal ein Neustarten der Applikation mit Administratorrechten
nötig.

BTW: Kann man über die Rechtevergabe bei Windows XP z.B. Shellexecute unterbinden?

lg,

Markus
Joe Galinke
2005-07-19 09:18:26 UTC
Permalink
Hallo Markus,
Post by Markus Gronotte
Post by Heiko Luettge
Bedenke aber, dass viele Admins keine Schreibrechte im Programme-Pfad
erlauben.
dann hast du ein Problem ;)
Das ist nicht wirklich ein Problem. Die Rechte kann man sich unter
Microsoftbetriebssystemen sehr einfach geben.
Du meinst, eine Anwendung, die im Kontext eines Benutzers mit
eingeschränkten Rechten läuft, kann sich so einfach mit höheren rechten
ausstatten? Oh!


Gruß, Joe
--
Heiko Nocon
2005-07-19 14:49:30 UTC
Permalink
Post by Markus Gronotte
Das ist nicht wirklich ein Problem.
Natürlich ist das ein Problem.
Post by Markus Gronotte
Die Rechte kann man sich unter
Microsoftbetriebssystemen sehr einfach geben.
Nur wenn man das Recht hat, sich Rechte zu geben. In adminstrierten
Umfeldern hat der gemeine Benutzer dieses Recht üblicherweise nicht.
Post by Markus Gronotte
BTW: Kann man über die Rechtevergabe bei Windows XP z.B. Shellexecute unterbinden?
Nur indirekt. D.h. der Aufruf von ShellExecute selber läßt sich nicht
unterbinden, aber es läßt sich unterbinden, daß das irgendwelche
unerwünschten Folgen hat, z.B. daß darüber ein Programm gestartet werden
kann, von dem der Admin nicht will, daß es der Benutzer starten kann.
--
Wer Komponenten ohne Quelltext oder richtig miese Komponenten
oder gute Komponenten mit Quelltext, ohne die Source zu verstehen, sich verschafft,
um sie in Form "eigener" Programme in Verkehr zu bringen,
der wird mit Gefängnis nicht unter 5 Jahren bestraft.
Heiko Nocon
2005-07-19 14:49:30 UTC
Permalink
Post by B.Rauschenbach
Ist es möglich diese als Ressource einzubinden, so das sie quasi in meinem
Programm enthalten ist.
Ja.
Post by B.Rauschenbach
Bei Wave-Dateien habe ich soetwas schonmal gemacht.
Super. Dann weißt du ja schon ungefähr, wie's geht.


Wieso fragst du dann eigentlich noch?
--
Wer Komponenten ohne Quelltext oder richtig miese Komponenten
oder gute Komponenten mit Quelltext, ohne die Source zu verstehen, sich verschafft,
um sie in Form "eigener" Programme in Verkehr zu bringen,
der wird mit Gefängnis nicht unter 5 Jahren bestraft.
B.Rauschenbach
2005-07-20 06:17:16 UTC
Permalink
Post by Heiko Nocon
Wieso fragst du dann eigentlich noch?
Na weil ich es nicht hinbekommen habe, halt ;)

PS:
Die dll gehört zu einem anderen Programm. Für 3rd Party Tools darf man diese
verwenden.
Aus einfachheitsgründen wollte ich das mein Programm nur die .exe selber
darstellt.

Gruss,
B. Rauschenbach
Heiko Nocon
2005-07-20 15:47:57 UTC
Permalink
Post by B.Rauschenbach
Na weil ich es nicht hinbekommen habe, halt ;)
Wenn das so ist, dann hättest du noch dazuschreiben müssen, woran genau
du gescheitert bist.
--
Wer Komponenten ohne Quelltext oder richtig miese Komponenten
oder gute Komponenten mit Quelltext, ohne die Source zu verstehen, sich verschafft,
um sie in Form "eigener" Programme in Verkehr zu bringen,
der wird mit Gefängnis nicht unter 5 Jahren bestraft.
Marian Aldenhövel
2005-07-20 15:54:51 UTC
Permalink
Hallo,
Post by B.Rauschenbach
Ist es möglich diese als Ressource einzubinden, so das sie quasi in meinem
Programm enthalten ist.
Das ist kein Problem.

Was nicht mit vertretbarem Aufwand geht ist die DLL als Bestandteil der EXE
zu _verwenden_. Also muss sie vor der Verwendung wieder heraus.

Das wirft zwei Fragen auf: Wann? und Wohin?

Wann? Bevor Du sie das erste Mal verwendest. Das verbietet statische Importe.
Nicht weiter schlimm wenn die Schnittstelle der DLL nicht gerade aus
zweieinhalbtausend Funktionen besteht.

Wohin? Das ist interessanter. Es muss ein Platz sein, an den jeder Benutzer
des Programms schreiben darf und an dem die DLL auch gefunden wird. Letzteres
Problem lässt sich entschärfen indem Du beim dynamischen Laden einen
vollständigen Pfadnamen angibst - da Du ohnehin dynamisch laden musst, siehe
"Wann?" macht das keine Mehrarbeit.

Meine Meinung: Lass' es sein, es ist den Kopfschmerz nicht wert.

Ciao, MM
--
Marian Aldenhövel, Rosenhain 23, 53123 Bonn. +49 228 624013.
http://www.marian-aldenhoevel.de
"It's easy to make a small fortune in aviation,
provided you start with a big one"
Holger Lembke
2005-07-20 16:19:19 UTC
Permalink
Post by Marian Aldenhövel
Was nicht mit vertretbarem Aufwand geht ist die DLL als Bestandteil der EXE
zu _verwenden_. Also muss sie vor der Verwendung wieder heraus.
Muss sie das?

Ich habe es noch nicht probiert, aber kann sich die EXE nicht selbst als
DLL öffnen?
--
mit freundlichen Grüßen!We are the world, keep Michael Jackson away
Holgi, +49-531-3497854 !from your children... (Richard Cheese)
Marian Aldenhövel
2005-07-20 16:21:42 UTC
Permalink
Hallo,
Post by Holger Lembke
Ich habe es noch nicht probiert, aber kann sich die EXE nicht selbst als
DLL öffnen?
Ich habe es auch noch nicht probiert, schließe es aber quasi aus: Alle
Header der DLL-Seite des Doppelmoduls wären für den PE-Loader in Windows
an der falschen Stelle.

Das ist etwas anderes als eine EXE die genauso wie eine DLL Funktionen
exportiert. Wenn B. die Funktionen der DLL in dieser Form in seine EXE
bekäme, dann bräuchte er nicht zu ex- und importieren, sondern nur
aufzurufen :-).

Ciao, MM
--
Marian Aldenhövel, Rosenhain 23, 53123 Bonn. +49 228 624013.
http://www.marian-aldenhoevel.de
"It's easy to make a small fortune in aviation,
provided you start with a big one"
Holger Lembke
2005-07-20 17:54:04 UTC
Permalink
Quasi.


program selfdll;

{$APPTYPE CONSOLE}

uses windows, SysUtils;

procedure whyme; stdcall; export;
begin
MessageBox(0, 'Jo!', '', MB_ICONINFORMATION or MB_OK);
end;

exports whyme name 'whyme';


Var dll : thandle;
p : procedure;
begin
dll:=LoadLibrary(pansichar(paramstr(0)));

p:=GetProcAddress(dll,'whyme');
p;

FreeLibrary(dll);
end.
Post by Marian Aldenhövel
Alle
Header der DLL-Seite des Doppelmoduls wären für den PE-Loader in Windows
an der falschen Stelle.
Dafür funktioniert das obige Beispiel aber ziemlich gut. Was quasi Zufall
sein dürfte.
--
mit freundlichen Grüßen!We are the world, keep Michael Jackson away
Holgi, +49-531-3497854 !from your children... (Richard Cheese)
NineBerry Schwarz
2005-07-20 18:10:27 UTC
Permalink
Hallo
Post by Holger Lembke
Post by Marian Aldenhövel
Header der DLL-Seite des Doppelmoduls wären für den PE-Loader in
Windows an der falschen Stelle.
Dafür funktioniert das obige Beispiel aber ziemlich gut. Was quasi
Zufall sein dürfte.
Wie Marian schon ausgeführt hat: Natürlich kannst du aus einer *.exe
Funktionen exportieren und diese verwenden.
Der OP hat ja aber nur eine in Binärform vorliegende in Sprache X
geschriebene *.DLL ohne Quellcode.

Neun
Holger Lembke
2005-07-20 18:36:00 UTC
Permalink
Post by NineBerry Schwarz
Der OP hat ja aber nur eine in Binärform vorliegende in Sprache X
geschriebene *.DLL ohne Quellcode.
Ups.
--
mit freundlichen Grüßen!We are the world, keep Michael Jackson away
Holgi, +49-531-3497854 !from your children... (Richard Cheese)
Marian Aldenhövel
2005-07-21 06:15:23 UTC
Permalink
Hallo,
Post by Holger Lembke
Dafür funktioniert das obige Beispiel aber ziemlich gut.
Das ist etwas anderes als eine EXE die genauso wie eine DLL Funktionen
exportiert.
Packe Deine Funktion WhyMe in eine DLL, also "library lib" statt
"program selfdll". Packe sie mit beliebigen Mitteln zu einer EXE dazu.
Sei es "Copy a.exe+b.dll c.exe", als Resource oder sonstwie. DAS ist
das was dem OP vorschwebt.

Ohne die DLL jetzt wieder separat auf die Platte zu packen wirst
Du nicht an WhyMe herankommen.

Ciao, MM
--
Marian Aldenhövel, Rosenhain 23, 53123 Bonn. +49 228 624013.
http://www.marian-aldenhoevel.de
"It's easy to make a small fortune in aviation,
provided you start with a big one"
Holger Lembke
2005-07-21 07:28:46 UTC
Permalink
Post by Marian Aldenhövel
Sei es "Copy a.exe+b.dll c.exe", als Resource oder sonstwie. DAS ist
das was dem OP vorschwebt.
Genau das habe ich übersehen...
--
mit freundlichen Grüßen!We are the world, keep Michael Jackson away
Holgi, +49-531-3497854 !from your children... (Richard Cheese)
Holger Lembke
2005-07-21 11:12:35 UTC
Permalink
Post by Marian Aldenhövel
Ohne die DLL jetzt wieder separat auf die Platte zu packen wirst
Du nicht an WhyMe herankommen.
Nachtrag:

C: http://www.joachim-bauch.de/tutorials/load_dll_memory.html/en/view
Delphi: http://download.dsplayer.de/OpenSource/_BTSources.rar

Wie man sieht: Trivial. :-))
--
mit freundlichen Grüßen!We are the world, keep Michael Jackson away
Holgi, +49-531-3497854 !from your children... (Richard Cheese)
Wolfgang Fellger
2005-07-21 12:53:49 UTC
Permalink
Post by Holger Lembke
Delphi: http://download.dsplayer.de/OpenSource/_BTSources.rar
Wie man sieht: Trivial. :-))
Für den Anwender tatsächlich trivial... Das wandert gleich in meine
Schatzkiste, mal sehen ob ich das noch mal brauchen kann :) Danke!
--
Wolfgang Fellger
Loading...