Autor Beitrag
LittleBen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 258
Erhaltene Danke: 4

Win 7, Mac OS
Delphi 7
BeitragVerfasst: Fr 10.12.10 18:10 
Hallo Zusammen!
Es gibt zwar schon ein Thread zu diesem Thema, aber dieser hat mir nicht wirklich geholfen.
Also:
Ich möchte eine Komponente Benutzen, die aber eine lästige DLL benötigt. Nun möchte ich diese DLL in mein Projekt sozusagen "einbinden", damit ich diese lästige DLL nicht im Programmpfad oder im System32 haben muss. Ich möchte mein Programm später vielleicht auch mal auf meine Seite stellen oder Freunden schicken und da wäre die DLL(s) sehr unschön...
Doch kann man überhaupt eine DLL "einbinden" oder habe ich das grad nur erfunden? :D

Hoffe ihr könnt mir helfen!

Grüße,
Benny


Moderiert von user profile iconNarses: Topic aus Sonstiges (Delphi) verschoben am Fr 10.12.2010 um 19:50
HenryHux
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 542
Erhaltene Danke: 33

Windows 7 Premium
Delphi XE, Eclipse
BeitragVerfasst: Fr 10.12.10 18:36 
Hmm reicht das nicht, die einfach in den Programmordner zu kopieren?
Bei mir klappt es eigentlich immer wenn ich die entweder in den system32- oder in den .exe Ordner kopiere.

Lg
MisterBum83
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 245
Erhaltene Danke: 2

WIN XP
Delphi 6
BeitragVerfasst: Fr 10.12.10 20:08 
Kopiere die notwendige DLL in dein Programmverzeichnis, binde diese (dynamisch oder statisch) in dein Programm ein und nutze die notwendige Funktion.
Dann kannst du allen dein Programm mit der DLL zur Verfügung stellen.


Gruß MisterBum
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Fr 10.12.10 20:53 
Moin!

user profile iconLittleBen hat folgendes geschrieben Zum zitierten Posting springen:
Doch kann man überhaupt eine DLL "einbinden" oder habe ich das grad nur erfunden?
Man kann mit viel Aufwand ein Executable aus einem MemoryStream starten, also theoretisch auch eine DLL. :nixweiss:

Aber mal als einfacher Absatz: pack die DLL als Resource ein und löse sie ins Programmverzeichnis, wenn sie nicht da ist. :idea: Hat zwar auch ein paar Haken, aber gut...

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 10.12.10 20:54 
user profile iconLittleBen hat folgendes geschrieben Zum zitierten Posting springen:
Doch kann man überhaupt eine DLL "einbinden"

Kommt darauf an, was du unter "einbinden" verstehst.
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Fr 10.12.10 23:16 
MoleBox/VMWare ThinApp wäre dafür gedacht, aber ich würde davon abraten. Am besten machst du eine Setup, die die Applikation sauber installiert und wieder deinstalliert.
LittleBen Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 258
Erhaltene Danke: 4

Win 7, Mac OS
Delphi 7
BeitragVerfasst: Sa 11.12.10 15:16 
Vielen Dank für die vielen Antworten!

Also auf meinem Computer habe ich die DLL ins System32 kopiert, kein Problem.
Es geht nur darum, dass wenn ich mein Programm online stelle, möchte ich nicht, dass der Anwender immer so unschöne DLL im Programmpfad haben muss, wie z.B auf dem Desktop.
Aber das Einbinden kann ich wohl vergessen ;-)

Wie könnte ich den so ein Setup erstellen?

Grüße,
Benny
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 11.12.10 15:36 
user profile iconLittleBen hat folgendes geschrieben Zum zitierten Posting springen:
möchte ich nicht, dass der Anwender immer so unschöne DLL im Programmpfad haben muss, wie z.B auf dem Desktop.
Was ist daran unschön? :gruebel:

user profile iconLittleBen hat folgendes geschrieben Zum zitierten Posting springen:
Aber das Einbinden kann ich wohl vergessen ;-)
Du könntest die DLL dynamisch einbinden, dann muss diese beim Start nicht vorhanden sein. Auf diese Weise kannst du diese wie bereits geschrieben wurde in der Exe mitliefern und dann auspacken, wenn sie benötigt wird.

user profile iconLittleBen hat folgendes geschrieben Zum zitierten Posting springen:
Wie könnte ich den so ein Setup erstellen?
Zum Beispiel mit InnoSetup, das ich persönlich für das beste Setuptool in dem Segment halte.
Martok
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 3661
Erhaltene Danke: 604

Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
BeitragVerfasst: Sa 11.12.10 16:01 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconLittleBen hat folgendes geschrieben Zum zitierten Posting springen:
möchte ich nicht, dass der Anwender immer so unschöne DLL im Programmpfad haben muss, wie z.B auf dem Desktop.
Was ist daran unschön? :gruebel:

Dass das Programm auf dem Desktop liegt?
Wer das macht, gehört bestraft, da ist eine DLL noch das mindeste. Ich wäre ja eher für format C:...

_________________
"The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Sa 11.12.10 16:11 
Also wenn der Anwender die Programmdateien aus dem Archiv auf dem Desktop entpackt und er da nun ein paar Dateien rumfliegen hat, ist das sein Problem.

Für diesen Beitrag haben gedankt: Martok
Delphi-Laie
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1600
Erhaltene Danke: 232


Delphi 2 - RAD-Studio 10.1 Berlin
BeitragVerfasst: Sa 11.12.10 19:12 
user profile iconLittleBen hat folgendes geschrieben Zum zitierten Posting springen:
Hallo Zusammen!


