AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

DLL aus DCU läßt sich nicht laden

Ein Thema von gmc616 · begonnen am 7. Jul 2008 · letzter Beitrag vom 8. Jul 2008
Antwort Antwort
Seite 1 von 2  1 2      
gmc616

Registriert seit: 25. Jun 2004
Ort: Jena
627 Beiträge
 
Delphi 10.3 Rio
 
#1

DLL aus DCU läßt sich nicht laden

  Alt 7. Jul 2008, 17:37
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.

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
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: DLL aus DCU läßt sich nicht laden

  Alt 7. Jul 2008, 17:40
Lass dir doch mal SysErrorMessage(GetLastError) ausgeben.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
gmc616

Registriert seit: 25. Jun 2004
Ort: Jena
627 Beiträge
 
Delphi 10.3 Rio
 
#3

Re: DLL aus DCU läßt sich nicht laden

  Alt 7. Jul 2008, 17:59
Code:
126 (ERROR_MOD_NOT_FOUND) The specified module could not be found.
Obwohl die DLL definitiv dort ist, wovon sie geladen werden soll.
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#4

Re: DLL aus DCU läßt sich nicht laden

  Alt 7. Jul 2008, 18:47
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.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: DLL aus DCU läßt sich nicht laden

  Alt 7. Jul 2008, 18:54
Schau mal mit FileExists, ob die Datei gefunden wird.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
gmc616

Registriert seit: 25. Jun 2004
Ort: Jena
627 Beiträge
 
Delphi 10.3 Rio
 
#6

Re: DLL aus DCU läßt sich nicht laden

  Alt 8. Jul 2008, 11:41
Das Arbeitsverzeichnis setze ich beim App-Start mit chdir (ExtractFilePath(Application.Exename)); auf das Verzeichnis der Exe. Alle Path-Angaben setze ich ExpandFilePath auf absolute Pfade.

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.
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#7

Re: DLL aus DCU läßt sich nicht laden

  Alt 8. Jul 2008, 12:05
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.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.117 Beiträge
 
Delphi 11 Alexandria
 
#8

Re: DLL aus DCU läßt sich nicht laden

  Alt 8. Jul 2008, 12:15
Moin gmc,

Zitat von gmc616:
Das Arbeitsverzeichnis setze ich beim App-Start mit chdir (ExtractFilePath(Application.Exename)); auf das Verzeichnis der Exe.
Auch wenn das jetzt mit Deinem Problem nichts zu tun hat:
Das hilft Dir nichts, wenn im Laufe des Programmes das Arbeitsverzeichnis geändert wird (z.B. durch einen Open-/Savedialog).

Zitat von gmc616:
Alle Path-Angaben setze ich ExpandFilePath auf absolute Pfade.
da wo Du sie benutzt, oder gesammelt beim Programmstart, so dass sich eine spätere Änderung des Arbeitsverzeichnisses nicht mehr auswirkt?

BTW:
Zitat von PSDK - LoadLibrary - Remarks:
The search path can be altered using the SetDllDirectory function. This solution is recommended instead of using SetCurrentDirectory or hard-coding the full path to the DLL.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#9

Re: DLL aus DCU läßt sich nicht laden

  Alt 8. Jul 2008, 12:18
Zitat von Apollonius:
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.
Dann wäre die Fehlermeldung eine andere. Ich bin mir ziemlich sicher, dass die Dstei an einem Ort gesucht wird, wo sie nicht ist. Und ich bin mir ziemlich sicher, das Problem liegt hier:
chdir (ExtractFilePath(Application.Exename)); Du verlässt dich darauf, dass sich das Arbeitsverzeichnis bis zum Aufruf von LoadLibrary nicht ändert - und fliegst mit der Annahme auf die Nase.

Warum überhaupt solche unsicheren Krücken? Warum nicht den richtigen, absoluten Pfad bei LoadLibrary angeben:
LoadLobrary(PChar(ExtractFilePath(Application.Exename) + 'meine.dll'));
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#10

Re: DLL aus DCU läßt sich nicht laden

  Alt 8. Jul 2008, 13:15
So sollte es ziemlich sicher gehen, sofern die Vermutung mit dem falschen Pfad zutrifft:LoadLibrary(PChar(IncludeTrailingPathDelimiter(ExtractFilePath(ParamStr(0))) + 'meine.dll'));
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:02 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz