Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Dynamisches Laden von DLL-Funktion schlägt fehl (https://www.delphipraxis.net/192526-dynamisches-laden-von-dll-funktion-schlaegt-fehl.html)

Relicted 26. Apr 2017 12:06

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:
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';
Meine geänderte Version, welche leider nicht funktioniert. Dll-Handle wird ermittelt, sieht valide aus nur leider wirft das GetProcAddress immer NIL zurück.

Delphi-Quellcode:
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);
Jemand eine Idee?

jaenicke 26. Apr 2017 12:13

AW: Dynamisches Laden von DLL-Funktion schlägt fehl
 
Delphi-Quellcode:
var
  dllHandle : NativeUint = 0;

function GetDllAddress(AFuncName : string) : pointer;
var
 dllHandle : cardinal;
Fällt dir etwas auf?
Welche Variable wird wohl zum Laden der DLL benutzt als Handle? ;-)

Relicted 26. Apr 2017 12:18

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)

himitsu 26. Apr 2017 12:23

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
http://docwiki.embarcadero.com/CodeE...ading_(Delphi)
http://www.delphipraxis.net/171632-d...libraries.html

Relicted 26. Apr 2017 12:41

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:

TiGü 26. Apr 2017 12:56

AW: Dynamisches Laden von DLL-Funktion schlägt fehl
 
Zitat:

Zitat von Relicted (Beitrag 1369159)
Ich frage mich trotzdem immernoch warum es wie oben angegeben nicht klappt :roll:

Delphi-Quellcode:
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;
Einfach mal lesen was der Compiler unten als Warnung rausspuckt:
Code:
[dcc32 Warning] WlanTest.pas(25): W1044 Suspicious typecast of string to PAnsiChar
Warnungen werden nicht zum Spaß produziert!
So wurde jetzt in deiner Unicodeversion (XE8) die Ansiversion von GetProcAddress verwendet und du übergibst aber nen Zeiger auf einen Unicodestring.

himitsu 26. Apr 2017 13:50

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

TiGü 26. Apr 2017 13:57

AW: Dynamisches Laden von DLL-Funktion schlägt fehl
 
Zitat:

Zitat von himitsu (Beitrag 1369166)
Grund: Die doppelte Variable, wie oben schon wer schrieb.

Nö, liegt einzig und allein an dem PAnsiChar mit GetProcAddress.
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.

himitsu 26. Apr 2017 14:23

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 00:15 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