COMを使用してショートカットを作成する(32/64bit)

icon 項目のみ表示/展開表示の切り替え

概要

COMのIShellLink,IPersistFileインターフェースを使用してショートカットを作成します。
本プログラムではDドライブにtestへショートカットとう名前でリンク先はC:\を作成しています。
下図は作成されたショートカットのプロパティとショートカットの場所を示すためにエクスプローラを実行しています。

テスト環境

コンパイラ

Visual C++ 2008/2013 Express 32/64bit UNICODE

実行環境

Windows XP Professional Service Pack 3 32bit(Virtual Box上の仮想マシーン)
Windows 7 Enterprise Service Pack 1 64bit

プログラムソースの概要

getshortcut.cpp

WinMain

COMの初期化
 CoInitialize APIによりCOMを初期化します。
ショートカットを扱うための準備
CoCreateInstance関数によりIShellLinkオブジェクトを作成します。
QueryInterface関数によりIPersistFileインターフェースの作成します。
 複数のショートカットを扱う場合でも同時に1個しか扱わない場合は準備は1回で結構です。(STAでCOMを初期化しているのでスレッド単位で必要)
ショートカットの作成
SetPath
IShellLinkのメンバであるSetPathでリンク先を設定します。
IShellLinkには本プログラムで使用しているSetPathの他に以下のようなメンバーがあります。
SetIconLocation アイコンを設定
SetArguments コマンドラインを設定
SetHotkey ホットキーを設定
SetShowCmd ウィンドウの初期表示状態を設定
一部の項目のみ変更する場合は、Load,GetPathでショートカットの内容を取得した後、変更します。
Save
IPersistFileのメンバであるSaveでショートカットのファイル名を指定することによりショートカットが作成されます。
ショートカット使用後の後始末
IShellLink,IPersistFileをReleaseで解放します。
COMの解放
 CoUninitialize APIによりCOMを解放します。

ソースコード

setshortcut.cpp

//      ショートカットを作成する。
//      Visual C++ 2008/2013 Express (UNICODE 32/64bit)

#include <windows.h>
#include <shobjidl.h>
#include <shlguid.h>
#include <tchar.h>

int WINAPI WinMain(HINSTANCE hCurInst, HINSTANCE hPrevInst,LPSTR lpsCmdLine, int nCmdShow){

        //      ショートカットのファイル名
        TCHAR* file_pass=_TEXT("D:\\testへショートカット.lnk");
        //      ショートカットのリンク先パス
        TCHAR* link_pass=_TEXT("C:\\");
        
        if( FAILED( CoInitialize(NULL) )){      //      COMの初期化 STA(シングルスレッドアパートメント)
                MessageBox(0,_TEXT("COMの初期化に失敗しました"),_TEXT("エラー"),MB_OK);
                return -1;
        }
        IShellLink              *m_pShellLink=NULL;     
        IPersistFile    *m_pPersistFile=NULL;
//      IShellLinkオブジェクトを作成
        if(CoCreateInstance( CLSID_ShellLink , NULL , CLSCTX_INPROC_SERVER ,IID_IShellLink ,(LPVOID *)&m_pShellLink)==S_OK){
//      IPersistFileインターフェースの作成
                if(m_pShellLink->QueryInterface( IID_IPersistFile, (LPVOID *)&m_pPersistFile )==S_OK){
//      リンク先の設定 複数のショートカットを処理する場合は以下4行を繰り返す
                        m_pShellLink->SetPath(link_pass);
                        if(m_pPersistFile->Save(file_pass,TRUE)!=S_OK){      //      ショートカットファイルへ保存
                                MessageBox(0,_TEXT("リンク先が設定できませんでした。"),_TEXT("エラー"),MB_OK);
                        }
                        m_pShellLink->Release();     //      IShellLinkオブジェクトの開放
                        m_pPersistFile->Release();   //      IPersistFileインターフェースの開放
                }
        }
        CoUninitialize();       //      COMの解放
        return (int)0;
}

実行ファイルとソースファイルのダウンロード