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 键盘快捷方式就是按键或按键组合,可提供一种替代方式来执行通常使用鼠标执行 ...
随机推荐
- C# Winform 窗体传值 利用委托 子窗体传值给父窗体
常用的Winform窗体传值有两种方式. 1.更改Form.designer.cs文件,将控件的设为Public,供子窗体访问. 在designer.cs文件的最后,找到你的控件声明. private ...
- Node单线程与异步编程的初步理解
最近学习了一些关于node的单线程与异步的知识,想拿过来和大家分享下: var async = require('async') //并行无关联,等待事件为最长时间请求过程.如以下两个任务执行时间 c ...
- 完美修改iOS项目名
注意:重命名项目时,记得先备份好一份 1.选中旧项目名,改为新项目名: 选择rename: 2.修改相关文件夹名称: 3.全局搜索旧项目名称,然后替换为新项目名称: 4.经过步骤3的替换,再次全局搜索 ...
- C++结构体定义和C的区别
对于C来说,struct定义的结构体不是一种数据类型,所以每次声明的时候需要加上struct让编译器知道这是结构体,为了不每次都加上struct关键字,可以在定义结构体的时候加上typedef关键字: ...
- 单片机、嵌入式CAN通信原理
工作原理: 单片机里内置了一个FIFO(先进先出)芯片,需要发送什么报文,就往这个芯片里写.比如有两个单片机作为CAN节点,A节点往自己的FIFO中写CAN报文,B节点往自己的FIFO中写CAN报文. ...
- linux下字典生成工具-crunch与rtgen
所谓的密码字典主要是配合密码破解软件所使用,密码字典里包括许多人们习惯性设置的密码.这样可以提高密码破解软件的密码破解成功率和命中率,缩短密码破解的时间.当然,如果一个人密码设置没有规律或很复杂,未包 ...
- 偶然发现有的IIS里的程序,连接 不上SQL Server数据库, 超时
经查应用程序池中, 有一个启用32位应用程序, 有时打开它就能连接上SQL SERVER了.
- shell script语法高亮和自动缩进的配置
编辑/etc/profile文件,在文件末尾加一下内容: export TERM=xterm-color 接着让其变为全局变量 source /etc/profile 编辑/etc/vimrc文件,在 ...
- 一块网卡多个IP实现
////////////////////////////写在前面//////////////////////////////////////////// 需要注意,这里我们是一块网卡多个IP,而并非是 ...
- 测绘类SCI
GeoInformatica(国际地理信息系统计算机科学进展杂志)美国International Journal of Geographical Information Science(国际地理信息科 ...