computer - windows 10 all shortcut keys



इनो सेटअप में शॉर्टकट की उपस्थिति की जांच करें (1)

मेरे Inno सेटअप इंस्टॉलर में मुझे यह सुनिश्चित करने की आवश्यकता है कि किसी फ़ाइल के लिए एक शॉर्टकट किसी फ़ोल्डर में मौजूद है। शॉर्टकट का नाम मनमाना है और मेरे नियंत्रण में नहीं है। मुझे केवल यह पता है कि किस फाइल को इंगित करने की जरूरत है यदि शॉर्टकट अनुपलब्ध है, तो मुझे शॉर्टकट जेनरेट करने की आवश्यकता है I यदि यह पहले से मौजूद है, तो इसे फिर से नहीं बनाया जाना चाहिए

मुझे लगता है कि किसी भी तरह प्रासंगिक फ़ोल्डर में सभी शॉर्टकट फ़ाइलों के माध्यम से पुनरावृति करना संभव है और जांचें कि वे किस फाइल को इंगित करते हैं साझा शॉर्टकट / प्रतीक के लिए एक टिप्पणी में , एक IShellLink इंटरफ़ेस का उल्लेख किया गया है, लेकिन मुझे यह नहीं पता कि Code अनुभाग में इसे कैसे उपलब्ध कराएं। ( Uses ShlObj; मान्यता प्राप्त नहीं है)

क्या किसी के पास कोई सुझाव है कि मैं इस समस्या को हल कैसे कर सकता हूं?


पर आधारित

इनो सेटअप के यूनिकोड संस्करण की आवश्यकता है

const
  MAX_PATH = 260;
  STGM_READ = $00000000;
  SLGP_SHORTPATH = $1; 
  SLGP_RAWPATH = $4; 
  SLGP_RELATIVEPRIORITY = $8;
  CLSID_ShellLink = '{00021401-0000-0000-C000-000000000046}';

type
  TWin32FindDataW = record
    dwFileAttributes: DWORD;
    ftCreationTime: TFileTime;
    ftLastAccessTime: TFileTime;
    ftLastWriteTime: TFileTime;
    nFileSizeHigh: DWORD;
    nFileSizeLow: DWORD;
    dwReserved0: DWORD;
    dwReserved1: DWORD;
    cFileName: array[0..MAX_PATH-1] of Char;
    cAlternateFileName: array[0..13] of Char;
  end;

  IShellLinkW = interface(IUnknown)
    '{000214F9-0000-0000-C000-000000000046}'
    function GetPath(pszFile: string; cchMaxPath: Integer;
      var FindData: TWin32FindDataW; fFlags: DWORD): HRESULT;
    procedure Dummy2;
    procedure Dummy3;
    function GetDescription(pszName: string; cchMaxName: Integer): HRESULT;
    function SetDescription(pszName: string): HRESULT;
    function GetWorkingDirectory(pszDir: string; cchMaxPath: Integer): HRESULT;
    function SetWorkingDirectory(pszDir: string): HRESULT;
    function GetArguments(pszArgs: string; cchMaxPath: Integer): HRESULT;
    function SetArguments(pszArgs: string): HRESULT;
    function GetHotkey(var pwHotkey: Word): HRESULT;
    function SetHotkey(wHotkey: Word): HRESULT;
    function GetShowCmd(out piShowCmd: Integer): HRESULT;
    function SetShowCmd(iShowCmd: Integer): HRESULT;
    function GetIconLocation(pszIconPath: string; cchIconPath: Integer;
      out piIcon: Integer): HRESULT;
    function SetIconLocation(pszIconPath: string; iIcon: Integer): HRESULT;
    function SetRelativePath(pszPathRel: string; dwReserved: DWORD): HRESULT;
    function Resolve(Wnd: HWND; fFlags: DWORD): HRESULT;
    function SetPath(pszFile: string): HRESULT;
  end;

  IPersist = interface(IUnknown)
    '{0000010C-0000-0000-C000-000000000046}'
    function GetClassID(var classID: TGUID): HRESULT;
  end;

  IPersistFile = interface(IPersist)
    '{0000010B-0000-0000-C000-000000000046}'
    function IsDirty: HRESULT;
    function Load(pszFileName: string; dwMode: Longint): HRESULT;
    function Save(pszFileName: string; fRemember: BOOL): HRESULT;
    function SaveCompleted(pszFileName: string): HRESULT;
    function GetCurFile(out pszFileName: string): HRESULT;
  end;

function GetLinkFileTarget(const FileName: string): string;
var
  FindData: TWin32FindDataW;
  ComObject: IUnknown;
  ShellLink: IShellLinkW;
  PersistFile: IPersistFile;
begin
  ComObject := CreateComObject(StringToGuid(CLSID_ShellLink));
  PersistFile := IPersistFile(ComObject);
  OleCheck(PersistFile.Load(FileName, STGM_READ));
  ShellLink := IShellLinkW(ComObject);
  SetLength(Result, MAX_PATH);
  OleCheck(ShellLink.GetPath(Result, MAX_PATH, FindData, SLGP_RAWPATH));
  SetLength(Result, Pos(#0, Result) - 1);
end;

procedure IterateShortcuts(Path: string);
var
  FindRec: TFindRec;
  ShortcutPath: string;
  TargetPath: string;
begin
  Path := AddBackslash(Path);

  Log(Format('Looking for .lnk in [%s]', [Path]));

  if FindFirst(Path + '*.lnk', FindRec) then
  begin
    try
      repeat
        ShortcutPath := Path + FindRec.Name;
        TargetPath := GetLinkFileTarget(ShortcutPath);
        Log(Format('Target of shortcut [%s] is [%s]', [ShortcutPath, TargetPath]));
      until not FindNext(FindRec);
    finally
      FindClose(FindRec);
    end;
  end;
end;