创建快捷方式 (并添加到快速启动栏 、桌面、开始菜单)

首先需要获取三个路径 :桌面路径 、快速启动栏路径、 开始->程序组路径

//得到当前桌面路径  
BOOL GetDesktopPath(char *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(char *pszIEQueickLaunchPath)  
{     
	LPITEMIDLIST  ppidl;              

	if (SHGetSpecialFolderLocation(NULL, CSIDL_APPDATA, &ppidl) == S_OK)  
	{  
		BOOL flag = SHGetPathFromIDList(ppidl, pszIEQueickLaunchPath);  
		strcat(pszIEQueickLaunchPath, "\\Microsoft\\Internet Explorer\\Quick Launch");  
		CoTaskMemFree(ppidl);  
		return flag;  
	}  

	return FALSE;  
}  
//得到 开始->程序组 的路径  
BOOL GetProgramsPath(char *pszProgramsPath)  
{  
	LPITEMIDLIST  ppidl;   

	if (SHGetSpecialFolderLocation(NULL, CSIDL_PROGRAMS, &ppidl) == S_OK)  
	{  
		BOOL flag = SHGetPathFromIDList(ppidl, pszProgramsPath);  
		CoTaskMemFree(ppidl);  
		return flag;  
	}  

	return FALSE;  
}  

这样返回的
pszProgramsPath就是指当前获取的路径


程序的思路:得到路径,在当前路径下创建exe相对应的快捷方式,并通过ShellExecute函数来锁定到快速启动栏或开始菜单


/* 
函数功能:对指定文件在指定的目录下创建其快捷方式 
函数参数: 
lpszFileName    指定文件,为NULL表示当前进程的EXE文件。 
lpszLnkFileDir  指定目录,不能为NULL。 
lpszLnkFileName 快捷方式名称,为NULL表示EXE文件名。 
wHotkey         为0表示不设置快捷键 
pszDescription  备注 
iShowCmd        运行方式,默认为常规窗口 
*/  
BOOL CreateFileShortcut(LPCSTR lpszFileName, LPCSTR lpszLnkFileDir, LPCSTR lpszLnkFileName, LPCSTR 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;  
	}  
    //获取当前exe所在路径
	TCHAR exeFullPath[MAX_PATH]; // MAX_PATH
	GetModuleFileName(NULL,exeFullPath,MAX_PATH);
	
	//目标  
	if (lpszFileName == NULL)  
		pLink->SetPath(_pgmptr);  
	else  
		pLink->SetPath(exeFullPath); 

	//工作目录  
	if (lpszWorkDir != NULL)  
		pLink->SetWorkingDirectory(lpszWorkDir);  

	//快捷键  
	if (wHotkey != 0)  
		pLink->SetHotkey(wHotkey);  

	//备注  
	if (lpszDescription != NULL)  
		pLink->SetDescription(lpszDescription);  

	//显示方式  
	pLink->SetShowCmd(iShowCmd);  

	//快捷方式的路径 + 名称  
	char szBuffer[MAX_PATH];  
	if (lpszLnkFileName != NULL) //指定了快捷方式的名称  
		sprintf(szBuffer, "%s\\%s", lpszLnkFileDir, lpszLnkFileName);  
	else     
	{  
		//没有指定名称,就从取指定文件的文件名作为快捷方式名称。  
		//char *pstr;  

		char *buf = new char[strlen(lpszFileName)+1];
		strcpy(buf, lpszFileName);  

		if (buf == NULL)  
		{     
			ppf->Release();  
			pLink->Release();  
			return FALSE;  
		}  
		//注意后缀名要从.exe改为.lnk  
		sprintf(szBuffer, "%s\\%s", lpszLnkFileDir, buf);  
		int nLen = strlen(szBuffer);
		//char lkName = ;
		strcat(szBuffer, ".lnk");
	}  
	//保存快捷方式到指定目录下  
	WCHAR  wsz[MAX_PATH];  //定义Unicode字符串  
	MultiByteToWideChar(CP_ACP, 0, szBuffer, -1, wsz, MAX_PATH);  

	hr = ppf->Save(wsz, TRUE);  

	ppf->Release();  
	pLink->Release();  
	CoUninitialize(); //释放com接口
	return SUCCEEDED(hr);  
}  

下面说一下调用 :


char  szPath[MAX_PATH];  
CoInitialize(NULL);  

GetDesktopPath(szPath);
//GetIEQuickLaunchPath(szPath);
//GetProgramsPath(szPath);
			
if (!CreateFileShortcut(_T("QQMusicEx"), szPath, NULL, NULL, 0 , NULL)) 
	return ;
else
{
	//strcat(szPath,"\\QQMusicEx.lnk");
	//ShellExecute(NULL,_T("TaskbarPin"), szPath, NULL, NULL, SW_SHOW); // 锁定程序到任务栏
	//ShellExecute(NULL,_T("startpin"), szPath, NULL, NULL, SW_SHOW); // 锁定程序到开始菜单
				//startpin
}

红色代表桌面快捷方式,下面的else注释掉 

蓝色放开注释,else里面的strcat跟着一起放开

紫色放开注释,else操作同上


注意:1.  需要注意的是 在创建开解方式的时候需要添加头文件 

#include <shlobj.h>

#pragma comment(lib, "shell32.lib")


2. TaskbarPin是锁定  Task
barUnpin是解锁 

    startpin和startunpin是相对应的

    原文作者:张念
    原文地址: https://blog.csdn.net/qq_25867649/article/details/53741227
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