Hallo auseinander!

user profile iconLittleBen hat folgendes geschrieben Zum zitierten Posting springen:
Es gibt zwar schon ein Thread zu diesem Thema, aber dieser hat mir nicht wirklich geholfen.


Nicht wirklich? Also unwirklich?

user profile iconLittleBen hat folgendes geschrieben Zum zitierten Posting springen:
Ich möchte eine Komponente Benutzen, die aber eine lästige DLL benötigt. Nun möchte ich diese DLL in mein Projekt sozusagen "einbinden", damit ich diese lästige DLL nicht im Programmpfad oder im System32 haben muss. Ich möchte mein Programm später vielleicht auch mal auf meine Seite stellen oder Freunden schicken und da wäre die DLL(s) sehr unschön...
Doch kann man überhaupt eine DLL "einbinden" oder habe ich das grad nur erfunden? :D


Was Du suchst, kann das Programm "PEBundle", das sich über eine Internetsuchseite leicht beschaffen lassen müßte. Es vereint zu einer neuen Exe-Datei. Es kann aber durchaus (in seltenen Fällen?) sein, daß die Funktionalität des Programms (bzw. des Duos, das aus Exe- und DLL-Datei besteht), dann nicht oder zumindest nicht vollständig gegeben ist. Bei globalen Hooks z.B. klappt es mit erheblicher Wahrscheinlichkeit nicht, also war es für mich nach anfänglicher Euphorie uninteressant. Was man in einer Datei vereint und dann immer noch funktioniert, kann man dann aber gleich in eine Programmdatei implementieren, falls möglich (also die Quelltexte vorliegen).
LittleBen Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 258
Erhaltene Danke: 4

Win 7, Mac OS
Delphi 7
BeitragVerfasst: So 12.12.10 17:07 
Also ich habe mich jetzt mal mit den Resourcen beschäftigt. Habe auch schon Musik, Bilder etc. "reingepackt" und aufgerufen.

Die *.rc datei sieht ja so aus:

Zitat:
Song1 WAVE Test.wav

Und aufrufen so:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
implementation

{$R *.dfm}
{$R MyRes.res}
procedure TForm1.Button1Click(Sender: TObject);
begin
 PlaySound(PChar('Song1'), hInstance, SND_RESOURCE Or SND_ASYNC);
end;
Funktioniert alles,gut...Aber wie sieht die *.rc Datei mit na DLL aus?
so..?
Zitat:
Datei1 RCDATA Test.dll
Wenn ja, wie rufe ich sie auf?
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 12.12.10 17:31 
user profile iconLittleBen hat folgendes geschrieben Zum zitierten Posting springen:
Wenn ja, wie rufe ich sie auf?
Indem du die dann zur Laufzeit auspackst bevor du diese mit LoadLibrary lädst. Zum Beispiel mit TResourceStream.
LittleBen Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 258
Erhaltene Danke: 4

Win 7, Mac OS
Delphi 7
BeitragVerfasst: So 12.12.10 18:26 
So?

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
implementation

{$R *.dfm}
{$R MyRes.res}
      
procedure TForm1.FormCreate(Sender: TObject);
var Res: TResourceStream;
begin
 if FindResource(hInstance, 'Datei1', RT_RCDATA) <> 0 then
 begin
  Res := TResourceStream.Create(hInstance, 'Datei1', RT_RCDATA);
  showmessage('Gefunden');
 end;
end;
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 12.12.10 19:42 
Ja, dann noch mit CopyFrom in einen TFileStream und damit ins Tempverzeichnis packen, dann von dort laden, fertig.
LittleBen Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 258
Erhaltene Danke: 4

Win 7, Mac OS
Delphi 7
BeitragVerfasst: So 12.12.10 19:48 
...? Mhhh, kannst du mit vielleicht mal ein Beispiel machen?
LittleBen Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 258
Erhaltene Danke: 4

Win 7, Mac OS
Delphi 7
BeitragVerfasst: Fr 17.12.10 19:37 
Ich versteh nur das mit dem Tempverzeichnis nicht. Könntest du mir mal mit ein bisschen Code auf die Sprünge helfen?
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 17.12.10 20:24 
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
var
  TempPath: PChar;
  TempPathBufferSize: Integer;
begin
  TempPathBufferSize := GetTempPath(0nil);
  GetMem(TempPath, TempPathBufferSize);
  try
    if GetTempPath(TempPathBufferSize, TempPath) <> 0 then
    begin
      ShowMessage('Das temporäre Verzeichnis ist: ' + TempPath);
    end
    else
      raise Exception.Create(SysErrorMessage(GetLastError));
  finally
    FreeMem(TempPath, TempPathBufferSize);
  end;
Statt dem ShowMessage kannst du dann in dem Verzeichnis die DLL ablegen und danach mit LoadLibrary usw. laden. Und nach der Benutzung und dem Entladen mit FreeLibrary kannst du die DLL auch direkt wieder löschen.
LittleBen Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 258
Erhaltene Danke: 4

Win 7, Mac OS
Delphi 7
BeitragVerfasst: Fr 17.12.10 21:38 
Okay, dahin soll ich die DLL kopieren. Wie mach ich das am besten? DU hast mal "CopyFrom" angesprochen. Habe noch nie damit hantiert. Könntest du mir zeigen wie ich das da rein kopiere?
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 17.12.10 23:01 
Du erzeugst einen TFileStream mit dem Temppfad und dem Namen der DLL, dann kopierst du mit CopyFrom den Inhalt deines TResourceStream da rein.