Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi DLL Laden Win10 x64 - XE7 <-> Delphi 10.1 Berlin (https://www.delphipraxis.net/191330-dll-laden-win10-x64-xe7-delphi-10-1-berlin.html)

AJ_Oldendorf 3. Jan 2017 12:52


DLL Laden Win10 x64 - XE7 <-> Delphi 10.1 Berlin
 
Hallo,
ich habe ein kleines Problem und ich denke das ist nur irgendeine Einstellung im OS, komme aber nicht drauf.

Folgender Code geht in meiner XE7 Umgebung (Win10 x64):
Delphi-Quellcode:
var
  myDllHandle: HMODULE;
  sFilePath: String;
begin
  sFilePath := 'C:\WINDOWS\system32\myTest.dll';

  if FileExists(sFilePath) then
  begin
    myDllHandle := SafeLoadLibrary(sFilePath);
    if myDllHandle <> 0 then
    begin
      ShowMessage('Laden erfolgreich');
    end;
  end;
Der gleiche Code in meiner Delphi 10.1 Umgebung geht nicht.
FileExists liefert noch True aber in myDllHandle steht dann eine 0.
Die Dll ist definitiv da und ist in beiden Umgebungen die gleiche.
Diese liegt eigentlich im SysWow64 aber das wird dann ja umgeswitcht in System32.
Also im System32 liegt direkt KEINE Dll von mir.

Habt ihr spontan eine Idee?

himitsu 3. Jan 2017 14:24

AW: DLL Laden Win10 x64 - XE7 <-> Delphi 10.1 Berlin
 
Delphi-Quellcode:
myDllHandle := {SafeLoadLibrary}LoadLibrary(sFilePath); // falls SafeLoadLibrary das GetLastError beeinflusst, weil dort nach dem LoadLibrary noch andere APIs aufgerufen werden
if myDllHandle <> 0 then
  ShowMessage('Laden erfolgreich')
else
  RaiseLastOSError;
Aber wenn diese Datei sowieso im System-Verzeichnis liegt, würde ich niemals den Pfad mit angeben.

Der schöne Günther 3. Jan 2017 14:27

AW: DLL Laden Win10 x64 - XE7 <-> Delphi 10.1 Berlin
 
Sind es die gleichen .dproj-Dateien? Startest du aus der IDE oder die .exe direkt aus dem Explorer?

Mir fällt nur ein dass man in der IDE ja bspw. die Umgebungsvariablen standardmäßig abgeändert sind...


Ich kenne SafeLoadLibrary jetzt nicht, was ist denn wenn du ganz normal LoadLibrary(..) nimmst und danach, wenn es fehlschlägt, schaust was
Delphi-Quellcode:
RaiseLastOsError()
zurückgibt?

(Wurde schon erwähnt)

AJ_Oldendorf 3. Jan 2017 14:36

AW: DLL Laden Win10 x64 - XE7 <-> Delphi 10.1 Berlin
 
Habe es so versucht:
Delphi-Quellcode:
LoadLibrary(@sFilePath); //SafeLoadLibrary(sFilePath);
GetLastError:
ERROR_MOD_NOT_FOUND
126 (0x7E)
The specified module could not be found.

Habe die gleiche Exe Datei jeweils getestet ohne Delphi IDE

bnreimer42 3. Jan 2017 14:37

AW: DLL Laden Win10 x64 - XE7 <-> Delphi 10.1 Berlin
 
Eventuell eine doofe Frage, aber ist die DLL eine 64 Bit DLL und das Target in Delphi 10 auch?
Also passt die "bittness" zusammen?

AJ_Oldendorf 3. Jan 2017 14:38

AW: DLL Laden Win10 x64 - XE7 <-> Delphi 10.1 Berlin
 
Auch ohne komplette Pfadangabe und mit LoadLibrary kommt ErrorCode 126

AJ_Oldendorf 3. Jan 2017 14:39

AW: DLL Laden Win10 x64 - XE7 <-> Delphi 10.1 Berlin
 
Target ist immer 32 bit, immer die gleiche Exe (compiliere zwischendurch NICHT neu, sondern kopiere nur die Exe von A nach B).
DLL ist 32bit
OS ist 64bit

Der schöne Günther 3. Jan 2017 14:43

AW: DLL Laden Win10 x64 - XE7 <-> Delphi 10.1 Berlin
 
Die Suchmaschine meines Vertrauens zu "ERROR_MOD_NOT_FOUND" brachte das hier hervor:

http://flashexperiments.insh-allah.c...eError126.html

Hört sich eigentlich plausibel an: Deine DLL ist noch von anderen DLLs abhängig - Und die fehlen.

bra 3. Jan 2017 14:44

AW: DLL Laden Win10 x64 - XE7 <-> Delphi 10.1 Berlin
 
Vielleicht ein Berechtigungsproblem? Was passiert, wenn die Exe als Admin ausgeführt wird? Wirklich explizit Rechtsklick -> Als Administrator ausführen.

bnreimer42 3. Jan 2017 14:50

AW: DLL Laden Win10 x64 - XE7 <-> Delphi 10.1 Berlin
 
Zitat:

Zitat von AJ_Oldendorf (Beitrag 1357941)
Target ist immer 32 bit, immer die gleiche Exe (compiliere zwischendurch NICHT neu, sondern kopiere nur die Exe von A nach B).
DLL ist 32bit
OS ist 64bit

Dann ist aber der Pfad C:\WINDOWS\system32 eventuell nicht korrekt. Unter einem 64 Bit System sucht er die 32 Bit DLLs eigentlich unter C:\Windows\SysWOW64. Im 32 Bit Prozess ist dieser Pfad dann "virtuell" über C:\WINDOWS\system32 erreichbar.

Im 64Bit Explorer also Datei unter C:\Windows\SysWOW64 ablegen!

Das ist die komische Magie von Microsoft bei 64 Bit Systemen.

AJ_Oldendorf 3. Jan 2017 15:03

AW: DLL Laden Win10 x64 - XE7 <-> Delphi 10.1 Berlin
 
@bnreimer42: Siehe Post 1
Diese liegt eigentlich im SysWow64 aber das wird dann ja umgeswitcht in System32.
Also im System32 liegt direkt KEINE Dll von mir.

@bra:
Brachte auch keine Besserung

@Der schöne Günther:
Weißt du, wie man rausbekommen kann, welche DLL noch fehlt? Die DLL ist leider nicht von mir, habe also kein QT
Gucke grad bei deinem Link, ob ich mit dem DependencyWalker weiter komme

Der schöne Günther 3. Jan 2017 15:06

AW: DLL Laden Win10 x64 - XE7 <-> Delphi 10.1 Berlin
 
Wenn ich es richtig in Erinnerung habe dann schaut sich der Dependency Walker nur die DLLs an welche statisch eingebunden werden. Das reicht hoffentlich aus.

Wenn die DLL in ihrer Initialisierung dynamisch irgendwelche DLLs lädt, dann bekommt man das wohl nur mit dem Debugger zur Laufzeit raus (denke ich). Windows-Guru Raymond Chen empfiehlt dafür das hier.

Uwe Raabe 3. Jan 2017 15:24

AW: DLL Laden Win10 x64 - XE7 <-> Delphi 10.1 Berlin
 
Das Ereignisprotokoll der IDE sollte auch alle in den Prozess geladenenen DLLs auflisten.

AJ_Oldendorf 3. Jan 2017 15:37

AW: DLL Laden Win10 x64 - XE7 <-> Delphi 10.1 Berlin
 
Muss man dann jede einzelne DLL im System suchen oder gibts eine Möglichkeit sich anzeigen zu lassen, welche nicht gefunden wurde?

Anscheind geht das mit dem Ereignisprotokoll nicht, da da nicht mal der Aufruf meiner DLL drinne auftaucht, die ich gerne Laden möchte.
Also sehe ich auch nichts, was diese evtl. benötigt

Der schöne Günther 3. Jan 2017 15:40

AW: DLL Laden Win10 x64 - XE7 <-> Delphi 10.1 Berlin
 
In der IDE sieht man welche erfolgreich geladen wurden. Inwiefern einem das weiterhilft habe ich allerdings auch nicht verstanden :|

Wenn ich ein
Delphi-Quellcode:
LoadLibrary('thisFileDoesNotExist.dll');
mache steht in der IDE davon nichts...

Uwe Raabe 3. Jan 2017 15:50

AW: DLL Laden Win10 x64 - XE7 <-> Delphi 10.1 Berlin
 
Zitat:

Zitat von AJ_Oldendorf (Beitrag 1357954)
Anscheind geht das mit dem Ereignisprotokoll nicht, da da nicht mal der Aufruf meiner DLL drinne auftaucht, die ich gerne Laden möchte.

Ich hatte das so verstanden, daß der Code ja wohl funktioniert (siehe #1):

Zitat:

Zitat von AJ_Oldendorf (Beitrag 1357917)
Folgender Code geht in meiner XE7 Umgebung (Win10 x64):

Siehst du dort deine DLL denn auch nicht?

AJ_Oldendorf 3. Jan 2017 15:54

AW: DLL Laden Win10 x64 - XE7 <-> Delphi 10.1 Berlin
 
Mist, in der XE7 Umgebung habe ich gar nicht geguckt. Sorry mein Fehler. Prüfe ich

AJ_Oldendorf 3. Jan 2017 16:01

AW: DLL Laden Win10 x64 - XE7 <-> Delphi 10.1 Berlin
 
Also im Ereignisprotokoll werden jede Menge Dlls geladen.
Ich habe ab der Zeile, wo ich "meine" Dll lade, alle Dlls geprüft auf der 10.1 Umgebung sind diese alle im SysWow64 Ordner vorhanden.
Hat leider nicht weitergeholfen

AJ_Oldendorf 3. Jan 2017 16:08

AW: DLL Laden Win10 x64 - XE7 <-> Delphi 10.1 Berlin
 
Übrigens, in meiner XE7 Umgebung geht es nur, wenn ich wie ursprünglich geschrieben "SafeLoadLibrary" nehme anstatt "LoadLibrary". Wenn ich nur "LoadLibrary" nehme, bekomme ich in der XE7 Umgebung auch Fehler 126.

AJ_Oldendorf 3. Jan 2017 16:46

AW: DLL Laden Win10 x64 - XE7 <-> Delphi 10.1 Berlin
 
Ich habs gefunden....
Da hatte doch noch eine DLL gefehlt:
msvcr100.dll
Habe jetzt Microsoft Visual C++ 2010 Redistributable Package installiert und schwupps, gehts.

Danke für eure Mithilfe.

PS: Bei mir geht aber nach wie vor der Aufruf von LoadLibrary in beiden Umgebungen nicht sondern nur der Aufruf von SafeLoadLibrary.


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:11 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