Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   LoadLibrary() unter D11 ist THandle immer 0 (https://www.delphipraxis.net/213011-loadlibrary-unter-d11-ist-thandle-immer-0-a.html)

Steffer 7. Mai 2023 18:11

LoadLibrary() unter D11 ist THandle immer 0
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi,

bei einer Umstellung auf D11 stelle ich fest das eine eine benötigte DLL nicht laden kann. Handle ist immer 0.
Es geht nicht um die weitere Verarbeitung sondern nur um das Laden der DLL.

Handle:= LoadLibrary('mydll.dll');

Die DLL ist mit D7 erstellt und beinhaltet nur eine Function von 7 Zeilen.
Sharemem ist da noch die erste uses.
Eine vollkommene harmlose Geschichte.

Habe eine Testanwendung erstellt um diese und andere DLLs via LoadLibrary() zu laden.
Auch ganz einfache Geschichte: RadioGroup mit mehreren Optionen und einem Button und 2 Labels als Ausgabe
ob die DLL gefunden wird und ob Handle <> 0 ist.

Diese Testanwendung unter D7, XE und D11 erstellt.
D7 und XE können die DLL laden.
D11 nicht. Hier kommt Errorcode 1114, siehe Anlage.

Das Problem bleibt bestehen:
Wenn ich das ganze auf mehreren Rechnern teste.
Auch wenn in diese Testexe Sharemem als erste uses integriert wird.
Wenn die DLL im Verzeichnis der Testexe liegt oder mit einem Pfad gesucht wird.

Hat jemand dazu einen Ansatz?

TiGü 10. Mai 2023 08:43

AW: LoadLibrary() unter D11 ist THandle immer 0
 
Lädt die DLL noch andere Abhängigkeiten (BPLs, DLLs)?

Andreas13 10. Mai 2023 08:48

AW: LoadLibrary() unter D11 ist THandle immer 0
 
Vielleicht liegt es daran, daß System.ShareMem, die Datei borlndmm.dll benötigt und letztere nicht gefunden wird?

jaenicke 10. Mai 2023 08:54

AW: LoadLibrary() unter D11 ist THandle immer 0
 
Du solltest einmal mit dem Process Monitor schauen, ob da versucht wird, auf etwas anderes zuzugreifen, z.B. wie schon genannt auf eine andere DLL. Dafür setzt du dort einfach den Filter auf Process Name is DeineExe.exe und lässt die Fehlermeldung offen. Dann kannst du die letzten Meldungen prüfen.

Zitat:

Zitat von Steffer (Beitrag 1522148)
Sharemem ist da noch die erste uses.
Eine vollkommene harmlose Geschichte.

Sharemem würde ich nicht als harmlos bezeichnen, sondern als Notlösung.

hoika 10. Mai 2023 09:10

AW: LoadLibrary() unter D11 ist THandle immer 0
 
Hallo,
die D11-Anwendung ist nicht zufällig 64-Bit?

Was liefert LastError?
siehe hier
https://stackoverflow.com/questions/...does-this-mean

Steffer 10. Mai 2023 18:25

AW: LoadLibrary() unter D11 ist THandle immer 0
 
Danke für die Antworten.

Zitat:

Zitat von TiGü (Beitrag 1522212)
Lädt die DLL noch andere Abhängigkeiten (BPLs, DLLs)?

Nein, nichts.


Zitat:

Zitat von Andreas13 (Beitrag 1522213)
Vielleicht liegt es daran, daß System.ShareMem, die Datei borlndmm.dll benötigt und letztere nicht gefunden wird?

borlndmm.dll liegt in C:\Windows\SysWOW64 und würde ja dann auch beim Test mit D7, XE Probleme machen.


Zitat:

Zitat von jaenicke (Beitrag 1522215)
Du solltest einmal mit dem Process Monitor schauen, ob da versucht wird, auf etwas anderes zuzugreifen, ...

Da ist nichts.
Die Exe hat ein kleines Form mit

uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls;

Die DLL
uses
Sharemem,
SysUtils,
Classes,

Und mit D7 und XE eben keine Probleme.


Zitat:

Zitat von hoika (Beitrag 1522217)
Hallo,
die D11-Anwendung ist nicht zufällig 64-Bit?

Was liefert LastError?
siehe hier
https://stackoverflow.com/questions/...does-this-mean

Die 64-Bit Geschichte war auch so über Nacht mein Gedanke, ist aber nicht.

Last Error ist "Eine DLL-Initalisierungsroutine ist fehlgeschlagen".
Nur wird keine Initialisierung verwendet.

dummzeuch 10. Mai 2023 18:33

AW: LoadLibrary() unter D11 ist THandle immer 0
 
Mal so in die Runde geworfen: Ist denn Sharemem von Delphi 7 (DLL) und Delphi 11 (Executable) überhaupt kompatibel? Ersteres benutzt die borlndmm.dll letzteres FastMM ohne DLL.

Ich habe noch nie versucht, diese beiden Versionen zu kombinieren.

himitsu 10. Mai 2023 19:05

AW: LoadLibrary() unter D11 ist THandle immer 0
 
EXE und DLL jeweils mit dem "selben" Delphi kompiliert?


Ja, erstmal sollte jemand natürlich alle Rückgaben von LoadLibrary auswerten.
Eine Exception beim Laden der DLL seint es nicht zu sein, aber GetLastError/RaiseLastOSError werden bestimmt irgendwas sagen.



ShareMem und SimpleShareMem (weiß nicht mehr seit wann es das gab) gibt es weiterhin.
Und es müsste auch egal sein ob FastMM oder BorlandMM/DelphiMM. Die Schnittstelle des ShareMem hat sich ja praktisch nicht geändert (glaub ich).

* ShareMem (benötigt BorlndMM.dll)

* SimpleShareMem (nutzt intern AttemptToUseSharedMemoryManager/ShareMemoryManager und verwendet den Speichermanager des zuerst geladenen Moduls EXE/DLL/BPL)



Aber zusätzlich kommt noch. Wozu das ShareMem?
Du willst doch nicht etwa Delphi-Strings oder Objekte mit der DLL teilen?
Im Delphi 2009 wurde die interne Struktur der LongStrings (vor allem AnsiString) verändert. (und ein/zwei Jahre danach nochmal ein bissl)



Nja, natürlich könnte man auch mal die DLL debuggen. (am Einfachsten im Delphi 7, aber rudimentär ginge es auch im neuen Delphi, wenn man Assembler mag)

Steffer 10. Mai 2023 20:04

AW: LoadLibrary() unter D11 ist THandle immer 0
 
Zitat:

Zitat von dummzeuch (Beitrag 1522255)
Mal so in die Runde geworfen: Ist denn Sharemem von Delphi 7 (DLL) und Delphi 11 (Executable) überhaupt kompatibel? Ersteres benutzt die borlndmm.dll letzteres FastMM ohne DLL.

Ich habe noch nie versucht, diese beiden Versionen zu kombinieren.

Danke. Das ist für mal so "geworfen" wenigstens ein Ansatz. Job für morgen.
Die DLL D7 ist ja so fertig und ich schaue mal ob dann D11 beim dynamischen / statischen laden mit der Sharemem ein Problem hat.


Zitat:

Zitat von himitsu (Beitrag 1522256)
EXE und DLL jeweils mit dem "selben" Delphi kompiliert?


Ja, erstmal sollte jemand natürlich alle Rückgaben von LoadLibrary auswerten.
...


... Die Schnittstelle des ShareMem hat sich ja praktisch nicht geändert (glaub ich).

Aber zusätzlich kommt noch. Wozu das ShareMem?

Rückgabe loadLibrary siehe oben.

An der ShareMem hat sich einiges geändert. Dachte auch es wäre eine Leiche die durchgeschleppt wird.

Wozu Sharemem ist keine Frage weil einfach vorhanden.
Und es geht nicht um Rückgaben etc. sondern einfach nur um LoadLibrary

hoika 11. Mai 2023 05:56

AW: LoadLibrary() unter D11 ist THandle immer 0
 
Hallo,
wird ShareMem überhaupt gebraucht?

Wie sieht das Interface der DLL aus?
Vielleicht was mit Unicode?

jaenicke 11. Mai 2023 08:12

AW: LoadLibrary() unter D11 ist THandle immer 0
 
Zitat:

Zitat von Steffer (Beitrag 1522257)
Wozu Sharemem ist keine Frage weil einfach vorhanden.

Mein erster Gedanke war auch, ob das eigentlich kompatibel sein kann, aber da es unter XE noch ging, bin ich wieder davon abgekommen, weil ich es nie verwendet habe und keine Ahnung habe, wie das läuft.

Wenn du dir aber nicht sicher bist, ob es gebraucht wird, kann es natürlich unter XE noch funktioniert haben, weil es schlicht überflüssig ist. Insofern wäre es schon wichtig, dir die exportierte Funktion diesbezüglich anzuschauen. Wenn die exportierte Funktion sauber umgesetzt ist, sprich nur WideString oder PAnsiChar/PWideChar usw. und keine Delphi-Strings verwendet werden, braucht man Sharemem auch nicht.

Entferne Sharemem doch einfach mal aus der uses. Wenn es daran liegt, kannst du die DLL auf jeden Fall korrekt laden. Es gibt dann zwar ggf. später Fehler, aber zum Testen kannst du es ja ohne versuchen.

Steffer 11. Mai 2023 19:53

AW: LoadLibrary() unter D11 ist THandle immer 0
 
An alle die sich hier Gedanken gemacht haben vielen Dank.

Zitat:

Zitat von hoika (Beitrag 1522269)
Hallo,
wird ShareMem überhaupt gebraucht?

Wie sieht das Interface der DLL aus?
Vielleicht was mit Unicode?

Alles prallt da bei mir ab da der Aufruf aus D7 XE funktioniert.
Und LoadLibraray() ist ja keine Zirkusnummer.

Zitat:

Zitat von jaenicke (Beitrag 1522273)
Zitat:

Zitat von Steffer (Beitrag 1522257)
Wozu Sharemem ist keine Frage weil einfach vorhanden.

Mein erster Gedanke war auch, ob das eigentlich kompatibel sein kann, aber da es unter XE noch ging, bin ich wieder davon abgekommen, weil ich es nie verwendet habe und keine Ahnung habe, wie das läuft.

Wenn du dir aber nicht sicher bist, ob es gebraucht wird, kann es natürlich unter XE noch funktioniert haben, weil es schlicht überflüssig ist. Insofern wäre es schon wichtig, dir die exportierte Funktion diesbezüglich anzuschauen. Wenn die exportierte Funktion sauber umgesetzt ist, sprich nur WideString oder PAnsiChar/PWideChar usw. und keine Delphi-Strings verwendet werden, braucht man Sharemem auch nicht.

Entferne Sharemem doch einfach mal aus der uses. Wenn es daran liegt, kannst du die DLL auf jeden Fall korrekt laden. Es gibt dann zwar ggf. später Fehler, aber zum Testen kannst du es ja ohne versuchen.

Die Verwendung der DLL ist im Prinzip 20 Jahre alt. Diese beinhaltet Anwenderdaten zur Lizenzierung. Die DLL wird in einem Ablauf erstellt. Da hat die Sharemem niemanden interessiert. Die steht da drin, auch wenn sie überholt ist.

Das die mir jetzt bei D11 und Loadlibrary() auf die Füße fällt hätte ich nicht erwartet.
Es ist wie es ist.

Ich mache daraus jetzt keine Doktorarbeit. Habe heute x Stunden mit x Versionen experimentiert.
Diese alten DLLs werden durch neue DLLs auf Basis D11 ersetzt.
Ist umständlicher aber die sichere Lösung ohne Basteln etc.

Nochmals vielen Dank an alle die mitgedacht haben.

Wenn jemand Bock auf den Ansatz hat schicke ich gerne den Source zu der DLL aus D7.

jaenicke 16. Mai 2023 12:02

AW: LoadLibrary() unter D11 ist THandle immer 0
 
Zitat:

Zitat von Steffer (Beitrag 1522316)
Wenn jemand Bock auf den Ansatz hat schicke ich gerne den Source zu der DLL aus D7.

Ich würde es gerne kurz ausprobieren, wenn das so überschaubar ist. Ich bräuchte dazu dann auch den Teil der Unit aus Delphi 11, mit dem du die DLL einbindest.

Steffer 17. Mai 2023 18:31

AW: LoadLibrary() unter D11 ist THandle immer 0
 
Zitat:

Zitat von jaenicke (Beitrag 1522486)
Ich würde es gerne kurz ausprobieren, wenn das so überschaubar ist. Ich bräuchte dazu dann auch den Teil der Unit aus Delphi 11, mit dem du die DLL einbindest.

Gerne.
Ist absolut überschaubar.
Du bekommst Source und kompilierte DLL aus D7 sowie die Testanwendung als Source und kompiliert in einem Zip.
Kann ich dir das als persönliche Nachricht senden oder muss ich es hier al Anlage senden?
Habe hier keine Erfahrung im Umgang.

jaenicke 17. Mai 2023 20:37

AW: LoadLibrary() unter D11 ist THandle immer 0
 
Ich habe dir eine private Nachricht geschickt.


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