予想外のフィードバックに、コードを引用し直すことにする。
ショートカットを作成するには(暁の傭兵 ソフトはうす)より:
BOOL CreateShortCut(LPCTSTR lpShortCutPath, LPCTSTR lpTargetFile)
{
HRESULT hr; //いろいろな戻り値を入れる
IShellLink *pShellLink = NULL;
IPersistFile *pPersistFile = NULL;
OLECHAR SCPath[500]; //保存先のパスはUnicode
#ifndef UNICODE
// ANSI環境なら保存先パスをUnicodeに変換
MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, lpShortCutPath, -1,
SCPath, MAX_PATH );
#endif
try{
// [2] OLE初期化
CoInitialize(NULL);
// [3] IShellLinkインターフェイスの作成
hr = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER,
IID_IShellLink, (void**)&pShellLink);
if (hr != S_OK)
throw(FALSE);
// [4] リンク先パスの設定
pShellLink->SetPath(lpTargetFile);
// [5] IPersistFileインターフェイスの取得
if (pShellLink->QueryInterface(IID_IPersistFile,
(void**)&pPersistFile) != S_OK)
throw(FALSE);
// [6] ファイルに保存
if (pPersistFile->Save(SCPath, true) != S_OK)
throw(FALSE);
throw(TRUE); // 成功
}
catch(BOOL IsOK)
{
// [7][8] オブジェクト解放
if (pPersistFile != NULL)
pPersistFile->Release();
if (pShellLink != NULL)
pShellLink->Release();
// [9] OLE終了処理
CoUninitialize();
if (!IsOK){
MessageBox(NULL, TEXT("ショートカット作成失敗"), NULL, MB_OK);
}
return IsOK;
}
}
MSDN をつらつら調べたけど、ショートカットを作成するには、この COM オブジェクトを使った方法しか無いように思う。昔やったけど、コードを紛失してしまっているので、どのようにしてやったのかわからない。
言われて思い出したけど、クラス作ってデストラクタで後始末する、でも良いと思う。
class CreateShortcut
{
private:
IPersistFile* pPersistFile;
IShellLink* pShellLink;
OLECHAR* pSourcePath;
public:
CreateShortcut(LPCTSTR sourcePath) {
USES_CONVERSION;
pPersistFile = NULL;
pShellLink = NULL;
OLECHAR* src = T2W(const_cast<LPTSTR>(sourcePath));
pSourcePath = new OLECHAR[wcslen(src) + 1];
wcscpy(pSourcePath, sourcePath);
};
~CreateShortcut(void) {
delete[] pSourcePath;
if (pShellLink != NULL) {
pShellLink->Release();
}
if (pPersistFile != NULL) {
pPersistFile->Release();
}
};
bool CreateTo(LPCTSTR targetPath)
{
USES_CONVERSION;
HRESULT hr;
hr = CoCreateInstance(
CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER
, IID_IShellLinkW, (LPVOID*) &this->pShellLink);
if (hr != S_OK) {
return false;
}
this->pShellLink->SetPath(this->pSourcePath);
hr = this->pShellLink->QueryInterface(
IID_IPersistFile, (LPVOID*) &this->pPersistFile);
if (hr != S_OK) {
return false;
}
hr = this->pPersistFile->Save(
T2W(const_cast<LPTSTR>(targetPath)), TRUE);
if (hr != S_OK) {
return false;
} else {
return true;
}
};
};
こんな感じ?IID_IShellLink が定義されていない、ってエラーがでるので、shobjidl.h を見ると、IID_IShellLinkW と IID_IShellLinkA は定義されているけど、IID_IShellLink は定義されていなかった...こんなモン?
CoInitialize, CoUninitialize は、使う側で行うこと。
一応動くけど、targetPath に指定する拡張子は ".lnk" で無ければならないはず。
投稿日時 : 2007年9月28日 20:25