欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

vc 创建桌面快捷方式

程序员文章站 2022-03-31 21:43:40
...
BOOL CDlg::CreateDesktopShotCut(CString strName, CString strSourcePath)
{
	if (FAILED(CoInitialize(NULL)))
		return FALSE;
	BOOL bRet = FALSE;
	
	TCHAR Path[MAX_PATH+1];
	CString strDestDir;
	LPITEMIDLIST pidl;
	LPMALLOC pShell;
	if(SUCCEEDED(SHGetMalloc(&pShell)))
	{
		if(SUCCEEDED(SHGetSpecialFolderLocation(NULL,CSIDL_DESKTOPDIRECTORY,&pidl)))
		{
			if(!SHGetPathFromIDList(pidl,Path))
			{
				pShell->Free(pidl);
			}
			pShell->Release();
			strDestDir.Format(_T("%s"),Path);
			strDestDir+= _T("\\");
			strDestDir+= strName;//设置桌面快捷方式的名字
			strDestDir+= _T(".lnk");
			IShellLink* psl;
			
			if(SUCCEEDED(CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (LPVOID*)&psl)))
			{
				psl->SetPath(strSourcePath + _T("Player.exe"));//设置快捷方式的目标位置 
				//比如目标位置为C:\windows\a.txt 起始位置就应该设置为C:\windows否则会导致不可预料的错误
				
				//如果是文件夹的快捷方式起始位置和目标位置可以设置为一样
				
				psl->SetWorkingDirectory(strSourcePath); //设置快捷方式的起始位置 
				IPersistFile* ppf;
				if(SUCCEEDED(psl->QueryInterface(IID_IPersistFile,(LPVOID*)&ppf)))
				{
					//WCHAR wsz[MAX_PATH];
					//MultiByteToWideChar(CP_THREAD_ACP,MB_PRECOMPOSED, (LPCTSTR)strDestDir,-1,wsz,MAX_PATH);//设置桌面快捷方式的名字
					if(SUCCEEDED(ppf->Save(strDestDir,TRUE)))//保存快捷方式到桌面 
					{
						ppf->Release();
						psl->Release();
						bRet = TRUE;
					}else{
						ppf->Release();
						psl->Release();
					}
				}else{
					ppf->Release();
					psl->Release();
				}
			}
		}
	}

	CoUninitialize();

	if (!bRet)
	{
		LPVOID   lpMsgBuf; 
		FormatMessage( 
			FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, 
			NULL, 
			GetLastError(), 
			MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language 
			(LPTSTR) &lpMsgBuf, 
			0, 
			NULL 
			); 
		//   Display   the   string. 
		TRACE(_T("----------------Create Link Error: %s\r\n"), (TCHAR*)lpMsgBuf);
		_ComnLog->LogOutV(_T("----------------CreateDesktopShotCut Failed: %s\r\n"), (TCHAR*)lpMsgBuf);
		//   Free   the   buffer. 
		LocalFree(   lpMsgBuf   ); 
	}
	return bRet;
}