Last Updated 2007/10/18
Programming Tips Windows ショートカット  索 引 
ショートカットファイルの作成
2003/10/28

以下の関数がサンプルとなる.
以下の関数を呼ぶプロジェクトは呼び出し前に CoInitialize(NULL),呼び出し後に CoUninitialize() を呼び出す必要がある.
(たとえば起動時と終了時に)

また,シェルの COM はユニコードを使用しているので,Load() や Save() 前にはユニコードへの変換が必要である.

#include <shlobj.h>

BOOL CreateLinkFile(HWND hwndParent,
                   LPSTR lpShortcutFile,  // 作成する[*.lnk]のフルパス名
                   LPSTR lpDiscName,      // ディスクリプション名
                   LPSTR lpTargetFile     // リンク元のファイルのフルパス名
                   )
{
    BOOL bRet = FALSE;
    HRESULT  hres;
    IShellLink *psl; 
    char szFolder[MAX_PATH];

    // IShellLink インターフェースの取得
    hres = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER,
                          IID_IShellLink, (void **)&psl);
    if( SUCCEEDED(hres) ) {
        IPersistFile *ppf;

        // IPersistFile インターフェースの取得
        hres = psl->QueryInterface(IID_IPersistFile, (void **)&ppf);
        if( SUCCEEDED(hres) ) {
            WORD wsz[MAX_PATH]; // ユニコード用のバッファ

            // リンク元のファイルのパスをセット
            hres = psl->SetPath(lpTargetFile);
            if( SUCCEEDED(hres) ) {
                // ショートカットファイルのディスクリプションをセット
                hres = psl->SetDescription(lpTargetDisc);
                if( SUCCEEDED(hres) ) {
                    MultiByteToWideChar(CP_ACP, 0, lpShortcutFile, -1, wsz, MAX_PATH);
                    hres = ppf->Save(wsz, TRUE);
                    if( SUCCEEDED(hres) ) bRet = TRUE;
                }
            }
            ppf->Release();
        }
        psl->Release();
    }

    return nRet;
}

リンク先の検索方法は IPersistFile インターフェイス取得後に以下を行う.

    // IPersistFile インターフェースの取得後

    hres = ppf->Load(wsz, STGM_READ);
    if( SUCCEEDED(hres) ) {
        // リンク先の検索
        hres = psl->Resolve(hwndParent, SLR_ANY_MATCH);
        if( SUCCEEDED(hres) ) {
            // リンク先のパスを取得
            hres = psl->GetPath(szFile, MAX_PATH, NULL, 0L);
            if( SUCCEEDED(hres) ) {
                // szFileがリンク先
            }
         }
    }


参照
ショートカットファイルのリンク先
前後のTips
ショートカットファイルの作成

DSS ProgrammingTipsCGI Ver2.01