Delphi-PRAXiS
Seite 1 von 2  1 2      

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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:32 Uhr.
Seite 1 von 2  1 2      

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