2012-11-05 110 views
0

我用ShellExecute打開快捷我打開快捷方式時不存在快捷方式,爲什麼不顯示這個對話框?

代碼:如果xxx.gif存在的代碼就可以打開它

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

,如果沒有它不給任何東西。

,但是,當我打開窗戶,它Explorer中會顯示這樣的:

enter image description here

我想,當我使用代碼打開了一個不不存在的快捷方式也可以證明,我能做些什麼?

這是一個錯誤的方式使用ShellExecute打開一個快捷方式?

+0

@TobiasR明白了,我會試試看,謝謝U – Hanlin

+0

@TobiasR這就是如何調用Open With對話框。 –

+0

@DavidHeffernan uups - 正如你所說的那樣......是真的。 –

回答

3

ShellExecute失敗時不顯示對話框。它不會提供以您的名義刪除文件。該對話框由Explorer應用顯示。

爲了處理錯誤,您需要檢查呼叫的返回值ShellExecute。如果該返回值大於32,則調用成功。否則有錯誤。文檔中列出了可能報告的錯誤。

爲了更好地處理錯誤,請使用ShellExecuteEx。如果致電ShellExecuteEx失敗,則可以通過致電GetLastError獲取錯誤代碼。

+0

thx,我會試試看。 – Hanlin

1

您應該使用IShellLink::Resolve來自己解決快捷方式。 IShellLink::Resolve提供標誌來控制是否顯示搜索UI。

+0

我盡我所能去做,但它不起作用,你能告訴我怎麼做嗎? – Hanlin

+0

@ONion:有關示例代碼,請參閱http://msdn.microsoft.com/en-us/library/windows/desktop/bb776891.aspx#Shellink_Resolving_Shortcut。 – jamesdlin

0

您可以invoke "open" from context popup menu on .lnk file。這會給你同樣的行爲,雙擊在資源管理器.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; 

同樣應該調用的ShellExecuteEx與SEE_MASK_INVOKEIDLIST標誌來archieved。