<p>ショートカットの情報取得方法</p>
<p>ShellLink.Resolveが結構くせ者で、<strong>SLR_ANY_MATCH</strong>にせっていしてリンク先がないショートカットだと検索してくれたりする...<br />
システムで処理する際には、<strong>SLR_NO_UI</strong>でダイアログを出さないようにして書き換えると便利じゃないかな？</p>
<pre class="brush: delphi;">
type
  TIconLocation = packed record
    Path: string;
    Number: integer;
  end;
  TLinkFileInfo = packed record
    FileName: string; // リンクしているファイル名
    WorkDir: string; // 作業ディレクトリ
    Arguments: string; // コマンドライン引数
    Hotkey: Word; // 設定されているホットキー
    ShowCmd: Integer; // 実行時の表示状態
    Icon: TIconLocation;
  end;

/// <summary>ショートカットの情報取得</summary>
/// <param name="LinkFilename">ショートカットのファイル名</param>
/// <return>ショートカット情報構造体</return>
function GetInfofromLinkFile(LinkFilename: string): TLinkFileInfo;
var
  ShellLink: IShellLink;
  PersistFile: IPersistFile;
  WFilename: WideString;
  Win32FindData: TWin32FindData;
  S, Work, Arg: string;
  Hot: Word;
  Cmd: Integer;
  sIconPath: WideString;
  nIconPath: integer;
  nIcon: integer;
begin
  if LowerCase(ExtractFileExt(LinkFilename)) &lt;&gt; '.lnk' then
    Exit;

  ShellLink := CreateComObject(CLSID_ShellLink) as IShellLink;
  PersistFile := ShellLink as IPersistFile;

  // Unicodeにキャスト
  WFilename := LinkFilename;

  if Succeeded(PersistFile.Load(PWChar(WFilename), STGM_READ)) then
  begin
    ShellLink.Resolve(0, SLR_NO_UI);

    SetLength(S, MAX_PATH);
    SetLength(Work, MAX_PATH);
    SetLength(Arg, MAX_PATH);
    SetLength(sIconPath, MAX_PATH);
    nIconPath := MAX_PATH;
    // ショートカットファイルの参照先を取得
    ShellLink.GetPath(PChar(S), MAX_PATH, Win32FindData, SLGP_UNCPRIORITy);
    // 作業ディレクトリを取得
    ShellLink.GetWorkingDirectory(PChar(Work), MAX_PATH);
    // コマンドライン引数を取得
    ShellLink.GetArguments(PChar(Arg), MAX_PATH);
    // ホットキーを取得
    ShellLink.GetHotkey(Hot);
    // 実行時の表示状態を取得
    ShellLink.GetShowCmd(Cmd);
    // アイコンの状態を取得
    ShellLink.GetIconLocation(PWideChar(sIconPath), MAX_PATH, nIcon);

    // 関数の戻り値にセット
    with Result do
    begin
      FileName := S;
      WorkDir := Work;
      Arguments := Arg;
      Hotkey := Hot;
      ShowCmd := Cmd;
      Icon.Path := sIconPath;
      Icon.Number := nIcon;
    end;
  end;
end;
</pre>