一、首先要获得不同目录的路径
char chDesktopPath[MAX_PATH] = {0};
SHGetSpecialFolderPathA(NULL,chDesktopPath,CSIDL_DESKTOP,0);//获取当前用户桌面路径
通过改变上面函数的第三个参数来获取
第三个参数可以为:
CSIDL_BITBUCKET, CSIDL_CONTROLS, CSIDL_DESKTOP, CSIDL_DESKTOPDIRECTORY,
CSIDL_DRIVES, CSIDL_FONTS, CSIDL_NETHOOD, CSIDL_NETWORK, CSIDL_PERSONAL,
CSIDL_PRINTERS, CSIDL_PROGRAMS, CSIDL_RECENT, CSIDL_SENDTO, CSIDL_STARTMENU,
CSIDL_STARTUP, CSIDL_TEMPLATES
二、获取到路径之后,就可以在对应的路径下生成快捷方式
下面函数的解析:
BOOL CreateFileShortcut(LPCTSTR lpszFileName, LPCTSTR lpszLnkFileDir, LPCTSTR lpszLnkFileName,
LPCTSTR lpszWorkDir, WORD wHotkey, LPCTSTR lpszDescription, int iShowCmd = SW_SHOWNORMAL)
lpszFileName:指定生成快捷方式的文件,如果为NULL则是当前进程的快捷方式
lpszLnkFileDir:指定快捷方式生成的牡蛎,不能为NULL
lpszLnkFileName:快捷方式的名称,后缀名为.lnk,不能为NULL
lpszWorkDir:工作目录,一般设置为NULL
wHotkey:对快捷方式设置快捷键,MAKEWORD(VK_F10, HOTKEYF_CONTROL)或者0表示不设置
lpszDescription:备注情况
iShowCmd:显示方式,可以为SW_SHOWNORMAL等等
调用函数方式例如:CreateFileShortcut(NULL, CA2T(chDesktopPath), _T("进程名称.lnk") ,NULL,MAKEWORD(VK_F10, HOTKEYF_CONTROL), _T("备注内容"));
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);
//快捷键
if (wHotkey != 0)
pLink->SetHotkey(wHotkey);
//备注
if (lpszDescription != NULL)
pLink->SetDescription(lpszDescription);
//显示方式
pLink->SetShowCmd(iShowCmd);
//快捷方式的路径 + 名称
char szBuffer[MAX_PATH];
std_string strLinkFileDir = lpszLnkFileDir;
std_string strLinkFileName = lpszLnkFileName;
if (lpszLnkFileName != NULL)
{
sprintf(szBuffer, "%s\\%s",strLinkFileDir.c_str(), strLinkFileName.c_str());
int x=1;
}
else
{
//没有指定名称,就从取指定文件的文件名作为快捷方式名称。
char* szModule = new char[_MAX_PATH];
GetModuleFileNameA(NULL, szModule, _MAX_PATH);//得到本程序自身的全路径
char *pstr;
if (lpszFileName != NULL)
pstr = strrchr(CT2A(lpszFileName), '\\');
else
pstr = strrchr(_pgmptr, '\\');
if (pstr == NULL)
{
ppf->Release();
pLink->Release();
return FALSE;
}
//注意后缀名要从.exe改为.lnk
sprintf(szBuffer, "%s\\%s", lpszLnkFileDir, pstr);
int nLen = strlen(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(wsz, TRUE);
ppf->Release();
pLink->Release();
return SUCCEEDED(hr);
}