ショートカットを作る

プログラムからショートカットを作りたくなることがある。
サブルーチン化して使っているので、ここに記録しておく。

subShortcut.h

//        ショートカットを作成する
//---------------------------------------------------------------------------
#ifndef subShortcutH
#define subShortcutH
//---------------------------------------------------------------------------
bool subCreateShortCut(AnsiString strMAKE, AnsiString strPATH,
                AnsiString strARG, AnsiString strDIR, AnsiString strDESC);
//---------------------------------------------------------------------------
#endif

subShortcut.cpp

//        ショートカットを作成する
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include <shlobj.h>
#include <alloc.h>

#include "subShortcut.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
//---------------------------------------------------------------------------

bool subCreateShortCut(AnsiString strMAKE, AnsiString strPATH,
                AnsiString strARG, AnsiString strDIR, AnsiString strDESC)
{
    //    ショートカットを作成する
    //         strMAKE : 作るショートカットの名前(*.lnkとする)
    //        strPATH : ショートカットのリンク先
    //        strARG  : 引数
    //        strDIR  : 作業ディレクトリ
    //        strDESC : 説明
    //        戻り値  : 成功するとtrue 失敗するとfalse
    char cPATH[MAX_PATH], *cARG, cDIR[MAX_PATH], *cDSC;
    bool bRET = false;

    IShellLink *slTMP;
    IPersistFile *pfTMP;
    wchar_t wPATH[MAX_PATH];
    HRESULT hRES = NULL;

    try    {
        //    COMライブラリの初期化
        CoInitialize(NULL);

        //    IShellLinkオブジェクトの生成
        hRES = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (void **)&slTMP);

        if (SUCCEEDED(hRES))    {

            hRES = slTMP->QueryInterface(IID_IPersistFile, (void **)&pfTMP);

            if (SUCCEEDED(hRES))    {
                //    作成するショートカット名をUnicodeに変換しておく
                MultiByteToWideChar(CP_ACP, 0, strMAKE.c_str(), -1, wPATH, MAX_PATH);

                //    引数をchar配列に変換
                strcpy(cPATH, strPATH.c_str());
                cARG = (char*)malloc(strARG.Length() + 1);
                strcpy(cARG, strARG.c_str());
                strcpy(cDIR, strDIR.c_str());
                cDSC = (char*)malloc(strDESC.Length() + 1);
                strcpy(cDSC, strDESC.c_str());

                //    パラメータの設定
                slTMP->SetPath(cPATH);
                slTMP->SetArguments(cARG);
                slTMP->SetWorkingDirectory(cDIR);
                slTMP->SetDescription(cDSC);

                //    ショートカットの作成
                hRES = pfTMP->Save(wPATH, TRUE);
                if (SUCCEEDED(hRES))    {
                     bRET = true;
                }

                pfTMP->Release();

                //    メモリの開放
                free(cARG);
                free(cDSC);
            }
            slTMP->Release();
        }
        CoUninitialize();
    }
    catch(...)    {
        bRET = false;
    }

    return bRET;
}
//---------------------------------------------------------------------------

※このサブルーチンを使うプロジェクトでは、「プロジェクト-オプション-C++コンパイラ-パスと定義」の部分で、「条件定義」に「NO_WIN32_LEAN_AND_MEAN」をセットしないとコンパイルエラーになるので注意!


トップ   編集 凍結解除 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2012-12-09 (日) 22:30:50