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.