none
ショートカットアイコンの変更方法 RRS feed

  • 質問

  • アプリをバージョンアップした際に、デスクトップにあるショートカットを、

    新しいバージョンのアイコンや名前に変更したいと思っているのですが、

    なかなか方法が見つからずに困っています。

     

    プログラム上から動的に、ショートカットアイコンの変更を行いたいのですが、

    なにか専用APIなどあれば教えていただけないでしょうか?

     

     

    2011年4月27日 9:15

回答

すべての返信

  • [IShellLink を使用するショートカットのアイコンを変更する方法]
      http://support.microsoft.com/kb/179904/ja


    現状をもっと具体的に記述すると、また違った回答が得られるとかもしれません。
    例えば、XXXというInstallerを使用していて、このタイミングで変更したい、開発環境はXXXでOSはXXXです、などです。 

    2011年4月27日 10:19
  • >> kozzさん

    ありがとうございます。

    OSはWindowsXPで開発していますが、XP、Vista、7で動作するアプリを作成しています。

    開発環境はVC++2008のMFCを使用して開発しています。

    インストーラはVC++2008のセットアッププロジェクトで作成し、

    ショートカットもインストーラの設定で作成しています。

     

    ショートカットの更新タイミングは、アプリ起動後にバージョンコントロール処理を行っているのですが

    バージョンコントロール終了後になります。

    アプリ起動

    バージョンコントロール  (このタイミングで変更したい)

    最新版でアプリ再起動

     

    2011年4月27日 10:39
  • Applicationから変更するには、IShellLinkを使います。
    先のLinkはそのSampleですが、DBCS Buildでの例のため、Unicode Buildでは文字コードの変更処理は必要ありません。
     

    以下も参考になります。

    [Shell Links]
     
    http://msdn.microsoft.com/en-us/library/bb776891(VS.85).aspx

    [Utility for creating Link(shortcut)...]
     
    http://www.codeproject.com/KB/shell/UtilShortcuts.aspx 

    • 回答としてマーク Kiirokuma 2011年5月11日 10:21
    2011年4月28日 10:40
  • ありがとうございます、早速試してみます。

    2011年5月6日 9:40
  • ありがとうございます。

    codeprojectのソースを参考にショートカット作成が出来ました。

     

    =======================================

    Header

    =======================================

    #pragma once

     

    namespace MXShortcutUtil
    {
     typedef struct tagShortcutInfo
     {
      CString  FileName;  // ファイル名
      CString  FilePath;  // ファイルパス
      CString  ShortcutPath; // ターゲットパス
      
     } ShortcutInfo;
     
     // nID → SHGetSpecialFolderLocation
     CString GetShortcutPath(int nID);

     // Create shortcut
     bool CreateShortcut(const ShortcutInfo& info);

    };

     

    =======================================

    Source

    =======================================

    #include "StdAfx.h"
    #include "MXShortcutUtil.h"

    namespace MXShortcutUtil
    {
     CString GetShortcutPath(int nID)
     {
      //File system directory that contains the directories for the
      //common program groups that appear on the Start menu for all users.
      LPITEMIDLIST pidl = NULL;

      // Get a pointer to an item ID list that
      // represents the path of a special folder
      HRESULT hr = SHGetSpecialFolderLocation(NULL, nID, &pidl);

      // Convert the item ID list's binary
      // representation into a file system path
      TCHAR szPath[_MAX_PATH] = {0};
      SHGetPathFromIDList(pidl, szPath);

      // Allocate a pointer to an IMalloc interface
      LPMALLOC pMalloc = NULL;

      // Get the address of our task allocator's IMalloc interface
      hr = SHGetMalloc(&pMalloc);

      // Free the item ID list allocated by SHGetSpecialFolderLocation
      pMalloc->Free(pidl);

      // Free our task allocator
      pMalloc->Release();

      return szPath;
     }

     bool CreateShortcut(const ShortcutInfo& info)
     {
      CString szLinkName = info.FileName;
      szLinkName += _T(".lnk") ;

      CString m_szCurrentDirectory = info.FilePath;

      CString szTemp = szLinkName;
      szLinkName.Format( _T("%s\\%s"), m_szCurrentDirectory, szTemp );


      // Get a pointer to the IShellLink interface.
      IShellLink* psl = NULL;
      HRESULT hr = CoCreateInstance(CLSID_ShellLink, NULL,  CLSCTX_INPROC_SERVER, IID_IShellLink,  reinterpret_cast<void**>(&psl));
      if( !SUCCEEDED(hr) )
       return false;
      
      // Set the path to the shortcut target
      psl->SetPath(info.ShortcutPath);


      // Query IShellLink for the IPersistFile interface for saving
      //the shortcut in persistent storage.
      IPersistFile* ppf = NULL;
      hr = psl->QueryInterface(IID_IPersistFile, reinterpret_cast<void**>(&ppf));

      if( SUCCEEDED(hr) )
      {
       // Save the link by calling IPersistFile::Save.
       hr = ppf->Save(szLinkName, TRUE);
       ppf->Release();
      }
      psl->Release();  

      return true;
     }
    };

    2011年5月11日 10:06