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::CreateStartMenuLink(LPCTSTR szExePath, LPCTSTR szLinkName, int iIcon)
{
LPITEMIDLIST pidlBeginAt, pidlDestination;
TCHAR szStartMenuPath[MAX_PATH] = { 0 };
LPITEMIDLIST ppidl = NULL;
//获取所有用户的开始菜单路径,也可以通过修改CSIDL_COMMON_PROGRAMS获取其它用户的开始菜单路径
HRESULT hSpecialPath = SHGetSpecialFolderLocation(NULL, CSIDL_COMMON_PROGRAMS, &ppidl);
if (hSpecialPath == S_OK)
{
BOOL flag = SHGetPathFromIDList(ppidl, szStartMenuPath);
CoTaskMemFree(ppidl);
}
else
{
//失败
return;
}
//为开始菜单创建一个目录(这个是可选的)
StringCchCat(szStartMenuPath, _countof(szStartMenuPath), _T("\\我的开始菜单"));
memset(szStartMenuPath, 0, sizeof(szStartMenuPath));
LPITEMIDLIST ppidl2 = NULL;
HRESULT hSpecialPath2 = SHGetSpecialFolderLocation(NULL, CSIDL_COMMON_PROGRAMS, &ppidl2);
if (hSpecialPath2 == S_OK)
{
BOOL flag = SHGetPathFromIDList(ppidl2, szStartMenuPath);
CoTaskMemFree(ppidl2);
}
else
{
//失败
return;
}
//如果该目录还不存在,则创建
StringCchCat(szStartMenuPath, _countof(szStartMenuPath), _T("\\我的开始菜单"));
if (!PathFileExists(szStartMenuPath))
{
CreateDirectory(szStartMenuPath, 0);
// 通知shell有关变化
SHChangeNotify(SHCNE_CREATE | SHCNE_INTERRUPT,
SHCNF_FLUSH | SHCNF_PATH,
szStartMenuPath, 0);
}
TCHAR szExeLinkFullPath[MAX_PATH] = { 0 };
StringCchPrintf(szExeLinkFullPath, _countof(szExeLinkFullPath), _T("%s\\%s.lnk"), szStartMenuPath, szLinkName);
CreateOneLink (szExePath, szExeLinkFullPath, iIcon);
// 通知shell有关变化
SHChangeNotify(SHCNE_CREATE | SHCNE_INTERRUPT,
SHCNF_FLUSH | SHCNF_PATH,
szExeLinkFullPath, 0);
}
相关头文件自行引入
vc++ windows 开始菜单添加快捷方式的更多相关文章
- 系统重装/装Anaconda后,Windows开始菜单缺少快捷方式解决方案
系统重装后,想把D盘的软件添加快捷方式 以下以anaconda3为例,提供两种方法 方法一: 参考: 装Anaconda后,Windows开始菜单缺少快捷方式解决方案 方法二: 1. 添加环境变量 ...
- windows鼠标右键添加快捷方式
[win]+[R] 输入regedit 打开路径:计算机\HKEY_CLASSES_ROOT\DesktopBackground\Shell 创建应用文件,这里以putty为例 右键 Shell 新建 ...
- 给 Windows 文件菜单添加 "用XX程序打开" "用XX编辑" "用XX运行"
有什么用就不用多说了,这可是个很有用的技巧.可以创造自己的文件格式,也可以给已有的文件添加多种打开方式 在注册表[HKEY_CLASSES_ROOT]下找到或者建立对应的扩展名 如果想对所有文件都生效 ...
- Windows下给鼠标右键菜单添加获得完全控制权限的菜单项
这段时间计算机C分区里多了很多无用的文件,而且不在同一个目录下,搜索出来删除的时候提示没有管理员权限,需要在右键属性里面修改,非常麻烦,于是查询了一下发现可以在文件右键菜单添加一个获取权限的菜单项,这 ...
- 为Windows资源管理器右键菜单添加菜单项
为Windows资源管理器右键菜单添加菜单项 在Windows下命令行用的比较多,经常在资源管理器里翻到某个目录,若想要在此目录下跑命令,只能是打开cmd.exe,然后一路cd才能到达此目录. 每次都 ...
- VC/Wince 实现仿Win8 Metro风格界面3——按钮移动交换、删除、添加快捷方式(附效果图)
上一篇文章写了如何进行页面滑动切换,今天我讲一下如何实现两个按钮拖动交换位置,包括同一个页面按钮交换或者两个页面之间的按钮交换.另外就是如何拖动删除界面上的快捷方式.按钮交换和拖动删除,这两个功能基本 ...
- 在windows右键菜单中加入自己的程序 [转载]
原文链接: http://blog.csdn.net/marklr/article/details/4006356 在windows右键菜单中加入自己的程序 标签: windowsattribute ...
- Windows中的键盘快捷方式大全
Windows有很多键盘快捷方式,使用键盘快捷方式能够大大提高使用windows的效率,同时还能提升自己的逼格,背熟几个快捷方式,操作起来行云流水犹如大神一般! 页面较长,请使用目录浏览(点击跳转), ...
- Windows中的键盘快捷方式
Windows 中的键盘快捷方式 适用于: Windows 10Windows 8.1Windows 7 Windows 10 键盘快捷方式就是按键或按键组合,可提供一种替代方式来执行通常使用鼠标执行 ...
随机推荐
- Linux 进程管理 vmstat、top、pstree命令
vmstat命令:监控系统资源 vmstat 是 Linux 中的一个综合性能分析工具,可以用来监控 CPU 使用.进程状态.内存使用.虚拟内存使用.磁盘输入/输出状态等信息.vmstat 命令格式如 ...
- Spark机器学习5·回归模型(pyspark)
分类模型的预测目标是:类别编号 回归模型的预测目标是:实数变量 回归模型种类 线性模型 最小二乘回归模型 应用L2正则化时--岭回归(ridge regression) 应用L1正则化时--LASSO ...
- 【Thinking in java, 4e】复用类
mark一篇09年的<Thinking in Java>笔记:here --> https://lawrence-zxc.github.io/2009/11/07/thinking- ...
- pt-osc使用方法
pt-osc实战运用 1.安装pt-osc,解压即可用 安装包在:10.135.2.217:data/online/software/percona-toolkit-3.0.12.tar.gz tar ...
- 基于Promise对象的新一代Ajax API--fetch
***************************************************************** #fetch Request 使用isomorphic-fetch发 ...
- JAVA文件下载,页面显示另存为效果
经过测试 firefox.QQ.IE 浏览器是可以的 chrome浏览器不行(直接下载了) 1. 系统框架springmvc+jsp 2. 后台servlet代码 @RequestMapping( ...
- Autofac Getting Started(默认的构造函数注入)
https://autofaccn.readthedocs.io/en/latest/getting-started/index.html The basic pattern for integrat ...
- tomcat深入学习—权限篇
如果想给一个应用程序配置权限,可能需要的代码量很多,但你知道吗,仅通过配置tomcat,就能有同样的效果(为一个web应用添加了权限) 效果:打开http://localhost:8080/searc ...
- 如何理解Hibernate的延迟加载机制?在实际应用中,延迟加载与Session关闭的矛盾是如何处理的?
延迟加载就是并不是在读取的时候就把数据加载进来,而是等到使用时再加载.Hibernate使用了虚拟代理机制实现延迟加载,我们使用Session的load()方法加载数据或者一对多关联映射在使用延迟加载 ...
- PHP学习之路(一)
先前对PHP的学习研究,今总结写下心得!!