Solved

Creating a desktop shortcut programatically

Posted on 2002-07-22
2
417 Views
Last Modified: 2013-12-03
How do I create a desktop shortcut (.lnk) programatically? either fron an application (c++) or from the shell (command line).
0
Comment
Question by:aarone
2 Comments
 
LVL 23

Expert Comment

by:Roshan Davis
ID: 7169192
Find "Using Shell Links in Windows 95" in MSDN, You can find a GOOD Sample ...

Good Luck
0
 
LVL 86

Accepted Solution

by:
jkr earned 200 total points
ID: 7169207
See http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/Shell/programmersguide/shell_int/shell_int_programming/shortcuts/shortcut.asp ("Shell Links") - it comes with sample code:

// 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.
//
// Parameters:
// 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, (LPVOID*)&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, (LPVOID*)&ppf);

       if (SUCCEEDED(hres))
       {
           WCHAR wsz[MAX_PATH];

           // Ensure that the string is Unicode.
           MultiByteToWideChar(CP_ACP, 0, lpszPathLink, -1, wsz, MAX_PATH);
             
           // TODO: Check return value from MultiByteWideChar to ensure
                    success.

           // Save the link by calling IPersistFile::Save.
           hres = ppf->Save(wsz, TRUE);
           ppf->Release();
       }
       psl->Release();
   }
   return hres;
}
 
Comment
From: jhance  Date: 07/04/2002 12:44PM PST  
To make a shortcut anywhere, use the IShellLink COM interface exported by the Windows Shell.

By the way, you may want to get a copy of Dino Esposito's book, Windows Shell Programming...

Anyway, a nice sample from that book:

struct SHORTCUTSTRUCT
{
 LPTSTR pszTarget;
 LPTSTR pszDesc;
 WORD wHotKey;
 LPTSTR pszIconPath;
 WORD wIconIndex;
};
typedef SHORTCUTSTRUCT* LPSHORTCUTSTRUCT;

HRESULT SHCreateShortcutEx(LPCTSTR szLnkFile, LPSHORTCUTSTRUCT lpss)
{
 WCHAR wszLinkFile[MAX_PATH] = {0];
IShellLink* pShellLink = NULL;
IPersistFile* pPF = NULL;

if(lpss == NULL){
 return E_FAIL;
}

HRESULT hr = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, reinterpret_cast<LPVOID*>(&pShellLink));

if(FAILED(hr)){
 return hr;
}

pShellLink->SetPath(lpss->pszTarget);
pShellLink->SetDescription(lpss->pszDesc);
pShellLink->SetHotKey(lpss->wHotKey);
pShellLink->SetIconLocation(lpss->pszIconPath, lpss->wIconIndex);

hr = pShellLink->QueryInterface(IID_IPersistFile, reinterpret_cast<LPVOID*>(&pPF));

if(FAILED(hr)){
 pShellLink->Release();
 return hr;
}

MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, szLnkFile, 01, wszLinkFile, MAX_PATH);

hr = pPF->Save(wszLnkFile, TRUE);

pPF->Release();
pShellLink->Release();
return hr;

}  
0

Featured Post

Do You Know the 4 Main Threat Actor Types?

Do you know the main threat actor types? Most attackers fall into one of four categories, each with their own favored tactics, techniques, and procedures.

Join & Write a Comment

Suggested Solutions

This article describes how to add a user-defined command button to the Windows 7 Explorer toolbar.  In the previous article (http://www.experts-exchange.com/A_2172.html), we saw how to put the Delete button back there where it belongs.  "Delete" is …
This article describes a technique for converting RTF (Rich Text Format) data to HTML and provides C++ source that does it all in just a few lines of code. Although RTF is coming to be considered a "legacy" format, it is still in common use... po…
This is Part 3 in a 3-part series on Experts Exchange to discuss error handling in VBA code written for Excel. Part 1 of this series discussed basic error handling code using VBA. http://www.experts-exchange.com/videos/1478/Excel-Error-Handlin…
Internet Business Fax to Email Made Easy - With eFax Corporate (http://www.enterprise.efax.com), you'll receive a dedicated online fax number, which is used the same way as a typical analog fax number. You'll receive secure faxes in your email, fr…

707 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

14 Experts available now in Live!

Get 1:1 Help Now