プログラムからショートカットを作りたくなることがある。
サブルーチン化して使っているので、ここに記録しておく。
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」をセットしないとコンパイルエラーになるので注意!