Solved

When is a shortcut not a shortcut ???

Posted on 1998-10-15
5
277 Views
Last Modified: 2013-11-20
On the desktop there are 'shortcut like' objects such as the InBox and 'Internet Explorer'. The shortcuts are generated through IShellLink. As far as I can tell these other objects are generated through IShellFolder.
Is this correct, and more importantly how can I set one up to reference my executable ??
Points will only be awarded for a complete answer.
0
Comment
Question by:Bridge
  • 2
  • 2
5 Comments
 
LVL 6

Expert Comment

by:snoegler
ID: 1323334
(Parts of the code below are taken from a KB article, but i don't know its ID anymore)

// CreateLink - uses the shell's IShellLink and IPersistFile interfaces
//   to create and store a shortcut to the specified object.
// Returns the result of calling the member functions of the interfaces.
// lpszPathObj - address of a buffer containing the path of the object
// lpszPathLink - address of a buffer containing the path where the
//   shell link is to be stored
// lpszDesc - address of a buffer containing the description of the
//   shell link
 
HRESULT CreateLink(LPCSTR lpszPathObj,
    LPCSTR lpszPathLink, LPCSTR lpszDesc)
{
    HRESULT hres;
    IShellLink* psl;
 
    // Get a pointer to the IShellLink interface.
    hres = ::CoCreateInstance(CLSID_ShellLink, NULL,
        CLSCTX_INPROC_SERVER, IID_IShellLink, (void **)&psl);
    if (SUCCEEDED(hres)) {
        ::IPersistFile* ppf;
 
        // Set the path to the shortcut target, and add the
        // description.
        psl->SetPath(lpszPathObj);
        psl->SetDescription(lpszDesc);
 
       // Query IShellLink for the IPersistFile interface for saving the
       // shortcut in persistent storage.
        hres = psl->QueryInterface(IID_IPersistFile,
            (void **)&ppf);
 
        if (SUCCEEDED(hres)) {
            WORD wsz[MAX_PATH];
 
            // Ensure that the string is ANSI.
            ::MultiByteToWideChar(CP_ACP, 0, lpszPathLink, -1,
                wsz, MAX_PATH);
 
            // Save the link by calling IPersistFile::Save.
            hres = ppf->Save(wsz, TRUE);
            ppf->Release();
        }
            psl->Resolve(NULL,SLR_NO_UI|SLR_UPDATE);
        psl->Release();
    }
    return hres;
}
 
BOOL MakeLink(int csidlFolder,LPCTSTR lpszRelPathToLink, LPCTSTR lpszDescription, LPCTSTR lpszLinkTo)
{
    LPITEMIDLIST    pidl;
    TCHAR           buffer[MAX_PATH];
    CString         sFullPath;

    if(SHGetSpecialFolderLocation(NULL,csidlFolder,&pidl)!=NOERROR)
          return FALSE;
    if(!SHGetPathFromIDList(pidl,buffer))
          return FALSE;

    sFullPath       =buffer;
    sFullPath       +=lpszRelPathToLink;

    // Check if there are subdirectories to create
    CString         sTemp;
    int                        iStart=0;
    int             iSlashPos;

    sTemp           =sFullPath;
    do  {
        sTemp       =sFullPath.Mid(iStart);
        iSlashPos   =sTemp.Find('\\');

        if(iSlashPos!=-1) {
            sTemp   =sFullPath.Mid(0,iStart+iSlashPos);
            iStart  =iStart+iSlashPos+1;
        }   else
            sTemp   =sFullPath;
       
        CreateDirectory(sTemp,NULL);
    }   while(iSlashPos!=-1);

    sFullPath+="\\";
    sFullPath+=lpszDescription;

    if(CreateLink(lpszLinkTo,sFullPath,lpszDescription)!=NOERROR)
        return FALSE;

    return TRUE;
}

This is a part of a working application (with a little changes).
To use it, you need to call MakeLink() like this:

MakeLink(CSIDL_DESKTOP,"\\My Application Group",
                  "My Application","C:\\MYAPP\\MYAPP.EXE");

or

MakeLink(CSIDL_PROGRAMS,"\\My Application Group",
                  "My Application","C.\\MYAPP\\MYAPP.EXE");

You have to include winnls.h, winnetwk.h, and shlobj.h. Also, you must call CoInitialize() in
your InitInstance() handler.
Hope this helps,

snoegler

P.S: Lots of information on shell links and so on can be found at www.codeguru.com
0
 
LVL 1

Author Comment

by:Bridge
ID: 1323335
From looking at your answer it seem to generate a shortcut. I know how to do this already.
Maybe I wansnt clear enough in the question.
If you look at the desktop through Explorer you will see some 'system folder' objects. I want to know how these are generated, I think it is through IShellFolder.
Any ideas.
0
 
LVL 32

Accepted Solution

by:
jhance earned 200 total points
ID: 1323336
The "links" on the desktop that look like shortcuts but aren't are created using their CLSIDs.  for example, use REGEDIT and look at:

HKEY_CLASSES_ROOT\CLSID\{645FF040-5081-101B-9F08-00AA002F954E}

This is the CLSID for the Recycle Bin.  This is added to the desktop folder with:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Desktop\NameSpace\{645FF040-5081-101B-9F08-00AA002F954E}


0
 
LVL 32

Expert Comment

by:jhance
ID: 1323337
BTW, the process for creating "Namespace Extensions" is not terribly difficult but it is somewhat complicated.  Most advanced Windows programming books have explanations of how to build namespace extension DLLs and add them to the Desktop.
0
 
LVL 1

Author Comment

by:Bridge
ID: 1323338
You forgot that you must put at least
shell
  open
    command

in for it to be of any use though. You can have the points anyway.
0

Featured Post

Gigs: Get Your Project Delivered by an Expert

Select from freelancers specializing in everything from database administration to programming, who have proven themselves as experts in their field. Hire the best, collaborate easily, pay securely and get projects done right.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Title # Comments Views Activity
Expand macro to ask for filename column 8 37
deburging in oracle form 12 98
Detect CR LF to each line 12 158
FizzBuzz challenge 9 80
If you use Adobe Reader X it is possible you can't open OLE PDF documents in the standard. The reason is the 'save box mode' in adobe reader X. Many people think the protected Mode of adobe reader x is only to stop the write access. But this fe…
Have you tried to learn about Unicode, UTF-8, and multibyte text encoding and all the articles are just too "academic" or too technical? This article aims to make the whole topic easy for just about anyone to understand.
This video will show you how to get GIT to work in Eclipse.   It will walk you through how to install the EGit plugin in eclipse and how to checkout an existing repository.
This video shows how to quickly and easily add an email signature for all users on Exchange 2016. The resulting signature is applied on a server level by Exchange Online. The email signature template has been downloaded from: www.mail-signatures…

813 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

10 Experts available now in Live!

Get 1:1 Help Now