Click here to Skip to main content
Licence CPOL
First Posted 3 Feb 2003
Views 93,738
Downloads 1,986
Bookmarked 23 times

Find Target Shell Extension

By Paul Farry | 3 Feb 2003
An article about shortening the process of finding the target of a .lnk(windows shortcut) file

1
3 votes, 18.8%
2

3
1 vote, 6.3%
4
12 votes, 75.0%
5
4.38/5 - 16 votes
μ 4.04, σa 2.11 [?]

Find Target menu selected - findtarget.gif

Introduction

This shell extension will add a new option to the Context menu of .lnk (Shortcut) files. I've always been annoyed that to Perform a find target, you have to right click properties, then click find target. There doesn't seem to be a direct api call that simulates what the shell does so I've hunted around, and come up with this, which uses a CreateProcess, ShellExecute, and didn't seem to highlight the file.

Background

After reading Michael Dunn's articles on shell extension (well the first couple so far), I took the examples and came up with this. http://www.codeproject.com/shell/shellextguide1.asp

Using the code

To use the extension, either just regsvr32 it, or Recompile and Register.

Points of Interest

There is a quirk still in here that sometimes the selected file doesn't highlight. (Anyone with any clues, assistance would be greatly appreciated)

History

  • 08-02-2003 Correction for incorrect registry entry.
  • 04-02-2003 Initial release.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

About the Author

Paul Farry

Architect
Idealpos Solutions
Australia Australia

Member
After a lengthy stint at a Retailer writing Point of Sale applications and related internal systems.
 
I now work for a Software Company writing Point of Sale applications and related internal systems.

Sign Up to vote   Poor Excellent
Add a reason or comment to your vote: x
Votes of 3 or less require a comment

Comments and Discussions

 
You must Sign In to use this message board. (secure sign-in)
 
Search this forum  
 FAQ
    Noise  Layout  Per page   
  Refresh
GeneralGreat Assisting Tool Pinmemberchessgod1019:23 10 Jan '10  
QuestionHow to install in 3 steps! Pinmembercherwally5:29 19 Sep '09  
Generaloh! thank you Paul!!!! Pinmemberbbsoft16:53 3 Aug '09  
Generalcontext not working solved Pinmemberalxnto10:39 22 Jan '09  
Generalxp64 PinmemberTilo Kühn2:40 9 May '08  
GeneralGreat Tool Pinmembercharlie markwick22:17 8 Dec '07  
GeneralDifferent behaviour on expanded start menu to s/c's in an explorer pane Pinmemberdalchina17:13 24 Aug '07  
QuestionHow to get the route of Shortcut PinmemberYao113016:44 9 Dec '04  
Generalhigfails if the target directory is open PinmemberMartijn2:59 1 Oct '03  
Generala very valuable tool PinmemberBill Hart17:52 26 Aug '03  
Generalmuch easier/more reliable way to do this Pinmemberchrisg13:20 23 Mar '03  
GeneralRe: much easier/more reliable way to do this PinmemberPaul Farry16:01 23 Mar '03  
GeneralRe: much easier/more reliable way to do this Pinmemberchrisg17:39 26 Mar '03  
this is built on top of features that do exist in Win2K.
CLSID_ShellWindows/IShellWindows can be used to enumerate open folder
windows and to get to the FolderView (IShellView/IFolderView interfaces)
object that is hosted there. below is some code, with supporting helpers
that demonstrate some of this (some of these helpers are only in XP
but those too can be implemented on top of the shell architecture in Win2K).
 

---- code that uses shell windows objects and gets a reference to the views in those windows ---
 

#define IID_PPV_ARG(IType, ppType) IID_##IType,
reinterpret_cast(static_cast(ppType))
#define ARRAYSIZE(a) (sizeof(a)/sizeof(a[0]))
 
STDAPI DisplayNameOf(IShellFolder *psf, LPCITEMIDLIST pidl, DWORD flags,
PWSTR psz, UINT cch)
{
*psz = 0;
STRRET sr;
HRESULT hr = psf->GetDisplayNameOf(pidl, flags, &sr);
if (SUCCEEDED(hr))
hr = StrRetToBufW(&sr, pidl, psz, cch);
return hr;
}
 
STDAPI_(DWORD) SHGetAttributes(IShellFolder *psf, LPCITEMIDLIST pidl, DWORD
dwAttribs)
{
// like SHBindToObject, if psf is NULL, use absolute pidl
LPCITEMIDLIST pidlChild;
if (!psf)
{
SHBindToParent(pidl, IID_PPV_ARG(IShellFolder, &psf), &pidlChild);
}
else
{
psf->AddRef();
pidlChild = pidl;
}
 
DWORD dw = 0;
if (psf)
{
dw = dwAttribs;
dw = SUCCEEDED(psf->GetAttributesOf(1, (LPCITEMIDLIST *)&pidlChild,
&dw)) ? (dwAttribs & dw) : 0;
psf->Release();
}
 
return dw;
}
 
STDAPI IUnknown_QueryService(IUnknown* punk, REFGUID guidService, REFIID
riid, void **ppv)
{
*ppv = NULL;
HRESULT hr = E_FAIL;
if (punk)
{
IServiceProvider *psp;
hr = punk->QueryInterface(IID_PPV_ARG(IServiceProvider, &psp));
if (SUCCEEDED(hr))
{
hr = psp->QueryService(guidService, riid, ppv);
psp->Release();
}
}
return hr;
}
 
