ショートカットを作成する

実行形式のプログラム(.EXE)のショートカットを作成します。
ショートカットはデスクトップに置いたり、[スタート][プログラム]から実行するときに使用されます。

前田稔(Maeda Minoru)の超初心者のプログラム入門

プロジェクトの設定

  1. 新規プロジェクトで[空のプロジェクト](Shortcut) を作成します。
  2. Shortcut.cpp のソースコードです。
    /*******************************************/
    /*★ ショートカットを作成する    前田 稔 ★*/
    /*******************************************/
    #include    <windows.h>
    #include    <commctrl.h>
    #include    <shlobj.h>
    
    IShellLink      *m_pShellLink= NULL;    //IShellLinkへのポインタ
    IPersistFile    *m_pPersistFile= NULL;  //IPersistFileへのポインタ
    char            winmain[]= "C:\\TMP\\main.exe";
    char            p_pchFile[]= "C:\\TMP\\ショートカット.lnk";
    OLECHAR         ochLinkFile[MAX_PATH];
    
    //★ Windows Main 関数
    int  PASCAL  WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, int nCmdShow)
    {   HRESULT hRes;
    
        //COMライブラリを初期化
        CoInitialize(NULL);
        //ShellLink インターフェイスへのポインタを取得
        CoCreateInstance(CLSID_ShellLink,NULL,CLSCTX_INPROC_SERVER,IID_IShellLink,(LPVOID *)&m_pShellLink);
        //PersistFile インターフェイスへのポインタを取得します。
        hRes= m_pShellLink->QueryInterface(IID_IPersistFile,(LPVOID *)&m_pPersistFile);
        if (hRes!=S_OK)     return FALSE;
        //パスで指定されたファイルをオブジェクトに関連づける
        hRes= m_pShellLink->SetPath(winmain);
    
        m_pShellLink->SetShowCmd(SW_SHOW);          //標準の表示。
        m_pShellLink->SetWorkingDirectory("");      //カレントフォルダーはナシ。
        m_pShellLink->SetIconLocation(NULL,0);      //フツーのアイコンが表示されます。
        m_pShellLink->SetHotkey(0);                 //ホットキーナシ。
        m_pShellLink->SetDescription("");           //タイトルナシ。
    
        //ユニコードに変換します。
        MultiByteToWideChar(CP_ACP,MB_PRECOMPOSED,p_pchFile,-1,ochLinkFile,MAX_PATH);
        hRes= m_pPersistFile->Save(ochLinkFile,TRUE);
        if (hRes!=S_OK)     return FALSE;
    
        //PersistFileへのポインタを破棄します。
        if (m_pPersistFile!=NULL)   m_pPersistFile->Release();
        //ShellLinkへのポインタを破棄します。
        if (m_pShellLink!=NULL)     m_pShellLink->Release();
        CoUninitialize();
        return S_OK;
    }
    
  3. ショートカットを作成する実行形式のファイルを指定します。
    C:\tmp のフォルダーを作成して、何か適当な実行形式のファイル(main.exe)を格納して下さい。
    char winmain[]= "C:\\TMP\\main.exe";
  4. ショートカットを格納するフォルダーとショートカットの名前です。
    char p_pchFile[]= "C:\\TMP\\ショートカット.lnk";
  5. プログラムを実行しても何の変化も無く、すぐに終了します。
    エクスプローラなどを起動して、C:\TMP のフォルダーに「ショートカット.lnk」が格納されていることを確認して下さい。
    「ショートカット.lnk」をダブルクリックで起動すると main.exe が実行されることを確かめて下さい。

プログラムの説明

  1. commctrl.h と shlobj.h をインクルードします。
    ショートカットの作成には IShellLink と IPersistFile を使います。
        #include    <windows.h>
        #include    <commctrl.h>
        #include    <shlobj.h>
    
        IShellLink      *m_pShellLink= NULL;    //IShellLinkへのポインタ
        IPersistFile    *m_pPersistFile= NULL;  //IPersistFileへのポインタ
        char            winmain[]= "C:\\TMP\\main.exe";
        char            p_pchFile[]= "C:\\TMP\\ショートカット.lnk";
        OLECHAR         ochLinkFile[MAX_PATH];
        
  2. 最初に COM を初期化します。
    CoCreateInstance() で ShellLink インターフェイスへのポインタを取得します。
    m_pShellLink->QueryInterface() で PersistFile インターフェイスへのポインタを取得します。
        //★ Windows Main 関数
        int  PASCAL  WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, int nCmdShow)
        {   HRESULT hRes;
    
            //COMライブラリを初期化
            CoInitialize(NULL);
            //ShellLink インターフェイスへのポインタを取得
            CoCreateInstance(CLSID_ShellLink,NULL,CLSCTX_INPROC_SERVER,IID_IShellLink,(LPVOID *)&m_pShellLink);
            //PersistFile インターフェイスへのポインタを取得します。
            hRes= m_pShellLink->QueryInterface(IID_IPersistFile,(LPVOID *)&m_pPersistFile);
            if (hRes!=S_OK)     return FALSE;
        
  3. m_pShellLink->SetPath() で実行形式のファイルをフルパスで指定してオブジェクトに関連付けます。
    m_pShellLink のその他のパラメータを設定します。
        //パスで指定されたファイルをオブジェクトに関連づける
        hRes= m_pShellLink->SetPath(winmain);
    
        m_pShellLink->SetShowCmd(SW_SHOW);          //標準の表示。
        m_pShellLink->SetWorkingDirectory("");      //カレントフォルダーはナシ。
        m_pShellLink->SetIconLocation(NULL,0);      //フツーのアイコンが表示されます。
        m_pShellLink->SetHotkey(0);                 //ホットキーナシ。
        m_pShellLink->SetDescription("");           //タイトルナシ。
        
  4. m_pPersistFile->Save() でショートカットを格納するのですが、格納するパスをユニコードで指定しなければなりません。
    そこで MultiByteToWideChar() でアスキーコードからユニコードに変換します。
    あとは最後の後始末だけです。
        //ユニコードに変換します。
        MultiByteToWideChar(CP_ACP,MB_PRECOMPOSED,p_pchFile,-1,ochLinkFile,MAX_PATH);
        hRes= m_pPersistFile->Save(ochLinkFile,TRUE);
        if (hRes!=S_OK)     return FALSE;
        

【演習】

  1. ショートカットをデスクトップに格納して下さい。
    デスクトップフォルダーの取得は 特殊フォルダーのパスを求める を参照して下さい。
  2. [スタート][プログラム] からできるようにして下さい。
    プログラムのフォルダーに「テスト」のサブフォルダーを作成して「ショートカット.lnk」を格納します。
    サブフォルダーの作成は フォルダーを作成する を参照して下さい。

超初心者のプログラム入門(Win32API C++)