以下の関数がサンプルとなる.
以下の関数を呼ぶプロジェクトは呼び出し前に CoInitialize(NULL),呼び出し後に CoUninitialize() を呼び出す必要がある.
(たとえば起動時と終了時に)
また,シェルの COM はユニコードを使用しているので,Load() や Save() 前にはユニコードへの変換が必要である.
#include <shlobj.h>
BOOL CreateLinkFile(HWND hwndParent,
LPSTR lpShortcutFile, // 作成する[*.lnk]のフルパス名
LPSTR lpDiscName, // ディスクリプション名
LPSTR lpTargetFile // リンク元のファイルのフルパス名
)
{
BOOL bRet = FALSE;
HRESULT hres;
IShellLink *psl;
char szFolder[MAX_PATH];
// IShellLink インターフェースの取得
hres = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER,
IID_IShellLink, (void **)&psl);
if( SUCCEEDED(hres) ) {
IPersistFile *ppf;
// IPersistFile インターフェースの取得
hres = psl->QueryInterface(IID_IPersistFile, (void **)&ppf);
if( SUCCEEDED(hres) ) {
WORD wsz[MAX_PATH]; // ユニコード用のバッファ
// リンク元のファイルのパスをセット
hres = psl->SetPath(lpTargetFile);
if( SUCCEEDED(hres) ) {
// ショートカットファイルのディスクリプションをセット
hres = psl->SetDescription(lpTargetDisc);
if( SUCCEEDED(hres) ) {
MultiByteToWideChar(CP_ACP, 0, lpShortcutFile, -1, wsz, MAX_PATH);
hres = ppf->Save(wsz, TRUE);
if( SUCCEEDED(hres) ) bRet = TRUE;
}
}
ppf->Release();
}
psl->Release();
}
return nRet;
}
リンク先の検索方法は IPersistFile インターフェイス取得後に以下を行う.
// IPersistFile インターフェースの取得後
hres = ppf->Load(wsz, STGM_READ);
if( SUCCEEDED(hres) ) {
// リンク先の検索
hres = psl->Resolve(hwndParent, SLR_ANY_MATCH);
if( SUCCEEDED(hres) ) {
// リンク先のパスを取得
hres = psl->GetPath(szFile, MAX_PATH, NULL, 0L);
if( SUCCEEDED(hres) ) {
// szFileがリンク先
}
}
}
参照
ショートカットファイルのリンク先