![]() |
Dynamisches Laden von DLL-Funktion schlägt fehl
Hallo zusammen,
stehe gerade etwas auf dem Schlauch. Vielleicht hat ja jemand eine Idee. Ich muss/möchte eine statische Linkung einer DLL auflösen. Leider klappt das nicht so wie gehofft. Hier der Original-Code (funktioniert):
Delphi-Quellcode:
Meine geänderte Version, welche leider nicht funktioniert. Dll-Handle wird ermittelt, sieht valide aus nur leider wirft das GetProcAddress immer NIL zurück.
interface
const wlan_api_dll = 'wlanapi.dll'; function WlanOpenHandle(dwClientVersion: DWORD; pReserved: PVOID; pdwNegotiatedVersion: PWord; phClientHandle: PHandle): DWORD; stdcall; implementation function WlanOpenHandle; external wlan_api_dll name 'WlanOpenHandle';
Delphi-Quellcode:
Jemand eine Idee?
interface
const wlan_api_dll = 'wlanapi.dll'; function WlanOpenHandle(dwClientVersion: DWORD; pReserved: PVOID; pdwNegotiatedVersion: PWord; phClientHandle: PHandle): DWORD; stdcall; implementation var dllHandle : NativeUint = 0; function GetDllAddress(AFuncName : string) : pointer; begin result := nil; if dllHandle <> 0 then begin result := GetProcAddress(dllHandle, PAnsiChar(AFuncName)); end; end; type TWlanOpenHandle = function(dwClientVersion: DWORD; pReserved: PVOID; pdwNegotiatedVersion: PWord; phClientHandle: PHandle): DWORD; stdcall; function WlanOpenHandle(dwClientVersion: DWORD; pReserved: PVOID; pdwNegotiatedVersion: PWord; phClientHandle: PHandle): DWORD; stdcall; var func : TWlanOpenHandle; begin result := 0; @func := GetDllAddress('WlanOpenHandle'); if Assigned(func) then result := func(dwClientVersion, pReserved, pdwNegotiatedVersion, phClientHandle); end; initialization dllHandle := LoadLibrary(wlan_api_dll); finalization if dllHandle <> 0 then FreeLibrary(dllHandle); |
AW: Dynamisches Laden von DLL-Funktion schlägt fehl
Delphi-Quellcode:
Fällt dir etwas auf?
var
dllHandle : NativeUint = 0; function GetDllAddress(AFuncName : string) : pointer; var dllHandle : cardinal; Welche Variable wird wohl zum Laden der DLL benutzt als Handle? ;-) |
AW: Dynamisches Laden von DLL-Funktion schlägt fehl
Jep, hast du recht. War aber nen copy&paste fehler. Auch ohne die lokale Variable bekomme ich keine ProcAddress zurück :(
(hab den Beitrag oben editiert) |
AW: Dynamisches Laden von DLL-Funktion schlägt fehl
Delphi-Quellcode:
const
wlan_api_dll = 'wlanapi.dll'; function WlanOpenHandle(dwClientVersion: DWORD; pReserved: PVOID; pdwNegotiatedVersion: PWord; phClientHandle: PHandle): DWORD; stdcall; external wlan_api_dll delayed; implementation ![]() ![]() |
AW: Dynamisches Laden von DLL-Funktion schlägt fehl
Wunderbar, das hat Abhilfe geschaffen! :thumb: Danke!
Ich frage mich trotzdem immernoch warum es wie oben angegeben nicht klappt :roll: |
AW: Dynamisches Laden von DLL-Funktion schlägt fehl
Zitat:
Delphi-Quellcode:
Einfach mal lesen was der Compiler unten als Warnung rausspuckt:
function GetDllAddress(AFuncName : string) : pointer;
begin result := nil; if dllHandle <> 0 then begin // result := GetProcAddress(dllHandle, PAnsiChar(AFuncName)); result := GetProcAddress(dllHandle, PChar(AFuncName)); end; end;
Code:
Warnungen werden nicht zum Spaß produziert!
[dcc32 Warning] WlanTest.pas(25): W1044 Suspicious typecast of string to PAnsiChar
So wurde jetzt in deiner Unicodeversion (XE8) die Ansiversion von GetProcAddress verwendet und du übergibst aber nen Zeiger auf einen Unicodestring. |
AW: Dynamisches Laden von DLL-Funktion schlägt fehl
Grund: Die doppelte Variable, wie oben schon wer schrieb.
PAnsiChar ist zwar ein doppelter falscher Cast (Unicode>ANSI>Unicode) und stimmt am Ende wieder. (auch wenn es nicht ganz richtig ist) Wenn er zusätzlich noch GetProcAddressA verwendet hätte, dann wäre es total falsch. String, PChar, GetProcAddress oder AnsiString, PAnsiChar, GetProcAddressA oder WideString/UnicodeString, PWideChar, GetProcAddressW |
AW: Dynamisches Laden von DLL-Funktion schlägt fehl
Zitat:
Hast du seinen Quelltextschnipsel mal kompiliert und getestet? Ich hatte schon seine editierte Version von 13:18 Uhr genommen, hier war das doppelte dllHandle schon raus. |
AW: Dynamisches Laden von DLL-Funktion schlägt fehl
Nein, hab ich nicht.
Und ja, ich kenn den Fehler, wobei das ja nur eine Warnung ist. String geht rein, wird durch PAnsiChar gejagt > compiler mecket String > PAnsiChar an > convertiert aber nicht automatisch (es sei den Delphi hat mal wieder was kaputtoptimiert) PAnsiChar wird an einen PChar übergeben > compiler meckert wieder PAnsiChar > PChar > kann das eh nicht aktomatisch konvertieren Unicode rein > ANSI irgendwas, aber ohne Konvertierungen > Unicode an API > passt |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:23 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