Holy cow, I wrote a book!
A customer was having trouble obtaining information from a shortcut file. "Here is a sample program that tries to print the target of a shortcut file, but it only gets the file name without a directory. How do I get the full path?"
IShellLink *psl; ... code that loads the IShellLink omitted ... TCHAR szPath[MAX_PATH]; WIN32_FIND_DATA wfd; hr = psl->GetPath(szPath, MAX_PATH, &wfd, SLGP_UNCPATH); if (SUCCEEDED(hr)) { _tprintf(TEXT("Got path: %s\n"), wfd.cFileName); }
Recall that the WIN32_FIND_DATA structure contains only a file name in the cFileName member. It doesn't have any path information. The WIN32_FIND_DATA structure was originally created for the FindFirstFile function, and you already know the directory you are searching in because you passed it to FindFirstFile.
WIN32_FIND_DATA
cFileName
FindFirstFile
But we're not using the WIN32_FIND_DATA structure in conjunction with FindFirstFile, so where do I get the directory from?
In the customer's excitement over the WIN32_FIND_DATA structure, they forgot about that other parameter: szPath.
szPath
if (SUCCEEDED(hr)) { _tprintf(TEXT("Got path: %s\n"), szPath); }
(Don't forget, the target of the shortcut might not be a file, in which case the call to GetPath will return S_FALSE.)
GetPath
S_FALSE