vc++ windows 创建桌面快捷方式
创建桌面快捷方式
在windows软件开发中,软件安装过程中总是需要在桌面创建快捷方式,下面介绍一种创建桌面快捷方式的方法,具体代码如下:
/*
* 创建快捷方式
* szExePath[in]:要创建快捷方式的exe文件全路径
* szLinkName[in]:要创建的快捷方式.link文件的全路径
* iIcon[in]:要创建快捷方式的exe文件RC资源中的icon值(默认为0)
*/
BOOL MainFrame::CreateOneLink (LPCTSTR lpszExePath, LPCTSTR lpszLnkPath, int iIcon)
{
ASSERT(lpszExePath != NULL);
if (NULL == lpszExePath)
{
return ERROR_INVALID_PARAMETER;
}
DWORD dwRlt = ERROR_SUCCESS;
HRESULT hres = S_OK;
IShellLink *pShellLink = NULL;
IPersistFile *pPersistFile = NULL;
WCHAR szwShortCutName[MAX_PATH];
try
{
::CoInitialize(NULL); // 初始化 COM 库
// 创建 COM 对象并获取其实现的接口
hres = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (void **)&pShellLink);
if (FAILED(hres))
{
throw(hres);
}
TCHAR szWorkPath[MAX_PATH] = { 0 };
StringCchCopy(szWorkPath, MAX_PATH, lpszExePath);
LPTSTR pszEnd = _tcsrchr(szWorkPath, _T('\\'));
if (pszEnd != NULL)
{
*pszEnd = NULL;
}
// 设置快捷方式的各种属性
pShellLink->SetPath(lpszExePath); // 快捷方式所指的应用程序名
pShellLink->SetDescription(_T("描述")); // 描述
pShellLink->SetWorkingDirectory(szWorkPath); // 设置工作目录
pShellLink->SetIconLocation(lpszExePath, iIcon);//直接取exe文件中的图标进行设置
// 查询 IShellLink 接口从而得到 IPersistFile 接口来保存快捷方式
hres = pShellLink->QueryInterface(IID_IPersistFile, (void **)&pPersistFile);
if (FAILED(hres))
{
throw(hres);
}
StringCchPrintf(szwShortCutName, MAX_PATH, _T("%s"), lpszLnkPath);
//使用 IPersistFile 接口的 Save() 方法保存快捷方式
hres = pPersistFile->Save(szwShortCutName, TRUE);
}
catch (DWORD dwExpRlt)
{
dwRlt = dwExpRlt;
}
catch (...)
{
}
if (pPersistFile != NULL){
pPersistFile->Release(); pPersistFile = NULL;
}
if (pShellLink != NULL){
pShellLink->Release(); pPersistFile = NULL;
}
CoUninitialize();
return dwRlt;
}
/*
* 设置桌面快捷方式
* szExePath[in]:要创建快捷方式的exe文件全路径
* szLinkName[in]:要创建的快捷方式的名字
* iIcon[in]:要创建快捷方式的exe文件RC资源中的icon值(默认为0)
*/
void MainFrame::CreateDesktopLink(LPCTSTR szExePath, LPCTSTR szLinkName, int iIcon)
{
LPITEMIDLIST pidlBeginAt, pidlDestination;
TCHAR szDesktopPath[MAX_PATH] = { 0 };
LPITEMIDLIST ppidl = NULL;
//获取所有用户存放桌面快捷方式的路径
HRESULT hSpecialPath = SHGetSpecialFolderLocation(NULL, CSIDL_COMMON_DESKTOPDIRECTORY, &ppidl);
if (hSpecialPath == S_OK)
{
BOOL flag = SHGetPathFromIDList(ppidl, szDesktopPath);
CoTaskMemFree(ppidl);
}
else
{
//失败
return;
}
//设置快捷方式.link文件的全路径
TCHAR szExeLinkFullPath[MAX_PATH] = { 0 };
StringCchPrintf(szExeLinkFullPath, _countof(szExeLinkFullPath), _T("%s\\%s.lnk"), szDesktopPath, szLinkName);
//开始创建快捷方式
CreateOneLink (szExePath, szExeLinkFullPath,iIcon);
// 通知shell有关变化
SHChangeNotify(SHCNE_CREATE | SHCNE_INTERRUPT,
SHCNF_FLUSH | SHCNF_PATH,
szExeLinkFullPath, 0);
}
vc++ windows 创建桌面快捷方式的更多相关文章
- windows创建桌面快捷方式的VBA脚本
Dim wShell, oShortcut 'Dim strDesktop$ ' 为了与VBS兼容, Dim strDesktop ' 这里改写一下,测试通过... Set w ...
- Windows中创建桌面快捷方式
Windows中创建桌面快捷方式 -------------- -------------- -------------- --------------
- 手把手教你在ubuntu下创建桌面快捷方式
习惯使用windows的朋友来说创建桌面快捷方式简直就是so easy, 鼠标右键点击文件-->选择发送桌面快捷方式.就OK了.对于ubuntu下该如何创建桌面快捷方式呢?以下以创建eclips ...
- winform创建桌面快捷方式
//引用IWshRuntimeLibrary COM组件-Windows Script Host Object Model /// <summary> /// 创建快捷方式的类 /// & ...
- Ubuntu创建桌面快捷方式
默认情况下,ubuntu会将自动安装的软件快捷方式保存在/usr/share/applications目录下,如果我们要创建桌面快捷方式,只需要右键-复制-桌面 就Ok,如图: 上面的方法是通过系统自 ...
- WPF 创建桌面快捷方式
#region 创建桌面快捷方式 string deskTop = System.Environment.GetFolderPath(System.Environment.SpecialFolder. ...
- 解决Inno Setup制作安装包无法创建桌面快捷方式的问题
转自:http://yedward.net/?id=104 昨天想把个java程序做成exe安装软件,然后就去下载了Inno Setup这个软件安装包制作软件,Inno Setup这个软件确实非常好用 ...
- C#创建桌面快捷方式 和 开机启动
/// <summary> /// 创建桌面快捷方式 2010-11-25 /// </summary> p ...
- android 为应用程序创建桌面快捷方式技巧分享
手机装的软件过多,找起来很不方便,所以在主页面有一个快捷方式的话会很不错的,本文将介绍如何实现,需要了解跟多的朋友可以参考下 我们开发一款软件后,如果手机装的软件过多,去翻的话会很难翻的,所以 ...
随机推荐
- Java设计模式学习之工厂模式
在Java(或者叫做面向对象语言)的世界中,工厂模式被广泛应用于项目中,也许你并没有听说过,不过也许你已经在使用了.Java 设计模式之工厂模式 简单来说,工厂模式的出现源于增加程序序的可扩展性,降低 ...
- 自定义Log实现条件编译
在项目pch中添加以下代码,其中DEBUG为Xcode项目自带的宏,存在时表示当前为调试状态,否则为发布状态.故当在发布状态时,通过自定义TestLog所使用的NSLog调试信息,都会被预编译替换为空 ...
- JSONObject使用方法
转载:http://blog.csdn.net/dongzhouzhou/article/details/8664569 1.JSONObject介绍 JSONObject-lib包是一个beans, ...
- 线程的sleep()方法和yield()方法区别
1.sleep()方法给其他线程运行机会时不考虑线程的优先级,因此会给低优先级的线程以运行的机会 2.yield()方法只会给相同优先级或更高优先级的线程以运行的机会 3.线程执行sleep()方法后 ...
- SpringBoot2.0整合Sharding-Jdbc
maven: <parent> <groupId>org.springframework.boot</groupId> <artifactId>spri ...
- Extracting info from VCF files
R, Bioconductor filterVcf: Extract Variants of Interest from a Large VCF File (Paul Shannon) We demo ...
- 谈谈RMQ问题
没用的话:好像好久没更博了,无聊就讲讲算法吧(主要找不到水题). 感觉针对初学者,老师教这个算法时没怎么懂,最近(大概1.2个月前吧)老师又教了lca(最近公共祖先,额,可以百度,我就不讲了,可能以后 ...
- centos7 部署 dotnetcore
一.在centos上下载dotnetcore SDK 二. 选择Linux发行版安装 按上面的步骤安装,在centos终端输入dotnet --version 显示版本信息即安装成功
- code for 1 - 分治
2017-08-02 17:23:14 writer:pprp 题意:将n分解为n/2, n%2, n/2三部分,再将n/2分解..得到一个序列只有0和1,给出[l, r]问l到r有几个1 题解:分治 ...
- scala学习手记34 - trait方法的延迟绑定
trait的方法的延迟绑定就是先混入的trait的方法会后调用.这一点从上一节的实例中也可以看出来. 下面再来看一个类似的例子: abstract class Writer { def write(m ...