2014-04-10 18 views
5

'daki kısayol dosyasının hedefini okuyor Windows'ta kısayol dosyasının hedefi nasıl okunur. "Dosya veya dizin bir reparse noktası değil" diyerek istisna atar destek :: read_symlink kullanarak çalıştı.Windows, C++

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; 
} 
+0

Kısayol dosyalarına, Sembolik Bağlar Bağlantı noktalarına vb. Neden oluyorsunuz? Bunlar farklıdır ve farklı şekilde işlenir. (en.wikipedia.org/wiki/NTFS_symbolic_link) (en.wikipedia.org/wiki/Symbolic_link) – Newtopian

cevap

14
Bir Windows .lnk dosyası sembolik bir bağlantı değildir. Bu bir kısayol dosyası. Işlemek için IShellLink arabirimini kullanın.

documentation, aşağıdaki örnekte bir kısayol dosyasının nasıl çözüleceğini gösterir.

// 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, 0, 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; 
} 
+0

Bunu derleyen bir zamanım var; Windows SDK üstbilgileri ve Visual Studio 10 başlıklarından oluşan bir setim var. Https://github.com/nihon-tc/LFMtest/tree/master/header Microsoft kod tabanı. Sadece bir aptal .lnk dosyasını açmak için ihtiyacım olan ek başlıklar var mı? – ThorSummoner