0

ShellExecuteショートカットを開くのに使用します

コード :

ShellExecute(Handle, 'open', 'C:\Users\hi2012\AppData\Roaming\Microsoft\Windows\Recent\xxx.gif.lnk', nil, nil, SW_SHOWNORMAL)

xxx.gifが存在する場合、そのコードはそれを開くことができますが、存在しない場合は何も与えません。

しかし、Windowsエクスプローラーで開くと、次のように表示されます:

ここに画像の説明を入力

コードを使用して、存在しないショートカットを開くときに、それを表示できるようにしたいのですが、どうすればよいですか?

ShellExecuteこれはショートカットを開くのに間違った方法ですか?

4

3 に答える 3

3

ShellExecute失敗したときにダイアログを表示しません。そしてそれはあなたに代わってファイルを削除することを提案しません。そのダイアログはExplorerアプリによって表示されます。

エラーを処理するには、への呼び出しの戻り値を確認する必要がありますShellExecute。その戻り値が32より大きい場合、呼び出しは成功しました。それ以外の場合はエラーが発生しました。報告された可能性のあるエラーは、ドキュメントに記載されています。

エラー処理を改善するには、を使用しますShellExecuteEx。の呼び出しがShellExecuteEx失敗した場合は、を呼び出すことでエラーコードを取得できますGetLastError

于 2012-11-05T09:01:22.883 に答える
1

を使用IShellLink::Resolveして、ショートカットを自分で解決する必要があります。IShellLink::Resolve検索 UI を表示するかどうかを制御するフラグを提供します。

于 2012-11-05T23:36:55.057 に答える
0

.lnk ファイルのコンテキスト ポップアップ メニューから「開く」を呼び出すことができます。これにより、エクスプローラーで .lnk ファイルをダブルクリックした場合と同じ動作が得られます。

function SHBindToParent(pidl: PItemIDList; const riid: TIID; out ppv; out ppidlLast: PItemIDList): HResult; stdcall; external 'shell32.dll' name 'SHBindToParent';

procedure ExecuteFile(const AWnd: HWND; const AFileName: String);

  function GetUIObjectOfFile(wnd: HWND; const pszPath: WideString; const riid: TGUID; out ppv): HRESULT;
  var
    pidl: PItemIDList;
    sfgao: DWord;
    psf: IShellFolder;
    pidlChild: PItemIDList;
  begin
    DWord(ppv) := 0;
    Result := SHParseDisplayName(PWideChar(pszPath), nil, pidl, 0, sfgao);
    if SUCCEEDED(Result) then
    try
      Result := SHBindToParent(pidl, IID_IShellFolder, psf, pidlChild);
      if SUCCEEDED(Result) then
      try
        Result := psf.GetUIObjectOf(wnd, 1, pidlChild, riid, nil, ppv);
      finally
        psf := nil;
      end;
    finally
      CoTaskMemFree(pidl);
    end;
  end;

const
  SCRATCH_QCM_FIRST = 1;
  SCRATCH_QCM_LAST  = $7FFF;
var
  pcm: IContextMenu;
  Menu: HMENU;
  Info: TCMInvokeCommandInfo;
  Id: UINT;
begin
  if SUCCEEDED(GetUIObjectOfFile(AWnd, PChar(AFileName), IID_IContextMenu, pcm)) then
  try
    Menu := CreatePopupMenu;
    if Menu <> 0 then
    try
      if SUCCEEDED(pcm.QueryContextMenu(Menu, 0, SCRATCH_QCM_FIRST, SCRATCH_QCM_LAST, CMF_DEFAULTONLY)) then
      begin
        Id := GetMenuDefaultItem(Menu, 0, 0);
        if Id <> UINT(-1) then
        begin
          FillChar(Info, SizeOf(Info), 0);
          Info.cbSize := SizeOf(info);
          Info.hwnd := Handle;
          Info.lpVerb := MAKEINTRESOURCEA(Id - SCRATCH_QCM_FIRST);
          SetLastError(pcm.InvokeCommand(Info));
          if GetLastError <> 0 then
            RaiseLastOSError;
        end;
      end;
    finally
      DestroyMenu(Menu);
    end;
  finally
    pcm := nil;
  end;
end;

SEE_MASK_INVOKEIDLIST フラグを指定して ShellExecuteEx を呼び出して、同じものをアーカイブする必要があります。

于 2015-03-11T21:52:52.557 に答える