|
こんにちは。MAKOPIです。
> .lnkファイル(のファイル名)からフォルダ名を一発で取り出す簡単な方法が
>あったらうれしいんですが…。IPersistFileやらIShellLinkやらという処理を書
>いていて挫折しました。
>
いまさらですが、以下みたいな感じでどうですか?
------
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow )
{
char szPath[MAX_PATH];
GetFilePathForShortCut(NULL, "C:\\Temp\\HOGEへのショートカット.lnk",szPath,
MAX_PATH);
return 0;
}
//// ショートカットファイルが指すパス取得関数
#include <shlobj.h>
HRESULT GetFilePathForShortCut(HWND hWnd, // in :ウィンドウハンドル
LPCTSTR lpszShortcutFilePath, // in :ショートカットファイルパス
LPTSTR pszFilePath, // out :ショートカットが示すファイルパス
int nFilePathBufSize ) // out :pszFilePathのサイズ
{
HRESULT hres;
IShellLink *psl;
WORD wsz[MAX_PATH]; // Unicode String
WIN32_FIND_DATA wfd;
// Initilize COM(どこかでやっていれば必要なし)
::CoInitialize(NULL);
// 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))
{
// Unicodeに変換
::MultiByteToWideChar(CP_ACP, 0, lpszShortcutFilePath, -1, wsz, MAX_PATH);
// ショートカットファイルのロード
hres = ppf->Load(wsz, STGM_READ);
if(SUCCEEDED(hres))
{
// ショートカットの解決
hres = psl->Resolve(hWnd, SLR_ANY_MATCH);
if(SUCCEEDED(hres))
{
// ショートカットの指す、ファイルおよびフォルダのフルパス取得
hres = psl->GetPath(pszFilePath, nFilePathBufSize,
(WIN32_FIND_DATA *)&wfd, 0 /*SLGP_SHORTPATH*/ );
}
}
ppf->Release(); // IPersistFileの開放
}
psl->Release(); // IShellLinkの開放
}
return hres;
}
|
|