#include <objbase.h>
#include <Shlobj.h>
BOOL ResolveShortCut(LPCSTR pszShortcutFile,
CHAR pszPath[MAX_PATH+1], CHAR szDescription[MAX_PATH+1])
{
BOOL bRet = FALSE;
*pszPath = 0; // assume failure
*szDescription = 0;
IShellLink* psl = NULL;
IPersistFile* ppf = NULL;
//init COM
//CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
do
{
HRESULT hres;
// Get a pointer to the IShellLink interface.
if(FAILED(hres = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER,
IID_IShellLink, (void**)&psl)))
{
break;
}
// Get a pointer to the IPersistFile interface.
if(FAILED(hres = psl->QueryInterface(IID_IPersistFile, (void**)&ppf)))
{
break;
}
WCHAR wsz[MAX_PATH];
// Ensure string is Unicode.
MultiByteToWideChar(CP_ACP, 0, pszShortcutFile, -1, wsz, MAX_PATH);
// Load the shell link.
if(FAILED(hres = ppf->Load(wsz, STGM_READ)))
{
break;
}
// Resolve the link.
if(FAILED(hres = psl->Resolve(NULL, SLR_ANY_MATCH | SLR_NO_UI)))
{
break;
}
char szGotPath[MAX_PATH + 1];
strcpy_s(szGotPath, pszShortcutFile);
// Get the path to the link target.
WIN32_FIND_DATA wfd = {0};
if(SUCCEEDED(hres = psl->GetPath(szGotPath, MAX_PATH, (WIN32_FIND_DATA *)&wfd, 0)))
{
strcpy_s(pszPath, szGotPath);
}
// Get the description of the target.
if(SUCCEEDED(hres = psl->GetDescription(szDescription, MAX_PATH)))
{
}
bRet = TRUE;
}while(0);
// Release pointer to IPersistFile interface.
if(ppf)
{
ppf->Release();
}
// Release pointer to IShellLink interface.
if(psl)
{
psl->Release();
}
//release com
//CoUninitialize();
return bRet;
}
BOOL CreateShortCut(LPCSTR pszShortcutFile, LPSTR pszLink, LPSTR pszDesc)
{
BOOL bRet = FALSE;
IShellLink * psl = NULL;
IPersistFile * ppf = NULL;
//init COM
//CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
do
{
HRESULT hres;
// Get a pointer to the IShellLink interface.
if(FAILED(hres = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER,
IID_IShellLink, (void**)&psl)))
{
break;
}
// Query IShellLink for the IPersistFile interface for
// saving the shell link in persistent storage.
if(FAILED(hres = psl->QueryInterface(IID_IPersistFile, (void**)&ppf)))
{
break;
}
WCHAR wsz[MAX_PATH];
// Set the path to the shell link target.
if(FAILED(hres = psl->SetPath(pszShortcutFile)))
{
break;
}
//set icon
psl->SetIconLocation(pszShortcutFile, 1);
// Set the description of the shell link.
if(FAILED(hres = psl->SetDescription(pszDesc)))
{
break;
}
// Ensure string is ANSI.
MultiByteToWideChar(CP_ACP, 0, pszLink, -1, wsz, MAX_PATH);
// Save the link via the IPersistFile::Save method.
if(FAILED(hres = ppf->Save(wsz, TRUE)))
{
break;
}
//Resolves a shell link
if(FAILED(hres = psl->Resolve(NULL, SLR_NO_UI | SLR_UPDATE)))
{
break;
}
bRet = TRUE;
}while(0);
// Release pointer to IPersistFile.
if(ppf)
{
ppf->Release();
}
// Release pointer to IShellLink.
if(psl)
{
psl->Release();
}
//release com
//CoUninitialize();
return bRet;
}