Sample Code
The following code shows how to obtain the filename or path and description of a given link file:
#include <windows.h> #include <shlobj.h> // GetLinkInfo() fills the filename and path buffer // with relevant information. // hWnd - calling application's window handle. // // lpszLinkName - name of the link file passed into the function. // // lpszPath - the buffer that receives the file's path name. // // lpszDescription - the buffer that receives the file's // description. HRESULT GetLinkInfo( HWND hWnd, LPCTSTR lpszLinkName, LPSTR lpszPath, LPSTR lpszDescription) { HRESULT hres; IShellLink *pShLink; WIN32_FIND_DATA wfd; // Initialize the return parameters to null strings. *lpszPath = '\0'; *lpszDescription = '\0'; // Call CoCreateInstance to obtain the IShellLink // Interface pointer. This call fails if // CoInitialize is not called, so it is assumed that // CoInitialize has been called. hres = CoCreateInstance( &CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, &IID_IShellLink, (LPVOID *)&pShLink ); if (SUCCEEDED(hres)) { IPersistFile *ppf; // The IShellLink Interface supports the IPersistFile // interface. Get an interface pointer to it. hres = pShLink->lpVtbl->QueryInterface(pShLink, &IID_IPersistFile, (LPVOID *)&ppf ); if (SUCCEEDED(hres)) { WORD wsz[MAX_PATH]; // Convert the given link name string to a wide character string. MultiByteToWideChar( CP_ACP, 0, lpszLinkName, -1, wsz, MAX_PATH ); // Load the file. hres = ppf->lpVtbl->Load(ppf, wsz, STGM_READ ); if (SUCCEEDED(hres)) { // Resolve the link by calling the Resolve() interface function. // This enables us to find the file the link points to even if // it has been moved or renamed. hres = pShLink->lpVtbl->Resolve(pShLink, hWnd, SLR_ANY_MATCH | SLR_NO_UI); if (SUCCEEDED(hres)) { // Get the path of the file the link points to. hres = pShLink->lpVtbl->GetPath( pShLink, lpszPath, MAX_PATH, &wfd, SLGP_SHORTPATH ); // Only get the description if we successfully got the path // (We can't return immediately because we need to release ppf & // pShLink.) if(SUCCEEDED(hres)) { // Get the description of the link. hres = pShLink->lpVtbl->GetDescription(pShLink, lpszDescription, MAX_PATH ); } } } ppf->lpVtbl->Release(ppf); } pShLink->lpVtbl->Release(pShLink); } return hres; }