ショートカットを作成するには
今回は「ショートカット」を作成するわけですが、これには、OLEを使用する必要があります。OLEってなんだ?っていう方もおられると思いますが、私もその一人ですのであまり詳しいことは知りません。が、簡単なところは分かってきたのでこの記事を書きます。
では、手順を整理してみますと、このようになります。
- シェル関係のヘッダ(shlobj.h)をインクルード
- OLEを初期化する。
- IShellLink インターフェイスを作る
- SetPathメソッドを使って、リンク先を設定する
- QueryInterfaceメソッドを使って、IPersistFileインターフェイスのポインタを得る
- IPersistFileインターフェイスのSaveメソッドを呼び出してファイルに保存する
このとき、保存先ファイル名はUNICODE(wchar_t*またはBSTR,OLECHAR*)で指定する。 - IPersistFileインターフェイスのReleaseメソッドでIPersistFileインターフェイスを解放
- IShellLinkインターフェイスのReleaseメソッドでIShellLinkインターフェイスを解放
- OLEの終了処理
という流れになります。今回は、OLEドラッグドロップの機能は使用しないため、初期化にはCoInitialize APIを、終了には、CoUninitialize APIを使うことにします。(プログラムの開始時にすでに初期化する様なアプリケーションの場合、1,2.9は必要ありません)
また、エラーチェック箇所が多く、終了時の処理も多いため、今回は例外処理を使いました。
throw(FALSE) …… 失敗時
throw(TRUE) …… 成功時
#include <windows.h> #include <shlobj.h> // [1]シェル関係ヘッダ //関数プロトタイプ BOOL CreateShortCut(LPCTSTR lpShortCutPath, LPCTSTR lpTargetFile); int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { //メモ帳へのショートカットをC:\ルートに作成します。 CreateShortCut("C:\\notepad.lnk", "C:\\WINDOWS\\notepad.exe"); return 0; } 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; } }
という様なソースになります。これを実行すれば、Cドライブのルートに、メモ帳へのショートカットが作成されています。他にも指定する項目がありますが、IShellLinkを、MSDNか何かで調べていただければSet***という風なメソッドが見つかりますので、それを使用して設定することができます。
00/05/28……関数のミスを修正。Unicode環境対応。コメントを増やす
00/01/08……使いやすくするため、関数化してみました。また、変数名もわかりやすくしました
00/03/17……boolをBOOLにした。
記事の無断転載は禁止です。 Copyright 1999-2001 Runan. All Rights Reserved.