![]() |
loadlibrary problem
ich habe eine anwendung die sich aus einem unterverzeichnis dll-dateien sucht und siese dynamisch lädt.
nun habe ich bei 2 dll´s das problem, dass ich sie nicht laden kann. alle anderen (um die 20 dlls) kann ich einwandfrei laden. ich bekomme bei den 2 betroffenen bibliotheken jedes mal die fehlermeldung: "EApplication Error: ein anwendungsobjekt kann nicht in einem shared object erzeugt werden." das lustige an dem fehler ist die tatsache, dass alle projekte nach dem gleichen muster gestrickt sind. und nur bei 2en machts BÄNG. der fehler tritt genau beim befehl:
Delphi-Quellcode:
frage nun: warum kann ich 20 dlls importieren aber 2 nicht.try dllid := LoadLibrary(PChar(filename)); except MessageBox(0,'Beim Einlesen einer Bibliothek kam es zu einem Fehler!', '', MB_ICONQUESTION or MB_OK); result:=0; end; kann es irgendwie am dllentrypoint liegen? |
Re: loadlibrary problem
Wie sieht die Dll aus? Gibt es einen Unterschied zwichen den 2 und den restlichen?
|
Re: loadlibrary problem
Zitat:
beinhaltet ne form und wird über ne function exportiert |
Re: loadlibrary problem
Erzeugst du die Form vollkommen unabhänig vom Hauptprogramm oder benutzt du irgendwas aus dem Hauptprogramm?
|
Re: loadlibrary problem
Windows API Funktionen werfen keine Exception, wenn sie fehlschlagen, sondern geben meist einen Fehlercode zurück, den man auswerten kann, um festzustellen, warum die Funktion fehlgeschlagen ist:
Delphi-Quellcode:
hLib := LoadLibrary(...);
if hLib = 0 then begin s := SysErrorMessage(GetLastError()); ShowMessage(s); end; |
Re: loadlibrary problem
@ste_ett:
ich nutze nichts aus dem hauptprogramm, jedes form hat sein eigenes datenmodul auf das es zugreift. @Luckie: errormessage: "eine dll initialisierungsroutine ist fehlgeschlagen" ich bin genauso schlau (oder auch nicht) wie vorher :( |
Re: loadlibrary problem
Mit anderen Worten: Der Code im Initialization Teil bzw. zwischen Begin/End. in der DLL bzw. die Procedure die du in diesem Teil der DLLProc Variablen zugewiesen hast, gibt einen Fehler zurück.
Andere Möglichkeit: Die DLL benötigt eine statisch gelinkte andere DLL, welche sie nicht finden kann. Du kannst die statischen Abhängigkeiten von anderen DLL's einfach über das mitgelieferte TDump Tool von Borland rausfinden. Dieses findest du im Normalfall im BIN Ordner deiner Delphi Installation. Das Tool benötigt die DLL als Parameter und gibt dir die Informationen zu der DLL aus (z.b. in Datei umleiten zum lesen). Unter "Imports" werden alle von fremden DLLs statisch gelinkte Funktionen aufgelistet und in welcher DLL sie sein sollten. |
Re: loadlibrary problem
Weitere Möglichkeit zum Anschauen der DLLs:
![]() Der zeigt Dir dann auch gleich welche DLLs von wo aus angezogen werden, sehr nützlich bei Versionskonflikten. Listet ausserdem auch alle jeweils ex- und importierten Funktionen an. |
Re: loadlibrary problem
Zitat:
EDIT: @oldgrumpy: danke für den tipp, das tool habe ich bereits ;) |
Re: loadlibrary problem
Alternativ kannste mir eine der DLLs auch mal zugänglich machen, dann schau ich mal rein, wo das Ding auf die Nase fällt. Btw, GAR KEINE Imports? Das wäre aber doch schon etwas ungewöhnlich :) Unter w2k ist dem OS-Loader so ein Executable z.B. so suspekt dass das Laden verweigert wird :) (Genauer: In den Imports muss eine Systemkomponente auftauchen, ich bin mir gerade nicht sicher obs user32.dll oder kernel32.dll war, müsste ich mal nachschauen)
|
Re: loadlibrary problem
Zitat:
|
Re: loadlibrary problem
Das geht schon sehr gut, diverse Exe-Packer und -Crypter, usw. arbeiten z.B. nach dem Prinzip, die haben keine Importtable im PE-Image sondern generieren die zur Laufzeit dynamisch. Und ab XP aufwärts kann ich sehr wohl wieder eine Exe haben die gar keine statischen Imports hat... Nur bei W2K ist der Loader so penibel.
|
Re: loadlibrary problem
Zitat:
|
Re: loadlibrary problem
Liste der Anhänge anzeigen (Anzahl: 1)
Anbei die vermutlich kleinste Exe der Welt ;) Ohne Import der kernel32.dll - und unter W2k (SP4 getestet) geht sie nicht, weil der Loader "user32.dll" bei den Imports zwingend erwartet, das "user32" reicht nicht aus. Unter XP kein Problem :)
|
Re: loadlibrary problem
Zitat:
Es mag die kleinste EXE-Datei sein, aber nicht die kleinste PE-Datei. Sie ist nämlich ohnehin ungültig - daß sie funzt hat sie wohl exakt dieser Eigenschaft zu verdanken. |
Re: loadlibrary problem
Warum ist sie ungültig? Wäre sie das, müsste sie ja vom Loader abgelehnt werden ;)
|
Re: loadlibrary problem
In einer der beiden DLLs dürfe wohl unter USES... eine Unit auftauchen, die für das bLOCKierEN verantwortlich sein dürfte.
Roland |
Re: loadlibrary problem
Zitat:
Zitat:
Übrigens, der W2K-PE-Loader lädt solche Dateien generell nicht. Da du ja nun offensichtlich aus Deduktion Schlüsse ziehst, ist mein Schluß - nach Deduktion - daß der Loader die Datei ablehnt. :stupid: |
Re: loadlibrary problem
folgende strukturelle frage:
ich habe ein funktionsmodul und ein datenmodul welches in der defekten dll ist. das funktionsmodul benutzt (uses) das datenmodul. das ist der einzige unterschied zu allen anderen dlls (die haben nur datenmodule, da nicht so massig viele funktionen benötigt werden). sieht dann ungefähr so aus: DLL-Form >>funktionen>>daten >>I/O-Form(Reports)>>Reportdaten darf ich die abhängigkeiten der module nicht so sehr auftröseln? kann ich mir garnicht vorstellen... ich bekomm noch nen mittelschweren anfall :( @old-grumpy: hat sich was mit meinen gesendeten dateien was ergeben? |
Re: loadlibrary problem
Ein wenig mehr Code (z.B. die "DllMain") könnte u.U. helfen das Problem zu identifizieren.
|
Re: loadlibrary problem
fehler identifiziert:
im uses teil war QGRAPHICS eingebunden, diese verursachte den fehler... thema gegessen! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:09 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