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 键盘快捷方式就是按键或按键组合,可提供一种替代方式来执行通常使用鼠标执行 ...
随机推荐
- 关于comparable接口
参考博客: https://blog.csdn.net/nvd11/article/details/27393445 第一个例子 @Test public void fun1(){ List list ...
- 请求库之requests,selenium
requests模块 一.介绍 #介绍:使用requests可以模拟浏览器的请求,比起之前用到的urllib,requests模块的api更加便捷(本质就是封装了urllib3) #注意:reques ...
- Python3.x:pyodbc连接Sybase数据库操作(Windows系统下DNS模式)
Python3.x:pyodbc连接Sybase数据库操作(Windows系统下DNS模式) 一.安装模块pyodbc pip install pyodbc 二.配置odbc数据源 (1).windo ...
- springmvc 整合微信
springmvc 整合微信 方式一: ① 配置验证 @RequestMapping(value = "/into", method = RequestMethod.GET, pr ...
- Centos 6\7 防火墙入门配置
Centos 6 -- iptables iptables 用法: iptables (选项) (参数) 选项: -t<表>:指定要操纵的表: -A:向规则链中添加条目: -D:从规则链中 ...
- Linux之间配置免秘钥访问
环境说明 [root@localhost1 ~]# cat /etc/redhat-release CentOS release 6.5 (Final) [root@localhost1 ~]# un ...
- Unable to handle kernel NULL pointer dereference at virtual address 00000000【转】
本文转载自:https://blog.csdn.net/hpu11/article/details/72628052 这说明是非法指针的使用,才导致系统出错. [ 1023.510000] Unabl ...
- java中泛型的一个小问题
最近做项目,由于java语法不是非常的熟悉,编写代码过程中不难遇到一些问题: 代码里写了一条这种语句: Map<String, List<String>> configFile ...
- 关于使用UniForm以其他控件为Parent时应该注意的问题
关于使用UniForm以其他控件为Parent时应该注意的问题: 1,不能在其他组件的oncreate,onbeforeshow,onshow等事件中来生成这样的uniform,否则其上的组件不能显示 ...
- tar 解压命令学习与总结
tar -c: 建立压缩档案 -x:解压 -t:查看内容 -r:向压缩归档文件末尾追加文件 -u:更新原压缩包中的文件 这五个是独立的命令,压缩解压都要用到其中一个,可以和别的命令连用但只能用其中一个 ...