Code:
#pragma comment( lib, "ole32.lib" )
#include <windows.h>
#include <stdio.h>
#include <shobjidl.h>
#include <objbase.h>
#include <shlguid.h>
HRESULT GetPath(HWND hwnd, char *pLinkFile, char *pReturnPath)
{
HRESULT hres;
IShellLink* psl;
char szPath[MAX_PATH] = {0};
char szDescription[MAX_PATH] = {0};
WIN32_FIND_DATA wfd;
hres = CoCreateInstance(CLSID_ShellLink, NULL,
CLSCTX_INPROC_SERVER, IID_IShellLink, (LPVOID *) &psl);
if (SUCCEEDED(hres))
{
IPersistFile* ppf;
hres = psl->QueryInterface(IID_IPersistFile, (void**)&ppf);
if (SUCCEEDED(hres))
{
WCHAR wLinkFile[MAX_PATH];
MultiByteToWideChar(CP_ACP, 0, pLinkFile, -1, wLinkFile,
MAX_PATH);
hres = ppf->Load(wLinkFile, STGM_READ);
if (SUCCEEDED(hres))
{
hres = psl->Resolve(hwnd, 0);
if (SUCCEEDED(hres))
{
hres = psl->GetPath(szPath,
MAX_PATH, (WIN32_FIND_DATA *)&wfd,
SLGP_SHORTPATH );
if (FAILED(hres))
printf("GetPath failed\n");
hres = psl->GetDescription(szDescription, MAX_PATH);
if (FAILED(hres))
printf("GetDescription failed\n");
strcpy(pReturnPath, szPath);
}
}
ppf->Release();
}
psl->Release();
}
return hres;
}
int main(void)
{
char szReturn[512] = {0};
CoInitialize(NULL);
GetPath(NULL, "c:\\Docume~1\\Alluse~1\\desktop\\Wireshark.lnk" , szReturn);
printf("%s\n", szReturn);
CoUninitialize();
return 0;
}