C++ 获取快捷方式指向的路径

通常我们直接用ShellExecute函数 来打开指向exe的link文件(即快捷方式,XX.lnk),这样的操作与直接打开exe一样,没有有特别的操作。但是在某些情况下,其他的AP有可能 会动到操作系统的设定,在这种情况下,用ShellExecute函数来直接打开link文件(ShortCut)的方法就会失效,无论如何,如果能从 link文件中直接得到exe的路径、然后再用ShellExecute打开,这会是最保险的方式。下面的例程展示了这样的方法:

HRESULT CManage::OpenExeLinkFile(TCHAR *linkPath)
{
    TCHAR szLinkPath[MAX_PATH] = {0};
    lstrcpy(szLinkPath,linkPath);

    TCHAR extName[MAX_PATH] = {0};
    _wsplitpath(szLinkPath, NULL, NULL, NULL, extName);
    if (lstrcmp(extName, L".lnk") == 0)
    {
        if (GetShortCutFile(szLinkPath, linkPath, MAX_PATH))
        {
            lstrcpy(szLinkPath,linkPath);
            _wsplitpath(szLinkPath, NULL, NULL, NULL, extName);
            if (lstrcmp(extName, L".exe") != 0)
            {
                return S_OK; //not exe, return
            }
        }
    }

    TCHAR *pFind1=_tcsrchr(szLinkPath,L'\\');
    if (pFind1 != NULL)
    {
        *pFind1 = L'\0';
        pFind1 = NULL;
    }

    ShellExecute(NULL,_T("Open"),linkPath,NULL,szLinkPath,SW_SHOWNORMAL);

    return S_OK;
}

BOOL CManage::GetShortCutFile(WCHAR* ShortcutFile,WCHAR* buf,int nSize)  
{   
    HRESULT           hres;   
    IShellLink        *psl;   
    IPersistFile      *ppf;   
    WIN32_FIND_DATA   fd;


    hres = CoCreateInstance(CLSID_ShellLink,NULL,CLSCTX_INPROC_SERVER,IID_IShellLink,(void**)&psl);   
    if(!SUCCEEDED(hres))   
        return   false; 

    hres = psl->QueryInterface(IID_IPersistFile,(void**)&ppf);   
    if(SUCCEEDED(hres))   
    {   
        //wchar_t wsz[MAX_PATH];   //buffer   for   Unicode   string
        //MultiByteToWideChar(CP_ACP,0,ShortcutFile,-1,wsz,MAX_PATH);   
        //hres = ppf->Load(wsz,STGM_READ);

        hres = ppf->Load(ShortcutFile,STGM_READ);
        if(SUCCEEDED(hres))   
        hres = psl->GetPath(buf,nSize,&fd,0);   
        ppf->Release();   
    }   
    psl->Release(); 

    return SUCCEEDED(hres);  
}

posted @ 2013-03-07 09:21  天涯海角路  阅读(2510)  评论(0)    收藏  举报