|
Smart K. (m)
|
TRY THIS: (from CodeProject)
/********************************************************************** * Function, : CreateShortcut * Parameters, : lpszFileName - string that specifies a valid file name * lpszDesc - string that specifies a description for a shortcut * lpszShortcutPath - string that specifies a path and file name of a shortcut * Returns, : S_OK on success, error code on failure * Description, : Creates a Shell link object (shortcut) **********************************************************************/ HRESULT CreateShortcut(/*in*/ LPCTSTR lpszFileName, /*in*/ LPCTSTR lpszDesc, /*in*/ LPCTSTR lpszShortcutPath) { HRESULT hRes = E_FAIL; DWORD dwRet = 0; CComPtr<IShellLink> ipShellLink; // buffer that receives the null-terminated string // for the drive and path TCHAR szPath[MAX_PATH]; // buffer that receives the address of the final //file name component in the path LPTSTR lpszFilePart; WCHAR wszTemp[MAX_PATH]; // Retrieve the full path and file name of a specified file dwRet = GetFullPathName(lpszFileName, sizeof(szPath) / sizeof(TCHAR), szPath, &lpszFilePart); if (!dwRet) return hRes;
// Get a pointer to the IShellLink interface hRes = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (void**)&ipShellLink);
if (SUCCEEDED(hRes)) { // Get a pointer to the IPersistFile interface CComQIPtr<IPersistFile> ipPersistFile(ipShellLink);
// Set the path to the shortcut target and add the description hRes = ipShellLink->SetPath(szPath); if (FAILED(hRes)) return hRes;
hRes = ipShellLink->SetDescription(lpszDesc); if (FAILED(hRes)) return hRes;
// IPersistFile is using LPCOLESTR, so make sure // that the string is Unicode #if !defined _UNICODE MultiByteToWideChar(CP_ACP, 0, lpszShortcutPath, -1, wszTemp, MAX_PATH); #else wcsncpy(wszTemp, lpszShortcutPath, MAX_PATH); #endif
// Write the shortcut to disk hRes = ipPersistFile->Save(wszTemp, TRUE); }
return hRes; }
/********************************************************************* * Function, : ResolveShortcut * Parameters, : lpszShortcutPath - string that specifies a path and file name of a shortcut * lpszFilePath - string that will contain a file name * Returns, : S_OK on success, error code on failure * Description, : Resolves a Shell link object (shortcut) *********************************************************************/ HRESULT ResolveShortcut(/*in*/ LPCTSTR lpszShortcutPath, /*out*/ LPTSTR lpszFilePath) { HRESULT hRes = E_FAIL; CComPtr<IShellLink> ipShellLink; // buffer that receives the null-terminated string // for the drive and path TCHAR szPath[MAX_PATH]; // buffer that receives the null-terminated // string for the description TCHAR szDesc[MAX_PATH]; // structure that receives the information about the shortcut WIN32_FIND_DATA wfd; WCHAR wszTemp[MAX_PATH];
lpszFilePath[0] = '\0';
// Get a pointer to the IShellLink interface hRes = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (void**)&ipShellLink);
if (SUCCEEDED(hRes)) { // Get a pointer to the IPersistFile interface CComQIPtr<IPersistFile> ipPersistFile(ipShellLink);
// IPersistFile is using LPCOLESTR, // so make sure that the string is Unicode #if !defined _UNICODE MultiByteToWideChar(CP_ACP, 0, lpszShortcutPath, -1, wszTemp, MAX_PATH); #else wcsncpy(wszTemp, lpszShortcutPath, MAX_PATH); #endif
// Open the shortcut file and initialize it from its contents hRes = ipPersistFile->Load(wszTemp, STGM_READ); if (SUCCEEDED(hRes)) { // Try to find the target of a shortcut, // even if it has been moved or renamed hRes = ipShellLink->Resolve(NULL, SLR_UPDATE); if (SUCCEEDED(hRes)) { // Get the path to the shortcut target hRes = ipShellLink->GetPath(szPath, MAX_PATH, &wfd, SLGP_RAWPATH); if (FAILED(hRes)) return hRes;
// Get the description of the target hRes = ipShellLink->GetDescription(szDesc, MAX_PATH); if (FAILED(hRes)) return hRes;
lstrcpyn(lpszFilePath, szPath, MAX_PATH); } } }
return hRes; }
//USAGE void HowToCreateShortcut() { LPCTSTR lpszFileName = _T("C:\\Work\\Window.exe"); LPCTSTR lpszShortcutDesc = _T("Anything can go here"); LPCTSTR lpszShortcutPath = _T("C:\\Documents and Settings\\Administrator\\Desktop\\Sample Shortcut.lnk");
CreateShortcut(lpszFileName, lpszShortcutDesc, lpszShortcutPath); }
void HowToResolveShortcut() { LPCTSTR lpszShortcutPath = _T("C:\\Documents and Settings\\Administrator\\Desktop\\Sample Shortcut.lnk"); TCHAR szFilePath[MAX_PATH];
ResolveShortcut(lpszShortcutPath, szFilePath); }
|