SSブログ

ショートカットが参照しているファイルを取得 [プログラミング]

ファイル選択ダイアログでショートカットファイルを選択すると、自動でショートカットファイルが指しているファイルのパスに変換してくれます。
一方、ショートカットファイルをアプリケーションのウィンドウへドラッグ&ドロップすると、ショートカットファイルのパスが得られます。

「メモ帳」で試してみよう。
ショートカットファイルをメモ帳のウィンドウにドラッグ&ドロップすると、ショートカットファイルの中身が見えます。

もちろん、それでは都合が悪いわけで、ショートカットファイルのパスから、ショートカットが指し示しているファイルのパスを取得します。

ショートカットファイルを読み込んで、内容からファイルパスを取得しても良いのですが、やっぱり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に入ります。

[船] 今日の二冊
はてしない物語 (上) (岩波少年文庫 (501))

はてしない物語 (上) (岩波少年文庫 (501))

  • 作者: ミヒャエル・エンデ
  • 出版社/メーカー: 岩波書店
  • 発売日: 2000/06
  • メディア: 単行本(ソフトカバー)

タグ:VisualC++
nice!(0)  コメント(0)  トラックバック(0) 

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。