Source code of Windows XP (NT5)
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
/*
* shlexhk.cpp - IShellExecuteHook implementation for URL class. */
/* Headers
**********/
#include "project.hpp"
#pragma hdrstop
/* Module Constants
*******************/
#pragma data_seg(DATA_SEG_READ_ONLY)
PRIVATE_DATA const char s_cszOpenVerb[] = "open";
#pragma data_seg()
/********************************** Methods **********************************/
HRESULT STDMETHODCALLTYPE InternetShortcut::Execute(PSHELLEXECUTEINFO pei) { HRESULT hr;
DebugEntry(InternetShortcut::Execute);
ASSERT(IS_VALID_STRUCT_PTR(this, CInternetShortcut)); ASSERT(IS_VALID_STRUCT_PTR(pei, CSHELLEXECUTEINFO));
if (! pei->lpVerb || ! lstrcmpi(pei->lpVerb, s_cszOpenVerb)) { if (pei->lpFile) { PSTR pszTranslatedURL;
hr = TranslateURL(pei->lpFile, TRANSLATEURL_FL_GUESS_PROTOCOL, &pszTranslatedURL);
if (SUCCEEDED(hr)) { PCSTR pcszURLToUse;
pcszURLToUse = (hr == S_OK) ? pszTranslatedURL : pei->lpFile;
hr = ValidateURL(pcszURLToUse);
if (hr == S_OK) { hr = SetURL(pcszURLToUse, 0);
if (hr == S_OK) { URLINVOKECOMMANDINFO urlici;
EVAL(SetShowCmd(pei->nShow) == S_OK);
urlici.dwcbSize = sizeof(urlici); urlici.hwndParent = pei->hwnd; urlici.pcszVerb = NULL;
urlici.dwFlags = IURL_INVOKECOMMAND_FL_USE_DEFAULT_VERB;
if (IS_FLAG_CLEAR(pei->fMask, SEE_MASK_FLAG_NO_UI)) SET_FLAG(urlici.dwFlags, IURL_INVOKECOMMAND_FL_ALLOW_UI);
hr = InvokeCommand(&urlici);
if (hr != S_OK) { SET_FLAG(pei->fMask, SEE_MASK_FLAG_NO_UI);
TRACE_OUT(("InternetShortcut::Execute(): InternetShortcut::InvokeCommand() failed, returning %s. Clearing SEE_MASK_FLAG_NO_UI to avoid error ui from ShellExecute().", GetHRESULTString(hr))); } } }
if (pszTranslatedURL) { LocalFree(pszTranslatedURL); pszTranslatedURL = NULL; } } } else // This hook only handles execution of file string, not IDList.
hr = S_FALSE; } else // Unrecognized verb.
hr = S_FALSE;
if (hr == S_OK) pei->hInstApp = (HINSTANCE)42; else if (FAILED(hr)) { switch (hr) { case URL_E_INVALID_SYNTAX: case URL_E_UNREGISTERED_PROTOCOL: hr = S_FALSE; break;
case E_OUTOFMEMORY: pei->hInstApp = (HINSTANCE)SE_ERR_OOM; hr = E_FAIL; break;
case IS_E_EXEC_FAILED: // Translate execution failure into "file not found".
pei->hInstApp = (HINSTANCE)SE_ERR_FNF; hr = E_FAIL; break;
default: // pei->lpFile is bogus. Treat as file not found.
ASSERT(hr == E_POINTER); // We should never get E_FLAGS from TranslateURL() here.
pei->hInstApp = (HINSTANCE)SE_ERR_FNF; hr = E_FAIL; break; } } else ASSERT(hr == S_FALSE);
ASSERT(IS_VALID_STRUCT_PTR(this, CInternetShortcut)); ASSERT(IS_VALID_STRUCT_PTR(pei, CSHELLEXECUTEINFO)); ASSERT(hr == S_OK || hr == S_FALSE || hr == E_FAIL);
DebugExitHRESULT(InternetShortcut::Execute, hr);
return(hr); }
|