mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-09-01 21:40:25 +02:00
LazFileUtils: implement GetShellLinkTarget function.
git-svn-id: trunk@46434 -
This commit is contained in:
parent
398c5e93df
commit
3ebbc96fd0
@ -107,6 +107,9 @@ function GetFileDescription(const AFilename: string): string;
|
|||||||
function ReadAllLinks(const Filename: string;
|
function ReadAllLinks(const Filename: string;
|
||||||
ExceptionOnError: boolean): string; // if a link is broken returns ''
|
ExceptionOnError: boolean): string; // if a link is broken returns ''
|
||||||
function TryReadAllLinks(const Filename: string): string; // if a link is broken returns Filename
|
function TryReadAllLinks(const Filename: string): string; // if a link is broken returns Filename
|
||||||
|
function GetShellLinkTarget(const FileName: string): string;
|
||||||
|
|
||||||
|
|
||||||
type
|
type
|
||||||
TPhysicalFilenameOnError = (pfeException,pfeEmpty,pfeOriginal);
|
TPhysicalFilenameOnError = (pfeException,pfeEmpty,pfeOriginal);
|
||||||
function GetPhysicalFilename(const Filename: string;
|
function GetPhysicalFilename(const Filename: string;
|
||||||
@ -147,7 +150,7 @@ implementation
|
|||||||
// to get more detailed error messages consider the os
|
// to get more detailed error messages consider the os
|
||||||
uses
|
uses
|
||||||
{$IFDEF Windows}
|
{$IFDEF Windows}
|
||||||
Windows {$IFnDEF WinCE}, WinDirs{$ENDIF};
|
Windows {$IFnDEF WinCE}, ShlObj, ActiveX, WinDirs{$ENDIF};
|
||||||
{$ELSE}
|
{$ELSE}
|
||||||
{$IFDEF darwin}
|
{$IFDEF darwin}
|
||||||
MacOSAll,
|
MacOSAll,
|
||||||
|
@ -473,6 +473,10 @@ begin
|
|||||||
raise EInOutError.Create(Format(lrsUnableToCreateConfigDirectoryS,[Dir]));
|
raise EInOutError.Create(Format(lrsUnableToCreateConfigDirectoryS,[Dir]));
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
function GetShellLinkTarget(const FileName: string): string;
|
||||||
|
begin
|
||||||
|
Result := Filename;
|
||||||
|
end;
|
||||||
|
|
||||||
procedure InitLazFileUtils;
|
procedure InitLazFileUtils;
|
||||||
begin
|
begin
|
||||||
|
@ -23,6 +23,8 @@ var
|
|||||||
_RemoveDirUtf8 : function(const Dir: String): Boolean ;
|
_RemoveDirUtf8 : function(const Dir: String): Boolean ;
|
||||||
_GetAppConfigDirUTF8 : function(Global: Boolean; Create: boolean = false): string;
|
_GetAppConfigDirUTF8 : function(Global: Boolean; Create: boolean = false): string;
|
||||||
_GetAppConfigFileUTF8: function(Global: Boolean; SubDir: boolean = false;CreateDir: boolean = false): string;
|
_GetAppConfigFileUTF8: function(Global: Boolean; SubDir: boolean = false;CreateDir: boolean = false): string;
|
||||||
|
_GetShellLinkTarget : function(const FileName: string): string;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -153,6 +155,11 @@ begin
|
|||||||
Result:=Filename;
|
Result:=Filename;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
function GetShellLinkTarget(const FileName: string): string;
|
||||||
|
begin
|
||||||
|
Result := _GetShellLinkTarget(FileName);
|
||||||
|
end;
|
||||||
|
|
||||||
// ******** Start of AnsiString specific implementations ************
|
// ******** Start of AnsiString specific implementations ************
|
||||||
|
|
||||||
{$ifndef WinCE}
|
{$ifndef WinCE}
|
||||||
@ -278,6 +285,35 @@ begin
|
|||||||
raise EInOutError.Create(Format(lrsUnableToCreateConfigDirectoryS,[Dir]));
|
raise EInOutError.Create(Format(lrsUnableToCreateConfigDirectoryS,[Dir]));
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
function GetShellLinkTargetAnsi(const FileName: string): string;
|
||||||
|
var
|
||||||
|
ShellLinkA: IShellLinkA;
|
||||||
|
PersistFile: IPersistFile;
|
||||||
|
WideFileName: WideString;
|
||||||
|
AnsiPath: array [0 .. MAX_PATH] of Char;
|
||||||
|
WinFindData: WIN32_FIND_DATAA;
|
||||||
|
begin
|
||||||
|
Result := FileName;
|
||||||
|
if (LowerCase(ExtractFileExt(FileName)) = '.lnk') then
|
||||||
|
begin
|
||||||
|
if (CoCreateInstance(CLSID_ShellLink, nil, CLSCTX_INPROC_SERVER,
|
||||||
|
IShellLinkA, ShellLinkA) = S_OK) then
|
||||||
|
if (ShellLinkA.QueryInterface(IPersistFile, PersistFile) = S_OK) then
|
||||||
|
begin
|
||||||
|
WideFileName := Utf8ToUtf16(FileName);
|
||||||
|
FillChar(WinFindData{%H-}, SizeOf(WinFindData), 0);
|
||||||
|
if (PersistFile.Load(POleStr(WideFileName), STGM_READ) = S_OK) then
|
||||||
|
begin
|
||||||
|
if (ShellLinkA.GetPath(AnsiPath, Length(AnsiPath),
|
||||||
|
WinFindData, SLGP_UNCPRIORITY) = S_OK) then
|
||||||
|
begin
|
||||||
|
Result := SysToUtf8(AnsiPath); // implicit conversion
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
{$endif WinCE}
|
{$endif WinCE}
|
||||||
|
|
||||||
@ -745,6 +781,40 @@ begin
|
|||||||
raise EInOutError.Create(Format(lrsUnableToCreateConfigDirectoryS,[Dir]));
|
raise EInOutError.Create(Format(lrsUnableToCreateConfigDirectoryS,[Dir]));
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
function GetShellLinkTargetWide(const FileName: string): string;
|
||||||
|
{$IFnDEF WINCE}
|
||||||
|
var
|
||||||
|
ShellLinkW: IShellLinkW;
|
||||||
|
PersistFile: IPersistFile;
|
||||||
|
WideFileName: WideString;
|
||||||
|
WidePath: array [0 .. MAX_PATH] of WideChar;
|
||||||
|
WinFindData: WIN32_FIND_DATAW;
|
||||||
|
{$ENDIF WINCE}
|
||||||
|
begin
|
||||||
|
Result := FileName;
|
||||||
|
{$IFnDEF WINCE}
|
||||||
|
if (LowerCase(ExtractFileExt(FileName)) = '.lnk') then
|
||||||
|
begin
|
||||||
|
if (CoCreateInstance(CLSID_ShellLink, nil, CLSCTX_INPROC_SERVER,
|
||||||
|
IShellLinkW, ShellLinkW) = S_OK) then
|
||||||
|
if (ShellLinkW.QueryInterface(IPersistFile, PersistFile) = S_OK) then
|
||||||
|
begin
|
||||||
|
WideFileName := Utf8ToUtf16(FileName);
|
||||||
|
FillChar(WinFindData{%H-}, SizeOf(WinFindData), 0);
|
||||||
|
if (PersistFile.Load(POleStr(WideFileName), STGM_READ) = S_OK) then
|
||||||
|
begin
|
||||||
|
if (ShellLinkW.GetPath(WidePath, Length(WidePath),
|
||||||
|
@WinFindData, SLGP_UNCPRIORITY) = S_OK) then
|
||||||
|
begin
|
||||||
|
Result := Utf16toUtf8(WidePath); // implicit conversion
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
{$ENDIF WINCE}
|
||||||
|
end;
|
||||||
|
|
||||||
// ******** End of WideString specific implementations ************
|
// ******** End of WideString specific implementations ************
|
||||||
|
|
||||||
|
|
||||||
@ -1064,6 +1134,7 @@ begin
|
|||||||
_FindNextUtf8 := @FindNextAnsi;
|
_FindNextUtf8 := @FindNextAnsi;
|
||||||
_GetAppConfigDirUtf8 := @GetAppConfigDirAnsi;
|
_GetAppConfigDirUtf8 := @GetAppConfigDirAnsi;
|
||||||
_GetAppConfigFileUtf8 := @GetAppConfigFileAnsi;
|
_GetAppConfigFileUtf8 := @GetAppConfigFileAnsi;
|
||||||
|
_GetShellLinkTarget := @GetShellLinkTargetAnsi;
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
{$endif}
|
{$endif}
|
||||||
@ -1086,6 +1157,7 @@ begin
|
|||||||
_FindNextUtf8 := @FindNextWide;
|
_FindNextUtf8 := @FindNextWide;
|
||||||
_GetAppConfigDirUtf8 := @GetAppConfigDirWide;
|
_GetAppConfigDirUtf8 := @GetAppConfigDirWide;
|
||||||
_GetAppConfigFileUtf8 := @GetAppConfigFileWide;
|
_GetAppConfigFileUtf8 := @GetAppConfigFileWide;
|
||||||
|
_GetShellLinkTarget := @GetShellLinkTargetWide;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user