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

 今回は「ショートカット」を作成するわけですが、これには、OLEを使用する必要があります。OLEってなんだ?っていう方もおられると思いますが、私もその一人ですのであまり詳しいことは知りません。が、簡単なところは分かってきたのでこの記事を書きます。

 では、手順を整理してみますと、このようになります。

  1. シェル関係のヘッダ(shlobj.h)をインクルード
  2. OLEを初期化する。
  3. IShellLink インターフェイスを作る
  4. SetPathメソッドを使って、リンク先を設定する
  5. QueryInterfaceメソッドを使って、IPersistFileインターフェイスのポインタを得る
  6. IPersistFileインターフェイスのSaveメソッドを呼び出してファイルに保存する
    このとき、保存先ファイル名はUNICODE(wchar_t*またはBSTR,OLECHAR*)で指定する。
  7. IPersistFileインターフェイスのReleaseメソッドでIPersistFileインターフェイスを解放
  8. IShellLinkインターフェイスのReleaseメソッドでIShellLinkインターフェイスを解放
  9. OLEの終了処理

という流れになります。今回は、OLEドラッグドロップの機能は使用しないため、初期化にはCoInitialize APIを、終了には、CoUninitialize APIを使うことにします。(プログラムの開始時にすでに初期化する様なアプリケーションの場合、1,2.9は必要ありません)

また、エラーチェック箇所が多く、終了時の処理も多いため、今回は例外処理を使いました。

throw(FALSE)  …… 失敗時
throw(TRUE)   …… 成功時

#include <windows.h>
#include <shlobj.h>   // [1]シェル関係ヘッダ

//関数プロトタイプ
BOOL CreateShortCut(LPCTSTR lpShortCutPath, LPCTSTR lpTargetFile);

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow )
{
    //メモ帳へのショートカットをC:\ルートに作成します。
    CreateShortCut("C:\\notepad.lnk", "C:\\WINDOWS\\notepad.exe");

    return 0;
}


BOOL CreateShortCut(LPCTSTR lpShortCutPath, LPCTSTR lpTargetFile)
{
    HRESULT hr;             //いろいろな戻り値を入れる
    IShellLink *pShellLink = NULL;
    IPersistFile *pPersistFile = NULL;
    OLECHAR SCPath[500];    //保存先のパスはUnicode

#ifndef UNICODE
    // ANSI環境なら保存先パスをUnicodeに変換
    MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, lpShortCutPath, -1,
                            SCPath, MAX_PATH );
#endif

    try{
        // [2] OLE初期化
        CoInitialize(NULL);

        // [3] IShellLinkインターフェイスの作成
        hr = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER,
                IID_IShellLink, (void**)&pShellLink);
        if (hr != S_OK)
            throw(FALSE);

        // [4] リンク先パスの設定
        pShellLink->SetPath(lpTargetFile);

        // [5] IPersistFileインターフェイスの取得
        if (pShellLink->QueryInterface(IID_IPersistFile, 
                    (void**)&pPersistFile) != S_OK)
            throw(FALSE);

        // [6] ファイルに保存
        if (pPersistFile->Save(SCPath, true) != S_OK)
            throw(FALSE);
        throw(TRUE); // 成功
    }
    catch(BOOL IsOK)
    {
        // [7][8] オブジェクト解放
        if (pPersistFile != NULL)
            pPersistFile->Release();
        if (pShellLink != NULL)
            pShellLink->Release();

        // [9] OLE終了処理
        CoUninitialize();
        if (!IsOK){
            MessageBox(NULL, TEXT("ショートカット作成失敗"), NULL, MB_OK);
        }
        return IsOK;
    }
}

という様なソースになります。これを実行すれば、Cドライブのルートに、メモ帳へのショートカットが作成されています。他にも指定する項目がありますが、IShellLinkを、MSDNか何かで調べていただければSet***という風なメソッドが見つかりますので、それを使用して設定することができます。

00/05/28……関数のミスを修正。Unicode環境対応。コメントを増やす
00/01/08……使いやすくするため、関数化してみました。また、変数名もわかりやすくしました
00/03/17……boolをBOOLにした。