Microsoft KB Archive/179904

{|
 * width="100%"|

HOWTO: Change the Icon of a Shortcut Through IShellLink

 * }

Q179904

-

The information in this article applies to:


 * Microsoft Win32 Software Development Kit (SDK)

-

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

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;

} Additional query words:

Keywords : kbLinks kbOSWinNT400 kbOSWin2000 kbSDKWin32 kbOSWin95 kbOSWin98 kbGrpDSShell

Issue type : kbhowto

Technology : kbWin32SDKSearch kbAudDeveloper kbSDKSearch kbWin32sSearch