function gfnsFileExtGet(sFile:
WideString):
WideString;
{
Unicode対応ExtractFileExt。
'.'は返る。
}
var
i: Integer;
begin
Result := '';
for i := Length(sFile)
downto 1
do begin
if (sFile[i] = '\')
or (sFile[i] = '/')
or (sFile[i] = ':')
then begin
// 拡張子なし。
Break;
end else if (sFile[i] = '.')
then begin;
// 拡張子あり。
Result := Copy(sFile, i, MaxInt);
Break;
end;
end;
end;
function gfnsLinkToFile(sLink:
WideString):
WideString;
// ショートカットファイルのリンク先ファイル名を返す。
var
lI_ShellLink: IShellLinkW;
lI_PersistFile: IPersistFile;
l_Win32FindData: TWin32FindDataW;
lp_Buff: PWideChar;
begin
if (WideLowerCase(
gfnsFileExtGet(sLink)) = '.lnk')
then begin
// ショートカットファイルだった。
lI_ShellLink := (CreateComObject(CLSID_ShellLink)
as IShellLinkW);
lI_PersistFile := (lI_ShellLink
as IPersistFile);
if (Succeeded(lI_PerSistFile.Load(PWideChar(sLink), STGM_READ)))
then begin
lI_ShellLink.Resolve(0, SLR_ANY_MATCH);
lp_Buff := AllocMem((MAX_PATH + 1) * 2);
try
// ショートカットファイルの参照先を取得。
lI_ShellLink.GetPath(lp_Buff, MAX_PATH, l_Win32FindData, SLGP_UNCPRIORITY);
Result :=
WideString(lp_Buff);
finally
FreeMem(lp_Buff);
end;
end else begin
// 失敗。
Result := sLink;
end;
end else begin
Result := sLink;
end;
end;