bool CUtility::CreateShortcut(const CString szObjPath, const CString szFileName, const CString szDesc, bool bRelevantPlace)
{
bool bResult;
HRESULT hres;
IShellLink* psl;
CString strMyPath = szFileName;
::CoInitialize(NULL);
hres = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (LPVOID*) &psl);
if (SUCCEEDED(hres))
{
IPersistFile* ppf;
psl->SetPath(szObjPath);
psl->SetDescription(szDesc);
if(bRelevantPlace)
{
CString szWorkDir = szObjPath;
szWorkDir = szWorkDir.Left(szWorkDir.ReverseFind('\\'));
psl->SetWorkingDirectory(szWorkDir);
}
hres = psl->QueryInterface( IID_IPersistFile, (LPVOID *) &ppf);
if (SUCCEEDED(hres))
{
strMyPath += ".lnk"; // Important !!!
WCHAR wsz[MAX_PATH];
::MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, strMyPath, -1, wsz,MAX_PATH);
hres = ppf->Save(wsz, TRUE);
if (hres != S_OK )
{
MessageBox(NULL, "IPersistFile->Save() Error", "Error", MB_OK);
bResult = false;
}
else bResult = true;
ppf->Release();
}
psl->Release();
}
::CoUninitialize();
return bResult;
}