vc在指定目录生成快捷方式

一、首先要获得不同目录的路径

char chDesktopPath[MAX_PATH] = {0};  
SHGetSpecialFolderPathA(NULL,chDesktopPath,CSIDL_DESKTOP,0);//获取当前用户桌面路径

通过改变上面函数的第三个参数来获取

第三个参数可以为:

CSIDL_BITBUCKETCSIDL_CONTROLSCSIDL_DESKTOPCSIDL_DESKTOPDIRECTORY,

CSIDL_DRIVESCSIDL_FONTSCSIDL_NETHOODCSIDL_NETWORKCSIDL_PERSONAL,

CSIDL_PRINTERSCSIDL_PROGRAMSCSIDL_RECENTCSIDL_SENDTOCSIDL_STARTMENU,

CSIDL_STARTUPCSIDL_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);
}

 
  

 
 

你可能感兴趣的:(VC++,C++,快捷方式,vc)