STDAPI SHGetIDListFromUnk(IUnknown *punk, LPITEMIDLIST *ppidl)
{
HRESULT hr = E_NOINTERFACE;
 
*ppidl = NULL;
 
IPersistFolder2 *ppf;
if (punk && SUCCEEDED(punk->QueryInterface(IID_PPV_ARG(IPersistFolder2,
&ppf))))
{
hr = ppf->GetCurFolder(ppidl);
ppf->Release();
}
return hr;
}
 
HRESULT SHGetName(LPCITEMIDLIST pidl, DWORD gdnFlags, PTSTR psz, UINT cch)
{
IShellFolder *psfDesktop;
HRESULT hr = SHGetDesktopFolder(&psfDesktop);
if (SUCCEEDED(hr))
{
IShellFolder *psf;
LPCITEMIDLIST pidlChild;
hr = SHBindToParent(pidl, IID_PPV_ARG(IShellFolder, &psf),
&pidlChild);
if (SUCCEEDED(hr))
{
hr = DisplayNameOf(psf, pidlChild, gdnFlags, psz, cch);
}
psfDesktop->Release();
}
return hr;
}
 
HRESULT ViewFromWebBrowserApp(IWebBrowserApp *pwba, REFIID riid, void **ppv)
{
IShellBrowser* psb;
HRESULT hr = IUnknown_QueryService(pwba, SID_STopLevelBrowser,
IID_PPV_ARG(IShellBrowser, &psb));
if (SUCCEEDED(hr))
{
IShellView* psv;
hr = psb->QueryActiveShellView(&psv);
if (SUCCEEDED(hr))
{
hr = psv->QueryInterface(riid, ppv);
psv->Release();
}
psb->Release();
}
return hr;
}
 
HWND WindowFromUnk(IUnknown *punk)
{
HWND hwnd = NULL;
IOleWindow *pow;
if (SUCCEEDED(punk->QueryInterface(IID_PPV_ARG(IOleWindow, &pow))))
{
pow->GetWindow(&hwnd);
pow->Release();
}
return hwnd;
}
 
STDAPI FindWindowByHWND(HWND hwnd, REFIID riid, void **ppv)
{
HRESULT hr = E_FAIL;
*ppv = NULL;
 
IShellWindows* psw;
if (SUCCEEDED(CoCreateInstance(CLSID_ShellWindows, NULL, CLSCTX_ALL,
IID_PPV_ARG(IShellWindows, &psw))))
{
VARIANT v;
v.vt = VT_I4;
 
IDispatch *pdispWBA;
for (v.intVal = 0; FAILED(hr) && S_OK == psw->Item(v, &pdispWBA);
v.intVal++)
{
IWebBrowserApp *pwba;
if
(SUCCEEDED(pdispWBA->QueryInterface(IID_PPV_ARG(IWebBrowserApp, &pwba))))
{
HWND hwndWBA;
if (SUCCEEDED(pwba->get_HWND((LONG_PTR*)&hwndWBA)) &&
(hwnd == hwndWBA))
{
hr = ViewFromWebBrowserApp(pwba, riid, ppv);
}
pwba->Release();
}
pdispWBA->Release();
}
 
psw->Release();
}
return hr;
}
 

 
----- Original Message -----
From: "Paul Farry"
To: "chrisg"
Sent: Sunday, March 23, 2003 6:01 PM
Subject: [CodeProject] Re: much easier/more reliable way to do this
 

> NOTE: This message has been sent from an unattended email box. To reply
> either visit the URL below or copy and paste the email address
> that was supplied to us below into your email client.
>
> An answer has been posted to your message on the page 'Find Target Shell
Extension':
>
> URL :
http://www.codeproject.com/useritems/findtarget.asp?msg=453682#xx453682xx
> From: Paul Farry (pfarry@coloradogroup.com.au)
>
> This call appears to be only for XP or better.
>
> Anything comparable for W2k?
>
>
>
> ---------------------------------------------------------------
> This message was created by The Code Project
> http://www.codeproject.com
>
>
>

 
Chris Guzak (ms)
GeneralRe: much easier/more reliable way to do this PinmemberLupinTaiwan7:46 13 Mar '08  
Generalnot display in context menu Pinmemberbillhao5:59 4 Feb '03  
GeneralRe: not display in context menu PinmemberTak10:05 4 Feb '03  
GeneralRe: not display in context menu Pinmemberbillhao21:24 4 Feb '03  
GeneralRe: not display in context menu PinmemberPaul Farry12:57 7 Feb '03  
GeneralRe: not display in context menu Pinmemberbillhao2:42 8 Feb '03  
GeneralRe: not display in context menu PinmemberBill Hart17:41 26 Aug '03  
GeneralRe: not display in context menu PinmemberPaul Farry22:21 5 Feb '03  
GeneralRe: not display in context menu PinmemberPaul Farry4:01 7 Feb '03  
GeneralRe: not display in context menu Pinmemberbillhao4:18 7 Feb '03  

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

Permalink | Advertise | Privacy | Mobile
Web02 | 2.5.120210.1 | Last Updated 4 Feb 2003
Article Copyright 2003 by Paul Farry
Everything else Copyright © CodeProject, 1999-2012
Terms of Use
Layout: fixed | fluid