Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   loadlibrary unter W10 (https://www.delphipraxis.net/202846-loadlibrary-unter-w10.html)

joacim 13. Dez 2019 17:27

loadlibrary unter W10
 
Hallo,

ich muß eine Fremd-DLL unter WIN10 Pro 64Bit per loadLibrary einbinden.
Die DLL wird als 32 Bit und 64 Bit Version zur Verfügung gestellt.
Mit lastError erhalte ich entweder error = 193 (bad EXE format) oder error = 126 (not found).
Die DLL ist vorhanden, das habe ich mit FileExists vorher geprüft und ich verwende
loadLibrary(PChar( DLL-NAME )). Ich vermute die DLL benötigt andere DLLs und wird daher nicht geladen.
Per HEX-Editor sehe ich (u.a.) MSVCP100.DLL. Als Test versuche ich mit loadLibrary MSVCP100.DLL einzeln
zu laden. Das klapp aber auch nicht.

Gibt es ein spezielle Version von MSVCP100 für 64 Bit? Ich bin aus den gefundenen Infos nicht schlau geworden.
Auf meimem PC finde ich diese DLL nur unter C:\windows\system32, auch nachdem ich eine (angeblich) für 64
gedachet Version nachinstalliert habe.

Der schöne Günther 13. Dez 2019 17:33

AW: loadlibrary unter W10
 
Ich glaube das Tool das einem anzeigen konnte was beim Einladen einer DLL falsch läuft hieß "Dependency Walker". Das würde ich mal auf die 32 und 64-Bit-Version loslassen und schauen was der ausspuckt.

joacim 13. Dez 2019 17:39

AW: loadlibrary unter W10
 
.. danke, hab ich schon gemacht. Das Drama dauert schon 4 Tage und ich habe die Details erstmal weggelassen.
Im D.Walker sehe ich auch MSVCP100.DLL. ich verstehe nur nicht, warum ich diese DLL mit LoadLibrary auch nicht laden kann.

DieDolly 13. Dez 2019 17:48

AW: loadlibrary unter W10
 
Zitat:

Im D.Walker sehe ich auch MSVCP100.DLL. ich verstehe nur nicht, warum ich diese DLL mit LoadLibrary auch nicht laden kann.
Installier doch einfach das passende Microsoft Windows Redistributable Package dann musst du nix selber laden.

joacim 13. Dez 2019 17:54

AW: loadlibrary unter W10
 
hab ich gemacht, s.o. aber auf meimem PC finde ich diese DLL nur unter C:\windows\system32

Dalai 13. Dez 2019 17:57

AW: loadlibrary unter W10
 
Zitat:

Zitat von joacim (Beitrag 1453416)
[...] und ich habe die Details erstmal weggelassen.

Das solltest du ändern. Ohne konkrete Informationen kann jeder Helfer nur einen Schuss ins Blaue machen.

Für welche Plattform kompilierst du dein Programm? Win32 oder Win64 (oder beide)? Wo genau liegt die zu ladende DLL? Für den Fall, dass sie im %SystemRoot%\system32 liegt, und du ein Win32-Programm hast: Bist du dir der Filesystem Redirection bewusst, die dann zuschlägt (durch WOW64)? Und nicht zuletzt: Etwas Code kann vielleicht auch nicht schaden.

Grüße
Dalai

hoika 13. Dez 2019 18:00

AW: loadlibrary unter W10
 
Hallo,
Zitat:

Die DLL ist vorhanden, das habe ich mit FileExists vorher geprüft
Das nützt nichts. Der Vorgang des Suchens der Dll ist viel komplizierter.

Ich würde erst mal ein Testprogramm aufsetzen,
wo die fremde Dll im eigenen Verzeichnis liegt.
Dort wird zuerst gesucht.

joacim 13. Dez 2019 18:24

AW: loadlibrary unter W10
 
Liste der Anhänge anzeigen (Anzahl: 1)
ist schon klar, ich wollte erstmal "klein anfangen"
Code:
unit Load_DLL_Test;

interface

uses

  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TfrmTest = class(TForm)
    Memo1: TMemo;
    bt32: TButton;
    bt64: TButton;
    procedure FormActivate(Sender: TObject);
    procedure bt32Click(Sender: TObject);
    procedure bt64Click(Sender: TObject);
  private
  public
    { Public-Deklarationen }
  end;

var
  frmTest: TfrmTest;

implementation


{$R *.dfm}

procedure TfrmTest.FormActivate(Sender: TObject);
begin
  memo1.Lines.Clear;

  memo1.Lines.Add('loadLibrary Test; Version vom 13.12.2019 ');
  memo1.Lines.Add('ADDIPACK DLLs (32/64 bit) müssen in ');
  memo1.Lines.Add('zwei Verzeichnissen ..\DLL32  bzw. ..\DLL64 liegen');
end;

procedure TfrmTest.bt32Click(Sender: TObject);
var
  strName, strHome: string;
  err : integer;
  hndl : THandle;
begin
  memo1.Lines.Add('');
  hndl := 0;
  strHome := ExtractFilePath(Application.ExeName);
  strName := strHome + 'DLL32\ADDIDATA.DLL';
  if FileExists(strName) then
    memo1.Lines.Add('file ' + strName +'  exists')
  else
    showMessage('DLL 64 bit not found');
  hndl := loadLibrary(PCHAR(strName));
  err := GetLastError();
  memo1.Lines.Add('32 bit ' + IntToStr(hndl) + ' last error ' + intToStr(err));
end;

procedure TfrmTest.bt64Click(Sender: TObject);
var
  strName, strHome : string;
  err : integer;
  hndl : THandle;
begin
  memo1.Lines.Add('');
  hndl := 0;
  strHome := ExtractFilePath(Application.ExeName);
  strName := strHome + 'DLL64\ADDIDATA.DLL';
  if FileExists(strName) then
    memo1.Lines.Add('file ' + strName +'  exists')
  else
    showMessage('DLL 64 bit not found');
  hndl := loadLibrary(PCHAR(strName));
  err := GetLastError();
  memo1.Lines.Add('64 bit ' + IntToStr(hndl) + ' last error ' + intToStr(err));
end;

end.
Dei beiden DLLs liegen in zwei Verzeichnissen DLL32 bzw DLL64. Das komplette Projekt ist als ZIP angehängt.
Ich arbeite für WIN10 64bit mit Delphi 6, ja ich weiß das ist alt ...

DieDolly 13. Dez 2019 18:35

AW: loadlibrary unter W10
 
Zitat:

hab ich gemacht, s.o. aber auf meimem PC finde ich diese DLL nur unter C:\windows\system32
Das ist ja auch richtig so. Die DLL muss man nicht selber laden. Lass die einfach da und lade sie nicht manuell.

Wenn die DLL dann noch nicht funktioniert, ist das Problem ein anderes.

Zitat:

Ich arbeite für WIN10 64bit mit Delphi 6, ja ich weiß das ist alt ...
Das ist meiner Meinung nach schon das Problem.
DLL erzeugt mit modernem Delphi und du arbeitest mit einem alten. Das Problem hatte ich umgekehrt schon.

samso 13. Dez 2019 18:46

AW: loadlibrary unter W10
 
Mit Delphi 6 Programmen kannst Du keine 64-Bit-DLL laden.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:50 Uhr.
Seite 1 von 3  1 23      

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