微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

windows在c中读取快捷方式文件的目标

如何在Windows上读取快捷方式文件的目标.尝试使用boost :: read_symlink抛出异常,说“文件或目录不是重新分析点”消息.
int main(int argc,_TCHAR* argv[])
{           
    try {
    boost::filesystem::path target = boost::filesystem::read_symlink("c:\\tmp\\blobstore_2.lnk");
    cout<<target.string();
    } catch(const boost::filesystem::filesystem_error& ex)
    {
        cout<<"in catch"<<ex.what(); // prints "the file or directory is not a reparse point"
    }

    std::ifstream smbConfStream("c:\\tmp\\sym_file_2.lnk");
    string ss((std::istreambuf_iterator<char>(smbConfStream)),std::istreambuf_iterator<char>());
    cout <<endl<<" ss: "<<ss; // From the output of the "ss" it looks like the information of the target is present inside ss along with other binary data. How to cleanly get the target out.

    int i;
    cin>>i;

    return 0;
}
Windows .lnk文件不是符号链接.这是一个快捷方式文件.您使用 IShellLink接口来操作它.

documentation包含以下示例,演示如何解析快捷方式文件.

// ResolveIt - Uses the Shell's IShellLink and IPersistFile interfaces 
//             to retrieve the path and description from an existing shortcut. 
//
// Returns the result of calling the member functions of the interfaces. 
//
// Parameters:
// hwnd         - A handle to the parent window. The Shell uses this window to 
//                display a dialog Box if it needs to prompt the user for more 
//                information while resolving the link.
// lpszLinkFile - Address of a buffer that contains the path of the link,//                including the file name.
// lpszPath     - Address of a buffer that receives the path of the link
                  target,including the file name.
// lpszDesc     - Address of a buffer that receives the description of the 
//                Shell link,stored in the Comment field of the link
//                properties.

#include "stdafx.h"
#include "windows.h"
#include "shobjidl.h"
#include "shlguid.h"
#include "strsafe.h"

HRESULT ResolveIt(HWND hwnd,LPCSTR lpszLinkFile,LPWSTR lpszPath,int iPathBufferSize) 
{ 
    HRESULT hres; 
    IShellLink* psl; 
    WCHAR szGotPath[MAX_PATH]; 
    WCHAR szDescription[MAX_PATH]; 
    WIN32_FIND_DATA wfd; 

    *lpszPath = 0; // Assume failure 

    // Get a pointer to the IShellLink interface. It is assumed that CoInitialize
    // has already been called. 
    hres = CoCreateInstance(CLSID_ShellLink,NULL,CLSCTX_INPROC_SERVER,IID_IShellLink,(LPVOID*)&psl); 
    if (SUCCEEDED(hres)) 
    { 
        IPersistFile* ppf; 

        // Get a pointer to the IPersistFile interface. 
        hres = psl->QueryInterface(IID_IPersistFile,(void**)&ppf); 

        if (SUCCEEDED(hres)) 
        { 
            WCHAR wsz[MAX_PATH]; 

            // Ensure that the string is Unicode. 
            MultiBytetoWideChar(CP_ACP,lpszLinkFile,-1,wsz,MAX_PATH); 

            // Add code here to check return value from MultiByteWideChar 
            // for success.

            // Load the shortcut. 
            hres = ppf->Load(wsz,STGM_READ); 

            if (SUCCEEDED(hres)) 
            { 
                // Resolve the link. 
                hres = psl->Resolve(hwnd,0); 

                if (SUCCEEDED(hres)) 
                { 
                    // Get the path to the link target. 
                    hres = psl->GetPath(szGotPath,MAX_PATH,(WIN32_FIND_DATA*)&wfd,SLGP_SHORTPATH); 

                    if (SUCCEEDED(hres)) 
                    { 
                        // Get the description of the target. 
                        hres = psl->GetDescription(szDescription,MAX_PATH); 

                        if (SUCCEEDED(hres)) 
                        {
                            hres = StringCbcopy(lpszPath,iPathBufferSize,szGotPath);
                            if (SUCCEEDED(hres))
                            {
                                // Handle success
                            }
                            else
                            {
                                // Handle the error
                            }
                        }
                    }
                } 
            } 

            // Release the pointer to the IPersistFile interface. 
            ppf->Release(); 
        } 

        // Release the pointer to the IShellLink interface. 
        psl->Release(); 
    } 
    return hres; 
}

原文地址:https://www.jb51.cc/windows/371837.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