//得到当前桌面路径
BOOL GetDesktopPath(TCHAR * pszDesktopPath)
{
LPITEMIDLIST ppidl = NULL ;
if (SHGetSpecialFolderLocation(NULL , CSIDL_DESKTOP, &ppidl) == S_OK )
{
BOOL flag = SHGetPathFromIDList (ppidl, pszDesktopPath);
CoTaskMemFree(ppidl);
return flag;
}
return FALSE ;
}
//得到快速启动栏的路径
BOOL GetIEQuickLaunchPath(TCHAR * pszIEQueickLaunchPath)
{
LPITEMIDLIST ppidl;
if (SHGetSpecialFolderLocation(NULL , CSIDL_APPDATA, &ppidl) == S_OK )
{
BOOL flag = SHGetPathFromIDList (ppidl, pszIEQueickLaunchPath);
lstrcat (pszIEQueickLaunchPath , _T( "\\Microsoft\\Internet Explorer\\Quick Launch" ));
CoTaskMemFree(ppidl);
return flag;
}
return FALSE ;
}
//得到 开始->程序组 的路径
BOOL GetProgramsPath(TCHAR * pszProgramsPath)
{
LPITEMIDLIST ppidl;
if (SHGetSpecialFolderLocation(NULL , CSIDL_PROGRAMS, &ppidl) == S_OK )
{
BOOL flag = SHGetPathFromIDList (ppidl, pszProgramsPath);
CoTaskMemFree(ppidl);
return flag;
}
return FALSE ;
}
/*
函数功能:对指定文件在指定的目录下创建其快捷方式
函数参数:
lpszFileName 指定文件,为NULL表示当前进程的EXE文件。
lpszLnkFileDir 指定目录,不能为NULL。
lpszLnkFileName 快捷方式名称,为NULL表示EXE文件名。
wHotkey 为0表示不设置快捷键
pszDescription 备注
iShowCmd 运行方式,默认为常规窗口
*/
BOOL CreateFileShortcut(LPCTSTR lpszFileName, LPCTSTR lpszLnkFileDir , LPCTSTR lpszLnkFileName , LPCTSTR lpszWorkDir , WORD wHotkey, LPCTSTR lpszDescription , int iShowCmd = SW_SHOWNORMAL )
{
if (lpszLnkFileDir == NULL)
return FALSE ;
HRESULT hr;
IShellLink *pLink; //IShellLink对象指针
IPersistFile *ppf; //IPersisFil对象指针
//创建IShellLink对象
hr = CoCreateInstance(CLSID_ShellLink, NULL , CLSCTX_INPROC_SERVER , IID_IShellLink, (void **)&pLink);
if (FAILED (hr))
return FALSE ;
//从IShellLink对象中获取IPersistFile接口
hr = pLink->QueryInterface(IID_IPersistFile, ( void **)&ppf);
if (FAILED (hr))
{
pLink->Release();
return FALSE ;
}
//目标
if (lpszFileName == NULL)
pLink->SetPath( _wpgmptr );
else
pLink->SetPath( lpszFileName );
//工作目录
if (lpszWorkDir != NULL)
{
//pLink->SetPath(lpszWorkDir);
pLink->SetWorkingDirectory( lpszWorkDir );
}
//快捷键
if (wHotkey != 0)
pLink->SetHotkey( wHotkey );
//备注
if (lpszDescription != NULL)
pLink->SetDescription( lpszDescription );
//显示方式
pLink->SetShowCmd( iShowCmd );
//快捷方式的路径 + 名称
TCHAR szBuffer[MAX_PATH ];
if (lpszLnkFileName != NULL) //指定了快捷方式的名称
wsprintf (szBuffer, _T ( "%s\\%s"), lpszLnkFileDir , lpszLnkFileName );
else
{
//没有指定名称,就从取指定文件的文件名作为快捷方式名称。
TCHAR *pstr;
if (lpszFileName != NULL)
pstr = (TCHAR *)wcsrchr(lpszFileName , _T( '\\'));
else
pstr = (TCHAR *)wcsrchr(_wpgmptr , _T( '\\'));
if (pstr == NULL )
{
ppf->Release();
pLink->Release();
return FALSE ;
}
//注意后缀名要从.exe改为.lnk
wsprintf (szBuffer, _T ( "%s\\%s"), lpszLnkFileDir , pstr);
int nLen = lstrlen (szBuffer);
szBuffer[nLen - 3] = 'l' ;
szBuffer[nLen - 2] = 'n' ;
szBuffer[nLen - 1] = 'k' ;
}
//保存快捷方式到指定目录下
//WCHAR wsz[MAX_PATH]; //定义Unicode字符串
//MultiByteToWideChar(CP_ACP, 0, szBuffer, -1, wsz, MAX_PATH);
hr = ppf->Save(szBuffer, TRUE );
ppf->Release();
pLink->Release();
return SUCCEEDED (hr);
}
调用
TCHAR wszModulePath[MAX_PATH ];
::memset(wszModulePath, 0, sizeof (TCHAR )* MAX_PATH);
GetModuleFileName (NULL , wszModulePath, MAX_PATH);
PathAppend (wszModulePath, _T ( "..\\"));
wcscat_s(wszModulePath, _T ("3D绘图宝.exe" ));
TCHAR wszModulePath2[MAX_PATH ];
::memset(wszModulePath2, 0, sizeof (TCHAR )* MAX_PATH);
GetModuleFileName (NULL , wszModulePath2, MAX_PATH);
PathAppend (wszModulePath2, _T ( "..\\"));
TCHAR szPath[MAX_PATH ];
CoInitialize( NULL );
GetProgramsPath(szPath);
if (CreateFileShortcut(wszModulePath, szPath, NULL, wszModulePath2, MAKEWORD (VK_F12 , HOTKEYF_CONTROL ), _T ( "")))
{
}
memset(szPath, 0, sizeof (TCHAR )* MAX_PATH);
GetDesktopPath(szPath);
if (CreateFileShortcut(wszModulePath, szPath, NULL, wszModulePath2, MAKEWORD (VK_F12 , HOTKEYF_CONTROL ), _T ( "")))
{
AfxMessageBox( _T ("软件安装成功欢迎使用。" ));
}
CoUninitialize();
本文为“技术点滴”的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。