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

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