**ショートカットを作る [#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」をセットしないとコンパイルエラーになるので注意!