Autor Beitrag
peeage
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 50



BeitragVerfasst: Mi 04.03.09 13:32 
Hallo zusammmen !

Habe hier für Delphi ein OpenSource- Projekt rumliegen. Unter anderem ein riesen pas- file, in welchem sehr sehr viele Funktionen + Prozeduren einer DLL statisch geladen werden. Dieses pas- file nutze ich in meinem Projekt. Nun kann es aber vorkommen, dass die genutzte DLL evntl. auf einem Client ( auf welchem mein Projekt ausgeführt wird ) nicht vorhanden ist. In diesem Moment bekomme ich natürlich die Fehlermeldung, dass die DLL- Datei nicht gefunden wurde -> Folge: Programm beendet sich.

Nun meine Frage: Gibt es eine Möglichkeit, dass das Programm trotzdem weiterhin ausgeführt wird??

Gruß


Moderiert von user profile iconNarses: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Mi 04.03.2009 um 13:48
Heiko
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3169
Erhaltene Danke: 11



BeitragVerfasst: Mi 04.03.09 13:51 
Japp, mach es so wie Borland. Vor dem implementation-Bereich die Funktionen definieren (ohne external!) und dann erst im Implementationbereich die dll mit angeben. Ich habe leider gerade nicht TurboDelphi oder so oben, dass ich es dir zeigen könnte. Aber schau dir z.B. mal die Windows.pas an, da müssteste auf diese Einbindungsart stoßen. Ansonsten würde ja jede Anwendung von Delphi gegen den Baum laufen, sobald sie unter Win98 & Co gestartet werden, da die UniCode-API noch fehlte ;).

Ich hoffe ich konnte dir damit ein bissl helfen ;)
peeage Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 50



BeitragVerfasst: Mi 04.03.09 14:10 
Danke für deine Antwort.

Mir ist gerade aufgefallen, dass genau dies der Fall ist. Der Entwickler der pas- Datei hat vor dem Implementations- Bereich die Prozeduren / Funktionen ebenfalls definiert, nur mit einem "stdcall; far;" hinten dran. Trotzdem bekomme ich beim Start der Anwendung ne Fehlermeldung :-/
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 04.03.09 15:16 
@Heiko: Und das funktioniert? Wenn man Bibliotheken statisch linkt, wird ein entsprechender Eintrag in der Importtabelle der Exe-Datei gemacht. Der Loader von Windows liest diese Tabelle und läd entsprechende die zusätzlichen Bibliotheken. Findet er eine nicht, bricht er den Ladevorgang mit einer Fehlermeldung ab. Das heißt, wie du letztendlich statisch Links sollte egal sein.

@peeage: Ich denke, da hilft nur noch das dynamische Laden der DLL.
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mi 04.03.09 23:03 
Moin!

Hm, ich hätte auch gesagt, dass man beim statischen Linken immer eine Fehlermeldung bekommt. :? Also: dynamisch linken. Hier gibt´s vielleicht einen nützlichen Tipp dazu. :idea: ;)

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
Heiko
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3169
Erhaltene Danke: 11



BeitragVerfasst: Do 05.03.09 00:16 
So, ich habe TurboDelphi jetzt zum laufen bekommen (embargo will mir TD Prof unterjubeln und keinen Key für die kostenlose geben :autsch: ).

So macht Borland das intern, damit z.B. die ganzen UniCode-APIs gelinkt werden können, auch wenn die nicht vorhanden sind. Ich weiß zwar nicht ob man hier noch von statisch spricht, aber der Aufwand ist wesentlich geringer als beim dynamischen und sollte den Anforderungen hier entsprechen:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
var
  Form1: TForm1;

  procedure Blubb;

implementation

procedure BlubbA; external 'Test';

{$R *.dfm}

procedure Blubb;
begin
  BlubbA;
end;
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 05.03.09 00:38 
Und so funktioniert das auch wenn die DLL nicht vorhanden ist? Bist du sicher? Das probier ich doch gleich mal aus, ich dachte in beiden Fällen würde eine statische Einbindung verursacht. :shock:

// EDIT:
Also bei mir klappt das nicht, bei mir wird das ein normaler statischer Import. :nixweiss:
Heiko
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3169
Erhaltene Danke: 11



BeitragVerfasst: Do 05.03.09 12:50 
Hast Recht, man sollte Blubb noch aufrufen, damit ers mitkompiliert ;). Was mich eben wundert: z.B. in dieser Uni hier verwende ich FindFirstFileA und FindFirstFileW. Letzteres steht nur auf NT-Versionen bereit. Trotzdem läuft meine Demo auf Win95, obwohl die gleiche Exe auf NT-Systemen die UniCode-Version verwendet. D.h., für mich, dass er beide einbindet. Nur habe ich gerade keine Idee, woran es noch liegen könnte, dass es Borland schafft, wir aber nicht...
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 05.03.09 12:55 
Was ist daran seltsam? Die DLLs existieren doch alle, nur die Funktionen nicht. Und dass die unter 95 nicht aufgerufen werden, dafür sorgt ja ggf. der weitere Quelltext. ;-)
Heiko
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3169
Erhaltene Danke: 11



BeitragVerfasst: Do 05.03.09 13:20 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Die DLLs existieren doch alle, nur die Funktionen nicht.

Wenn ich eine Funktion einbinde, die es in einer DLL nicht gibt, bekomme ich beim starten auch eine Fehlermeldung um die Ohren geschmissen - auch wenn die niht aufgerufen wird ;).
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Und dass die unter 95 nicht aufgerufen werden, dafür sorgt ja ggf. der weitere Quelltext. ;-)

Das ist ja das Problem - ich sehe da nichts. DIe gehen so voran, wie ich es oben stehen habe (ok externalysm steht noch dazu, aber das änderte bei mir nix). Schau dir einfach mal den Code von Borland an ;).
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 05.03.09 13:35 
user profile iconHeiko hat folgendes geschrieben Zum zitierten Posting springen:
Wenn ich eine Funktion einbinde, die es in einer DLL nicht gibt, bekomme ich beim starten auch eine Fehlermeldung um die Ohren geschmissen - auch wenn die niht aufgerufen wird ;).
Da hast du auch wieder Recht.

user profile iconHeiko hat folgendes geschrieben Zum zitierten Posting springen:
Das ist ja das Problem - ich sehe da nichts. DIe gehen so voran, wie ich es oben stehen habe (ok externalysm steht noch dazu, aber das änderte bei mir nix). Schau dir einfach mal den Code von Borland an ;).
Da gibt es zwei Möglichkeiten: Entweder die Units bekommen eine Sonderbehandlung oder da passiert noch mehr.

Ich schau mir einfach mal die erzeugte Exe genauer an. ;-)