Welcome, Guest: Register On Nairaland / LOGIN! / Trending / Recent / New
Stats: 3,151,030 members, 7,810,836 topics. Date: Saturday, 27 April 2024 at 04:38 PM

How Do I Create A Desktop Shortcut For My Application? - Programming - Nairaland

Nairaland Forum / Science/Technology / Programming / How Do I Create A Desktop Shortcut For My Application? (6385 Views)

Learn How To Build A Desktop Software Using PYTHON – Tutorial On Nairaland / How Do I Create A Licenses Key For My Application / [RESOLVED] How do I package my database with my application? (2) (3) (4)

(1) (Reply) (Go Down)

How Do I Create A Desktop Shortcut For My Application? by tomX1(m): 6:55pm On Oct 19, 2007
Hi Gurus'
Does anyone here know how to programaticaly create a desktop shortcut for an executable file?
I'll prefer a C++ example but VB will do just fine.
Thanks Y'all
Re: How Do I Create A Desktop Shortcut For My Application? by SmartK1(m): 6:46pm On Oct 23, 2007
its beter to do that in the installer like Inno Setup, Installshield, etc.
Re: How Do I Create A Desktop Shortcut For My Application? by tomX1(m): 3:24pm On Oct 30, 2007
Hi @Smart K,
thanks for the insigth. I'm quite familiar with and use some of this installer but there are instances when you may want to be able to do this programaticaly (say you were to build your very own installer for instance).
The shell api in C++ is supposed to be good for this (see codes bellow) but I'm having a heck of time getting it to work right. (Makes me feel like a newbie all over again).


#include <objbase.h>
#include <shlguid.h>
,

void CShellUtils::CreateShortcut(const CString& ExePath, const CString& LinkFilename, const CString& WorkingDirectory, const CString& Description, int nFolder)
{
// Must have called CoInitalize before this function is called!

IShellLink* psl;
const CString PathLink = GetSpecialFolderLocation(nFolder) + "\\" + LinkFilename;

// Get a pointer to the IShellLink interface.
HRESULT hres = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER,
IID_IShellLink, (PVOID *) &psl);

if (SUCCEEDED(hres))
{
IPersistFile* ppf;

// Set the path to the shortcut target and add the
// description.
psl->SetPath((LPCSTR) ExePath);
psl->SetWorkingDirectory((LPCSTR) WorkingDirectory);
psl->SetDescription((LPCSTR) Description);

// Query IShellLink for the IPersistFile interface for saving the
// shortcut in persistent storage.
hres = psl->QueryInterface(IID_IPersistFile, (PVOID *) &ppf);

if (SUCCEEDED(hres))
{
WORD wsz[MAX_PATH];

// Ensure that the string is ANSI.
MultiByteToWideChar(CP_ACP, 0, (LPCSTR) PathLink, -1, wsz, MAX_PATH);

// Save the link by calling IPersistFile::Save.
hres = ppf->Save(wsz, TRUE);
ppf->Release();
}
psl->Release();
}
}
Re: How Do I Create A Desktop Shortcut For My Application? by SmartK1(m): 6:11pm On Oct 30, 2007
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"wink;
LPCTSTR lpszShortcutDesc = _T("Anything can go here"wink;
LPCTSTR lpszShortcutPath =
_T("C:\\Documents and Settings\\Administrator\\Desktop\\Sample Shortcut.lnk"wink;

CreateShortcut(lpszFileName, lpszShortcutDesc, lpszShortcutPath);
}

void HowToResolveShortcut()
{
LPCTSTR lpszShortcutPath =
_T("C:\\Documents and Settings\\Administrator\\Desktop\\Sample Shortcut.lnk"wink;
TCHAR szFilePath[MAX_PATH];

ResolveShortcut(lpszShortcutPath, szFilePath);
}
Re: How Do I Create A Desktop Shortcut For My Application? by tomX1(m): 9:29am On Oct 31, 2007
@Smart K,
Thanks once again. I'll give it a trial and let you know how it works out.
Re: How Do I Create A Desktop Shortcut For My Application? by tomX1(m): 10:45am On Oct 31, 2007
Yeah! I see what I've been missing out now. The Shell objects are actualy COM objects and I shouls have initialised COM in my workspace before using them. You know. . .

::CoInitialize(NULL);

Such a small ommission, such pains to go with it.
Thanks Smart K and Seun.

(1) (Reply)

Why Is PHP So.........boring?? / Hospital Management System Program. / My C++ Voting System Program Algorithm

(Go Up)

Sections: politics (1) business autos (1) jobs (1) career education (1) romance computers phones travel sports fashion health
religion celebs tv-movies music-radio literature webmasters programming techmarket

Links: (1) (2) (3) (4) (5) (6) (7) (8) (9) (10)

Nairaland - Copyright © 2005 - 2024 Oluwaseun Osewa. All rights reserved. See How To Advertise. 24
Disclaimer: Every Nairaland member is solely responsible for anything that he/she posts or uploads on Nairaland.