![]() |
DLL aus DCU läßt sich nicht laden
Hallo DP,
seit Neustem habe ich ein Problem mit meinem Delphi 7. Und zwar: Ich schreibe an einem Programm, welches DLLs benutzt, nämlich meine eigenen. Beide "Programm-Teile", die Application und die DLL benutzen Funktionen aus den gleichen Units. Wenn ich die Application erstelle, über "Projekt erstellen", erzeugt der Compiler die DCUs und legt sie in den gleichen Ordner, wo auch die PAS-Dateien liegen. Starte ich die Application und lade meine DLL mittels LoadLibrary bekomme ich ein Handle zurück mit dem ich später mein DLL-Funktionen einbinden kann. Klappt soweit alles prima. Wenn nun aber die DLL compiliere, verwendet der Compiler (oder der Linker, weiß ich nicht) nicht die PAS-Dateien, sondern die bereits compilierten DCU-Dateien. Ich denke das ist von Seiten Delphi auch gewollt so und prinzipiell auch erst mal nicht falsch. Lade ich nur die DLL, die mit Hilfe der DCU's erstellt worden ist, wieder mit LoadLibrary, erhalte ich als Handle 0 zurück. :gruebel: Erst wenn ich die DCUs lösche und die DLL erneut compiliere kann ich in meiner Application die DLL wieder korrekt laden. Gibt es einen Grund dafür? Habt ihr das schon erlebt? Könnten unterschiedliche Compiler-Einstellungen der Grund dafür sein? (Obwohl ich in beiden "Teilen" die gleichen Einstellungen verwende) Komisch! ... und nervig! Auf Antwort hoffend, gmc |
Re: DLL aus DCU läßt sich nicht laden
Lass dir doch mal SysErrorMessage(GetLastError) ausgeben.
|
Re: DLL aus DCU läßt sich nicht laden
Code:
Obwohl die DLL definitiv dort ist, wovon sie geladen werden soll.
126 (ERROR_MOD_NOT_FOUND) The specified module could not be found.
|
Re: DLL aus DCU läßt sich nicht laden
Ich könnte mir dann nur noch vorstellen das du mit relativen Pfadangaben arbeitest und beim neu compilieren werden eventuell die Verzeichnisse gewechselt wodurch deine DLL gefunden wird.
|
Re: DLL aus DCU läßt sich nicht laden
Schau mal mit FileExists, ob die Datei gefunden wird.
|
Re: DLL aus DCU läßt sich nicht laden
Das Arbeitsverzeichnis setze ich beim App-Start mit
Delphi-Quellcode:
auf das Verzeichnis der Exe. Alle Path-Angaben setze ich ExpandFilePath auf absolute Pfade.
chdir (ExtractFilePath(Application.Exename));
Diese Art und Weise funktioniert schon seit über 2 Jahren in dem Projekt. Erst seit Neustem bekomme ich Probleme mit dem Laden der DLLs wenn sie aus DCUs erstellt werden. Die Überprüfung mit FileExists ergibt TRUE. Das Laden der DLL ein 0-Handle. Irgendwie scheint die Dll kaputt zu sein. Einen Fehler im Code (der seit 2 Jahren funktioniert) konnte ich nicht entdecken, daher auch die Frage im "Delphi-IDE"-Board, ob nicht evtl. irgendwelche Compiler-Einstellungen oder Projekt-Optionen eine Ursachen sein könnten, denn an denen "experimentiere" ich nämlich hin und wieder. Was ich gestern beim Probieren auch noch festgestellt habe ist, dass ich, wenn ich nur(!) aus den DCUs kompiliere, ich den Fehler bekomme "UnitA.dcu" ist mit einen anderen Version der "UnitB.dcu" kompiliert worden. Was aber unmöglich sein kann, da ich weit und breit auf dem ganzen Rechner nur eine "UnitA" und nur eine "UnitB" habe. Die DCU's ansich habe ich alle(!) schon mehrmals komplett gelöscht. Auch habe ich nur ein Delphi 7 auf dem Rechner und kein weiters. Irgendwie kriege ich den Eindruck das ein "Format C:" die Lösung meiner Probleme ist. :wall: |
Re: DLL aus DCU läßt sich nicht laden
Vielleicht behält Delphi aus irgendeinem Grund ein Handle auf die Datei offen, welches Lese-Zugriff verbietet. Hole dir mal mit CreateFile ein Handle mit GENERIC_READ.
|
Re: DLL aus DCU läßt sich nicht laden
Moin gmc,
Zitat:
Das hilft Dir nichts, wenn im Laufe des Programmes das Arbeitsverzeichnis geändert wird (z.B. durch einen Open-/Savedialog). Zitat:
BTW: Zitat:
|
Re: DLL aus DCU läßt sich nicht laden
Zitat:
Delphi-Quellcode:
Du verlässt dich darauf, dass sich das Arbeitsverzeichnis bis zum Aufruf von LoadLibrary nicht ändert - und fliegst mit der Annahme auf die Nase.
chdir (ExtractFilePath(Application.Exename));
Warum überhaupt solche unsicheren Krücken? Warum nicht den richtigen, absoluten Pfad bei LoadLibrary angeben:
Delphi-Quellcode:
LoadLobrary(PChar(ExtractFilePath(Application.Exename) + 'meine.dll'));
|
Re: DLL aus DCU läßt sich nicht laden
So sollte es ziemlich sicher gehen, sofern die Vermutung mit dem falschen Pfad zutrifft:
Delphi-Quellcode:
LoadLibrary(PChar(IncludeTrailingPathDelimiter(ExtractFilePath(ParamStr(0))) + 'meine.dll'));
|
Re: DLL aus DCU läßt sich nicht laden
Das Arbeitsverzeichnis ändert sich beim Opendialog? Gut zu wissen.
Sollte aber nicht die Ursache sein, da ich alle Pfade, auch die der DLLs, beim App-Start auf absolute Pfade setze und gleich danach überprüfe ob alle meine Dlls sich in ihrem Unterverzeichnis befinden. Sollte eine DLL fehlen, startet das Programm nicht. Es startet aber, nur das Laden der DLL schlägt fehl mit ERROR_MOD_NOT_FOUND. Wohl gemerkt nur, wenn ich vor dem Erstellen der DLL die DCUs nicht lösche. Eigenartigerweise tritt das Problem auch nur auf, wenn ich das Programm nicht aus der IDE starte. Läuft das Programm (die Exe) in der IDE funktioniert das Laden. Starte ich gleich danach die das EXE-File schlägt das Laden fehl. Das Beenden der "Dll-Projket-IDE" macht auch keinen Unterschied. Lösche ich wieder alle DCUs, erstelle die DLL neu, beende alle IDEs, starte die EXE, läuft die Anwendung wieder ohne Probleme. Ich habe nun alle Unit-Ausgabe-Verzeichnisse auf ein Verzeichnis gesetzt, welches sich nicht im Bibliotheks-Path oder im Suche-Path der IDE/Projekte befindet. So klappt das erst mal. Okay, das Kompilieren dauert nun ewig, aber es kommt was funktionierendes dabei raus. Das kann aber nicht die Lösung sein. |
Re: DLL aus DCU läßt sich nicht laden
Hast du den mal unsere Vorschläge ausprobiert?
|
Re: DLL aus DCU läßt sich nicht laden
kannst du mal die "fehlerhafte" dll anhängen?
|
Re: DLL aus DCU läßt sich nicht laden
Zitat:
Was kann ich denn mehr tun, als vor direkt vor Loadlibrary mit FileExists zu prüfen, ob die DLL existiert. Wie schon gesagt, die DLLs befinden sich genau an dem Ort, wo LoadLibrary sie laden soll. Ich verwende zum Laden absolute Pfade, die beim Programmstart gesetzt werden. Auch der Vorschlag von Apollonius die DLL mit FileCreate ( ... , GENERIC_READ ,..) gibt mir ein gültiges Handle zurück und ich könnte die DLLs sogar auslesen. Nochmal: Es liegt nicht daran, dass evtl. die DLL nicht verfügbar ist. Sie ist genau da, wo sie geladen werden soll. @SirThornberry Leider darf ich die "defekte" DLL nicht heraus geben. Sorry, aber ist nicht meine Entscheidung. Was hättest du denn vor damit? Zum "Spaß" habe ich mal eine Test-Anwendung gebastelt, die nur LoadLibrary ruft (und FreeLibrary), so das mir nix quer kommt, und siehe da, er lädt die DLL nicht -> 0-Handle ! hierfür habe ich die DLL ins gleiche Verzeichnis zu der Exe gelegt. So nicht:
Delphi-Quellcode:
und so nicht:
LoadLibrary('C:\Programme\Test\meine.dll');
Delphi-Quellcode:
und so auch nicht:
LoadLibrary(PChar(IncludeTrailingPathDelimiter(ExtractFilePath(Application.Exename)) + 'meine.dll'));
Delphi-Quellcode:
Erst wenn ich die DLL ohne die DCU's neu erstelle, funktionieren alle 3 Aufrufe.
LoadLibrary('.\meine.dll'));
Also ich glaube wirklich, den "Ort der DLL" kann ich zu 100% ausschließen. Ich werd zum Elch! :twisted: |
Re: DLL aus DCU läßt sich nicht laden
Moin gmc,
ich zitier' mich mal eben selber: Zitat:
Delphi-Quellcode:
ausprobieren.
LoadLibrary('meine.dll');
In allen anderen Fällen gibst Du ja einen Pfad mit an, und wenn es .\ ist. |
Re: DLL aus DCU läßt sich nicht laden
Hab ich probiert. Das gleiche.
Auch die DLL ins System32 zu kopieren macht keinen Unterschied. Aber Danke für den Tipp. Ich hab mal den Rechner nach evtl. anderen Version meiner DLL durchsucht. Hätte ja sein können das irgendwo im SearchPath eine andere "meine.dll" rumliegt. Aber Fehlanzeige, alles sauber. Außerdem erklärt es nicht, warum a.) das Laden, nach einem Neustellen plötzlich funktioniert, und b.) der Code seit 2 Jahren an dieser Stelle problemlos läuft Da meine DLLs aber in einem Unterverzeichnisse liegen (sollen), benutze ich doch den absoluten Pfad (full path). Und wenn das nicht hard-coded ist ... Vielleicht hilft wirklich nur das System platt zu machen und Delphi 7 neu zu installieren. Was anderes fällt mir momentan nicht ein. |
Re: DLL aus DCU läßt sich nicht laden
Zitat:
![]() ![]() Hast Du mal die fertig compilierte Version, die auf Deinem Rechner nicht läuft auch auf einem anderen getestet? |
Re: DLL aus DCU läßt sich nicht laden
Jupp. Deswegen ist das Problem ja erst aufgefallen.
Wenn ich die Exe oder die DLL in der IDE starte funktioniert ja alles tadellos. Das Ganze hat sich bei mir so'n bissl eingeschliffen und so hab ich die DLL einfach (zum Glück nur) auf das TestSystem geschoben und dort hat's geknallt. Dann wieder hier in der IDE gestartet, lief. Nach einiger Zeit des grübelns bin ich erst auf die Idee gekommen, auf meinem Rechner hier die Binary zustarten und sieht da, Problem auch hier. Nun hab ich das ganze auf mehreren Rechner getestet, alle Rechner verhalten sich gleich. DLL aus DCU -> 0-Handle, DLL aus PAS funktioniert. Ist das die Späte Rache dafür, dass ich so laut gelacht habe, als die Griechen als Europameister zur EM bereits in der Vorrunde ausgeschieden sind? ... Sorry. :pale: Morgen bastel ich weiter ... für heute hab ich die Nase voll. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:46 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