Here's a function.
Code:
#include <windows.h>
#include <objidl.h> /* For IPersistFile */
#include <shlobj.h> /* For IShellLink */
#if defined(_MSC_VER)
#pragma comment(lib, "ole32.lib")
#pragma comment(lib, "uuid.lib")
#endif
/*
* GetShortcutTarget
* Retrieves the path that a shortcut file points to.
*
* Paramaters:
* szShortcutFile The path to the shortcut file.
* szTarget Pointer to a buffer that will receive the target path.
* The buffer length should be at least MAX_PATH characters.
* cchTarget The size of the szTarget buffer, in characters.
*
* Return:
* A non-zero value is returned on success. If the function fails zero
* will be returned. GetLastError can NOT be called to get an additional error code.
*
* Runtime requirements:
* CoInitialize or CoInitializeEx must have been called before using this function.
*
* Compile requirements:
* C++. Include <windows.h>, <objidl.h> & <shlobj.h>. Link "uuid.lib".
*/
BOOL GetShortcutTarget(LPCTSTR szShortcutFile, LPTSTR szTarget, SIZE_T cchTarget)
{
IShellLink* psl = NULL;
IPersistFile* ppf = NULL;
BOOL bResult = FALSE;
if (FAILED( CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (void **) &psl) ))
goto cleanup;
if (FAILED( psl->QueryInterface(IID_IPersistFile, (void **) &ppf) ))
goto cleanup;
# if !defined(UNICODE)
WCHAR wsz[MAX_PATH];
if (0 == MultiByteToWideChar(CP_ACP, 0, szShortcutFile, -1, wsz, MAX_PATH) )
goto cleanup;
# else
LPCWSTR wsz = szShortcutFile;
# endif
if (FAILED( ppf->Load(wsz, STGM_READ) ))
goto cleanup;
if (NOERROR != psl->GetPath(szTarget, cchTarget, NULL, 0) )
goto cleanup;
bResult = TRUE;
cleanup:
if (ppf) ppf->Release();
if (psl) psl->Release();
if (!bResult && cchTarget != 0) szTarget[0] = TEXT('\0');
return bResult;
}
#if 1 /* Test code. */
#include <stdio.h>
#include <tchar.h>
int main(void)
{
TCHAR szTarget[MAX_PATH];
CoInitialize(NULL);
GetShortcutTarget(
TEXT("C:\\Documents and Settings\\All Users\\Start Menu\\")
TEXT("Programs\\Accessories\\Calculator.lnk"),
szTarget, MAX_PATH);
_tprintf(TEXT("The shortcut target is '%s'.\n"), szTarget);
CoUninitialize();
getchar();
return 0;
}
#endif