Notice: This website is an unofficial Microsoft Knowledge Base (hereinafter KB) archive and is intended to provide a reliable access to deleted content from Microsoft KB. All KB articles are owned by Microsoft Corporation. Read full disclaimer for more details.

How To Change the Icon of a Shortcut Through IShellLink


Summary

This article describes how to create a shortcut and change the icon that is displayed for the shortcut.

↑ Back to the top


More Information

IShellLink provides methods for obtaining and setting the icon for a shortcut. The steps for changing the icon for a shortcut are as follows:

  1. Obtain the IPersistFile interface from the IShellLink using QueryInterface with IID_IPersistFile.
  2. Call IShellLink::SetIconLocation with the file containing the icon (in this case the file is either a .dll or .exe) and the index of the icon.
  3. Call IPersistFile::Save to update the shortcut.

Sample Code

Following sample code creates a shortcut and sets the shortcut's icon to an icon contained in shell32.dll:
   /*PARAMETERS
fname_to_create_link = (e.g.) "c:\\mytextfile.txt"
lnk_fname = (e.g.) "yourname.lnk"
*/

void CreateLinkThenChangeIcon(LPTSTR fname_to_create_link,
LPTSTR lnk_fname)
{
HRESULT hres;
IShellLink *psl = NULL;
IPersistFile *pPf = NULL;
WORD wsz[256];
TCHAR buf[256];
int id;
LPITEMIDLIST pidl;

hres = CoCreateInstance( CLSID_ShellLink,

NULL,
CLSCTX_INPROC_SERVER,
IID_IShellLink,
(LPVOID*)&psl);
if(FAILED(hres))
goto cleanup;
hres = psl->QueryInterface(IID_IPersistFile, (LPVOID*)&pPf);
if(FAILED(hres))
goto cleanup;
hres = psl->SetPath(fname_to_create_link);
if(FAILED(hres))

goto cleanup;
//place the shortcut on the desktop
SHGetSpecialFolderLocation(hwnd, CSIDL_DESKTOP, >pidl);

SHGetPathFromIDList(pidl, buf);

lstrcat(buf,"\\");
lstrcat(buf,lnk_fname);

MultiByteToWideChar(CP_ACP, 0, buf, -1, wsz, MAX_PATH);

hres = pPf->Save(wsz, TRUE);

if(FAILED(hres))

goto cleanup;

GetSystemDirectory(buf, 256);

lstrcat(buf,"\\shell32.dll");

hres = psl->SetIconLocation(buf, 1);

if(FAILED(hres))

goto cleanup;

hres = psl->GetIconLocation(buf, 256, &id);

if(FAILED(hres))

goto cleanup;

pPf-&Save(wsz, TRUE);

cleanup:

if(pPf)

pPf->Release();

if(psl)

psl->Release();

}

↑ Back to the top


Keywords: kbhowto, kb

↑ Back to the top

Article Info
Article ID : 179904
Revision : 1
Created on : 1/7/2017
Published on : 6/22/2014
Exists online : False
Views : 238