Einzelnen Beitrag anzeigen

Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: Dynamische DLL Funktion bringt nur Fehler

  Alt 14. Okt 2008, 10:21
Das sollte funktionieren. Bedenke aber, dass diese Funktionen erst ab Windows XP SP1 zur Verfügung stehen.

Einbinden kannst du es so (ich habe noch die GetDLLDirectory angefügt, falls du sie brauchst)
Musst du nur irgendwo vor dem Aufruf der Funktion definieren.
Delphi-Quellcode:
function SetDLLDirectory(lpPathName:PWideChar):Bool; stdcall;
   external kernel32 name 'SetDllDirectoryW';

function GetDLLDirectory(nBufferLength: DWord; lpBuffer:PWideChar):DWord; stdcall;
   external kernel32 name 'GetDllDirectoryW';
Und hier noch die alte AnsiChar-Version:
Delphi-Quellcode:
function SetDLLDirectory(lpPathName:PAnsiChar):Bool; stdcall;
   external kernel32 name 'SetDllDirectoryA';

function GetDLLDirectory(nBufferLength: DWord; lpBuffer:PAnsiChar):DWord; stdcall;
   external kernel32 name 'GetDllDirectoryA';
Das wäre jetzt statisches Einbinden der Funktionen. Falls du jetzt eine zu alte Windows-Version hat, würde dein Programm nicht starten. Das kannst du nur über dynamisches einbinden verhindern. Das geht direkt so:
Delphi-Quellcode:
type TSetDLLDirectory=function(lpPathName:PWideChar):Bool; stdcall;



var SetDLLDirectory:TSetDLLDirectory;
    lib:hmodule;
begin
  lib:=getmodulehandle('kernel32.dll');
  if lib=0 then
    raise Exception.create('kernel32 nicht geladen');

  SetDLLDirectory:=getprocaddress(lib,'SetDllDirectoryW');
  if not assigned(SetDLLDirectory) then
    raise Exception.create('Der Prozedureinsprungpunkt SetDLLDirectoryW wurde nicht gefunden');

  //Aufruf:
  SetDLLDirectory('x:\yz');
Edit: Verhindern kannst du es nicht. Du kannst es nur abfangen
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat