ショートカットから、そのリンク先を取得するには、ショートカットをロードし、その内容を取得します。
// ショートカットのロード
bool loadShellLink(IShellLink* psl, const WCHAR *wcLinkName, DWORD dwMode)
{
HRESULT hr;
IPersistFile *ppf;
if(psl->QueryInterface(IID_IPersistFile, (void**)&ppf) != S_OK){
return false;
}
hr = ppf->Load(wcLinkName, dwMode);
ppf->Release();
return (hResult == S_OK);
}
// ショートカットのリンク先を取得
bool getTargetFile(const char* sLinkFile, CString& strTarget, WIN32_FIND_DATA* wfd)
{
IShellLink* psl;
WCHAR wcLinkFile[MAX_PATH+1];
bool ret(false);
// インターフェイスを初期化
CoInitialize(NULL);
if(S_OK == CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (void **)&psl)){
MultiByteToWideChar(CP_ACP, 0, sLinkFile, -1, wcLinkFile, MAX_PATH);
// ショートカットのロード
if(loadShellLink(psl, wcLinkFile, STGM_READ)){
// リンク先を取得
char TargetFile[MAX_PATH];
psl->GetPath(TargetFile, MAX_PATH, wfd, SLGP_UNCPRIORITY);
strTarget = TargetFile;
// 戻り値を成功に設定
ret = true;
}
psl->Release();
}
CoUninitialize();
return ret;
}
|