Entwickler-Ecke
Dateizugriff - DLL ind EXE-File einbinden
M. Raab - Do 23.01.03 17:12
Titel: DLL ind EXE-File einbinden
Hallo NG,
ich habe ein Problem bei der Einbindung von DLL Routinen, die ich in meinem Programm nutze.
Folgendes: ich habe auf meinem PC ein größeres Programm installiert, welches mathematische Routinen zur Verfügung stellt. Aus dieser Bibliothek (sie heißt NAG) nutze ich einige Routinen die ich in meinem Programm einbinde - das funktioniert auch recht gut: aber nur auf meinem PC, auf dem NAG installiert ist. Auf einem fremden PC, auf den ich nur die EXE kopiere, nicht.
Das Problem ist also, dass im EXE File die genutzten Routinen nicht eingebunden werden. Ich kann aber das ganze Paket (ca. 300MB) nicht weiter geben, da ich nicht weiß, wie die Bibliotheken untereinander genutzt werden. Gibt es eine Möglichkeit diese Routinen in das EXE einzubinden und so das ganze auf einem fremden PC zum Laufen zu bekommen ?
Gruss und Danke
Markus
smiegel - Fr 24.01.03 11:45
Hallo,
da Dein Programm fremde DLL's benutzt, musst Du die DLL's auch mitgeben. Ob Du das überhaupt darfst und welche das sind, sollte eigentlich in den Lizenzbestimmungen von "NAG" stehen.
M. Raab - Fr 24.01.03 12:00
Hallo Smiegel,
NAG ist eine Sammlung von mathematischen Routinen - Numerical Algorithm Group in England. Ich habe dort bereits angefragt und die teilen mir die Gebühren noch mit. Eine Möglichkeit diese direkt anzulinken gibt es nicht, oder ?
Gruss
Markus
Andreas Pfau - Sa 25.01.03 17:04
Also, vorrausgesetzt, du hast die Lizenz, die Datei zu linken, so gehts:
1) Date erzeugen: Nag.rc (im selben Verzeichnis wie die DLL)
2) Mit Notepad öffnen, das hier eintragen: "NagDll RcData Nag.dll"
3) Im prompt eintippen: "C:\Programme\Delphi\Bin\Brcc32.exe Nag.rc"
4) Du hast jetzt eine REs-Datei. Öffne dasDelphi-Projekt, öffne dort die DPR-Datei im Editor. Trage ein: "{$R Nag.res}"
5) Neu compilieren. Nun ist die DLL in der EXE
6) Auslesen:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| var R: Cardinal; P: Pointer; S: TFileStream; begin R := FindResource(hInstance, PChar('NagDll'), Rt_RcData); P := LockResource(LoadResource(hInstance, R)); S := TFileStream.Create('Nag.dll', fmCreate); S.Write(P^, SizeOfResource(hInstance, R)); S.Free; end; |
Natürlich könntest du auch zuerst prüfen, ob die Datei existiert.
Moderiert von
Tino: Code- durch Delphi-Tags ersetzt.
M. Raab - So 26.01.03 14:38
Hallo Andreas,
ich muss das noch ausprobieren - aber ein weiteres Problem: die DLLs rufen sich untereindaner auch auf. Ich habe das erst jetzt festgestellt, da ich das Programm an einem anderen PC ausprobiert habe. Dort ist NAG nicht installiert. Ich kopiere nun die (ich sag mal: NAG1.DLL) in mein Programmverzeichnis und rufe dort aus meinem Programm die Funktionen auf. Die NAG1.DLL ruft aber offenbar selbst wieder andere DLLs auf, die sich im System verankert haben. Auf einem anderen PC läßt sich das Programm nicht zum Laufen bringen - ich nehme an, dafür gibt es keine Lösung.
Aber zu Deinem Vorschlag Punkt 6: hier verstehe ich etwas nicht.
Deinen Code baue ich in meine Programm ein und dann steht dort die NAG zur Verfügung. Meine Frage: der Aufruf bleibt aber, oder ?
Quelltext
1: 2: 3:
| procedure E02DDF(....); stdcall; external NAG1.DLL'; |
Gruss
Markus
Andreas Pfau - So 26.01.03 18:18
Nein, sorry, das hatte ich vergessen, Du musst natürlich die DLLs dynamisch laden, da sie ja beim Programmstart nicht z ur Verfügung stehen. Kein statisches laden!!!
M. Raab - Mo 27.01.03 13:38
Hallo Andreas,
und wie mache ich das ? In der Beziehung bin ich blutiger Anfänger ... :oops:
Gruss
Markus
Andreas Pfau - Mo 27.01.03 14:24
Also, angenommen du willst die Funktion "DoSomething(Value: Integer): Boolean;" aus der Library "Nag.dll" laden. Das machst du ja normalerweise so:
Delphi-Quelltext
1:
| function DoSomething(Value: Integer): Boolean; Stdcall; External 'Nag.dll'; |
Das bedeutet, dass die Funktion bei jedem Programmstart gelinkt wird. wenn die Library bzw. die Funktion nicht existiert´, gibt's 'ne Fehlermeldung.
Beim Dynamischen laden hast du die Kontrolle darüber:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25:
| private Lib: Cardinal; DoSomething: function(Value: Integer): Boolean;
procedure TForm1.FormCreate(Sender: TObject); begin Lib := LoadLibrary(PChar('Nag.dll')); If Lib = 0 Then MessageBox('Library nicht gefunden!') Else begin @DoSomething := GetProcAddress(Lib, PChar('DoSomething')); If @DoSomething = Nil Then MessageBox('Funktion nicht gefunden!') end; end;
procedure TForm1.FormDestroy(Sender: TObject); begin If Lib <> 0 Then FreLibrary(Lib); end; |
Wenn ein Fehler unterläuft, solltest du natürlich noch ein Flag setzen, damit du die Funktion nicht aufrufst, klar. Ansonsten kannst du die Funktion ganz normal benutzen.
Moderiert von
Tino: Code- durch Delphi-Tags ersetzt.
M. Raab - Di 28.01.03 16:12
Hallo,
sorry wenn ich jetzt blöd weiter frage .... aber wenn ich das richtig verstehe, wird beim STart meines Progs nun die LIB auf mein Verlangen angelinkt und ist auch im EXE File ? Angenommen, NAG1 ruft eine Routine aus NAG2 auf (was ich nicht weiß), funktioniert das dann auch, d.h. läuft dann das EXE auch alleine ?
Nochmals DANKE
Gruss
Markus
Andreas Pfau - Di 28.01.03 20:08
Sorry, dass ich das jetz so sallopp sage, aber mir scheint, dass du von DLLs keine große Ahnung hast.
"Linken" bedeutet hier, dass eine Instanz der DLL erstellt wird, denn eine DLL ist im weitesten sinne auch nur eine anwendung, nur eben ohne GUI, wenn du es so willst. Linken hat hier nix mit dem linken beim compilern zutun, es wird also keine Executeable erstellt, sondern nur geladen. Das bedeutet letztendlich, du kannst Methoden (und Ressourcen) aus dieser DLL nutzen, wie wenn sie in deiner Anwendung hinterlegt wären. Der Code ist aber nicht in deiner EXE, und erbleibt danach auch nicht dort. Er ist nur in einer eigenen Instanz.
Wenn jetzt Nag1 Nag2 aufruft, muss Nag1 sich selber drum kümmern, dass Nag2 an Nag1 gelinkt wird. Du musst also nur Nag 2 mitliefern (bzw. auch als Ressource mitliefern und dann entpacken).
Wenn du nicht weißt, ob Nag2 benötigt wird, und du es auch nirgends nachlesen kannst, dann finde es raus. Ich habe keine Ahnung, wie das geht, da müsste jemand anderes helfen. Ich kenne nur die "Triviallösung": Alle DLLs um bennenen, und wenn es Fehlermeldungen hagelt, dann brauchst du die DLLs...
M. Raab - Mi 29.01.03 13:08
Hallo Andreas,
es ist so wie Du es sagst - ich benutze DLLs zum ersten Mal in dieser Form und habe wirklich keine Ahnung. Ich weiss zumindest jetzt wie ich sie nutzen kann und wie ich sie finden kann. Ich mach das jetzt einfach mal so: ich kopiere die DLLs die ich kenne und benutze und warte ab, wo Fehelrmeldungen kommen. Dann sehen wir weiter.
Ich denke, dass auch andére Anfänger hieraus was lernen konnten. In jedem Fall danke ich Dir sehr herzlich für Deine Mühen und Geduld: D A N K E
Gruss
Markus
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!