ショートカットが参照しているファイルを取得 [プログラミング]
ファイル選択ダイアログでショートカットファイルを選択すると、自動でショートカットファイルが指しているファイルのパスに変換してくれます。
一方、ショートカットファイルをアプリケーションのウィンドウへドラッグ&ドロップすると、ショートカットファイルのパスが得られます。
「メモ帳」で試してみよう。
ショートカットファイルをメモ帳のウィンドウにドラッグ&ドロップすると、ショートカットファイルの中身が見えます。
もちろん、それでは都合が悪いわけで、ショートカットファイルのパスから、ショートカットが指し示しているファイルのパスを取得します。
ショートカットファイルを読み込んで、内容からファイルパスを取得しても良いのですが、やっぱりlnkファイルのフォーマットが解らないので、APIを使います。
ショートカットを作る場合と、大体同じ感じになります。
#include <objbase.h> #include <shlobj.h> /** * ショートカット先のファイルを取得 * * @param shortcut_path ショートカット * @param target_name ショートカット先のファイルの格納先 * @return 成功したらtrue */ bool get_shortcut(LPCTSTR shortcut_path, LPTSTR target_path) { const bool com_success = SUCCEEDED(::CoInitialize(NULL)); bool result = false; IShellLink* psl; HRESULT hr; hr = ::CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (void **)&psl); if (SUCCEEDED(hr)) { IPersistFile *ppf; hr = psl->QueryInterface(IID_IPersistFile, (void **)&ppf); if (SUCCEEDED(hr)) { #ifndef _UNICODE WCHAR file[MAX_PATH]; ::MultiByteToWideChar(CP_ACP, 0, shortcut_path, -1, file, MAX_PATH); hr = ppf->Load(file, STGM_READ); #else hr = ppf->Load(shortcut_path, STGM_READ); #endif if (SUCCEEDED(hr)) { // 下のコメントを外すと、 // ショートカット先のファイルが存在しない時に、 // ファイルを探すためのダイアログが表示されるようになる。 // hr = psl->Resolve(NULL, SLR_ANY_MATCH); // if (SUCCEEDED(hr)) { hr = psl->GetPath(target_path, MAX_PATH, NULL, 0); if (SUCCEEDED(hr)) { result = true; } // } } ppf->Release(); } psl->Release(); } if (com_success) ::CoUninitialize(); return result; }
重要なのは、やっぱり、ショートカットファイルに拡張子「.lnk」を忘れないこと。
で、使い方。
TCHAR path[MAX_PATH]; ::SHGetSpecialFolderPath(NULL, path, CSIDL_DESKTOP, FALSE); ::PathAppend(path, _T("メモちょー.lnk")); TCHAR target[MAX_PATH]; if (get_shortcut(path, target)) { std::cout << target << std::endl; }
デスクトップのショートカット「メモちょー」が指しているファイルのパスがtarget
に入ります。
今日の二冊 | |
|
タグ:VisualC++
2006-08-26 08:47
nice!(0)
コメント(0)
トラックバック(0)
コメント 0