ソフトウェア開発 Win32プログラミング

ショートカットファイルのリンク先を取得する

戻る


ショートカットファイル(拡張子.LNK)のリンク先を取得するには、次のようなコードを使う。

#include <windows.h>
#include <shlobj.h>

BOOL GetPathOfShortcut(HWND hWnd, LPCTSTR pszLnkFile, LPTSTR pszPath)
{
    TCHAR           szPath[MAX_PATH];
#ifndef UNICODE
    WCHAR           wsz[MAX_PATH];
#endif
    IShellLink*     pShellLink;
    IPersistFile*   pPersistFile;
    WIN32_FIND_DATA find;
    BOOL            bRes = FALSE;
 
    szPath[0] = '\0';
    HRESULT hRes = CoInitialize(NULL);
    if (SUCCEEDED(hRes))
    {
        if (SUCCEEDED(hRes = CoCreateInstance(CLSID_ShellLink, NULL, 
            CLSCTX_INPROC_SERVER, IID_IShellLink, (LPVOID *)&pShellLink)))
        {
            if (SUCCEEDED(hRes = pShellLink->QueryInterface(IID_IPersistFile, 
                (VOID **)&pPersistFile)))
            {
#ifndef UNICODE
                MultiByteToWideChar(CP_ACP, 0, pszLnkFile, -1, wsz, MAX_PATH);
                hRes = pPersistFile->Load(wsz, STGM_READ);
#else
                hRes = pPersistFile->Load(pszLnkFile,  STGM_READ);
#endif
                if (SUCCEEDED(hRes))
                {
                    if (SUCCEEDED(hRes = pShellLink->GetPath(
                        szPath, MAX_PATH, &find, 0)))
                    {
                        if ('\0' != szPath[0])
                        {
                            lstrcpy(pszPath, szPath);
                            bRes = TRUE;
                        }
                    }
                }
                pPersistFile->Release();
            }
            pShellLink->Release();
        }
        CoUninitialize();
    }
    return bRes;
}
 
#ifdef UNITTEST
#include <stdio.h>
int main(int argc, char **argv)
{
    BOOL f;
    TCHAR szPath[MAX_PATH];
    f = GetPathOfShortcut(NULL, argv[1], szPath);
    printf("Path: %s\n", szPath);
    return f;
}
#endif

ソース: sgetpath.zip


戻る

©片山博文MZ
katayama.hirofumi.mz@gmail.com

inserted by FC2 system