Browse Source

Use GetProcAddress to set GetFinalPathNameByHandle function pointer

Pierre Muller 1 year ago
parent
commit
f510e6f59b
1 changed files with 7 additions and 2 deletions
  1. 7 2
      rtl/win/sysutils.pp

+ 7 - 2
rtl/win/sysutils.pp

@@ -646,7 +646,10 @@ begin
     end;
 end;
 
-function GetFinalPathNameByHandle(aHandle : THandle; Buf : LPSTR; BufSize : DWord; Flags : DWord) : DWORD; external 'kernel32' name 'GetFinalPathNameByHandleA';
+type
+  TGetFinalPathNameByHandle = function(aHandle : THandle; Buf : LPSTR; BufSize : DWord; Flags : DWord) : DWORD;
+var
+  GetFinalPathNameByHandle:TGetFinalPathNameByHandle=nil;
 
 Const
   VOLUME_NAME_NT = $2;
@@ -664,7 +667,7 @@ begin
   FillChar(Buf,MAX_PATH+1,0);
   if Not FileExists(aLink,False) then 
     exit;
-  if not CheckWin32Version(6, 0) then 
+  if not CheckWin32Version(6, 0) or not(assigned(GetFinalPathNameByHandle)) then 
     exit;
   Attrs:=GetFileAttributes(PAnsiChar(aLink));
   if (Attrs=INVALID_FILE_ATTRIBUTES) or ((Attrs and faSymLink)=0) then
@@ -1718,6 +1721,8 @@ begin
   // GetTimeZoneInformationForYear is supported only on Vista and newer
   if (kernel32dll<>0) and (Win32MajorVersion>=6) then
     GetTimeZoneInformationForYear:=TGetTimeZoneInformationForYear(GetProcAddress(kernel32dll,'GetTimeZoneInformationForYear'));
+  if (kernel32dll<>0) then
+    GetFinalPathNameByHandle:=TGetFinalPathNameByHandle(GetProcAddress(kernel32dll,'GetFinalPathNameByHandleA'));
 end;
 
 Function GetAppConfigDir(Global : Boolean) : String;