开始菜单创建快捷方式

在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 开始菜单添加快捷方式的更多相关文章

  1. 系统重装/装Anaconda后,Windows开始菜单缺少快捷方式解决方案

    系统重装后,想把D盘的软件添加快捷方式 以下以anaconda3为例,提供两种方法 方法一: 参考:  装Anaconda后,Windows开始菜单缺少快捷方式解决方案 方法二: 1. 添加环境变量 ...

  2. windows鼠标右键添加快捷方式

    [win]+[R] 输入regedit 打开路径:计算机\HKEY_CLASSES_ROOT\DesktopBackground\Shell 创建应用文件,这里以putty为例 右键 Shell 新建 ...

  3. 给 Windows 文件菜单添加 "用XX程序打开" "用XX编辑" "用XX运行"

    有什么用就不用多说了,这可是个很有用的技巧.可以创造自己的文件格式,也可以给已有的文件添加多种打开方式 在注册表[HKEY_CLASSES_ROOT]下找到或者建立对应的扩展名 如果想对所有文件都生效 ...

  4. Windows下给鼠标右键菜单添加获得完全控制权限的菜单项

    这段时间计算机C分区里多了很多无用的文件,而且不在同一个目录下,搜索出来删除的时候提示没有管理员权限,需要在右键属性里面修改,非常麻烦,于是查询了一下发现可以在文件右键菜单添加一个获取权限的菜单项,这 ...

  5. 为Windows资源管理器右键菜单添加菜单项

    为Windows资源管理器右键菜单添加菜单项 在Windows下命令行用的比较多,经常在资源管理器里翻到某个目录,若想要在此目录下跑命令,只能是打开cmd.exe,然后一路cd才能到达此目录. 每次都 ...

  6. VC/Wince 实现仿Win8 Metro风格界面3——按钮移动交换、删除、添加快捷方式(附效果图)

    上一篇文章写了如何进行页面滑动切换,今天我讲一下如何实现两个按钮拖动交换位置,包括同一个页面按钮交换或者两个页面之间的按钮交换.另外就是如何拖动删除界面上的快捷方式.按钮交换和拖动删除,这两个功能基本 ...

  7. 在windows右键菜单中加入自己的程序 [转载]

    原文链接: http://blog.csdn.net/marklr/article/details/4006356  在windows右键菜单中加入自己的程序 标签: windowsattribute ...

  8. Windows中的键盘快捷方式大全

    Windows有很多键盘快捷方式,使用键盘快捷方式能够大大提高使用windows的效率,同时还能提升自己的逼格,背熟几个快捷方式,操作起来行云流水犹如大神一般! 页面较长,请使用目录浏览(点击跳转), ...

  9. Windows中的键盘快捷方式

    Windows 中的键盘快捷方式 适用于: Windows 10Windows 8.1Windows 7 Windows 10 键盘快捷方式就是按键或按键组合,可提供一种替代方式来执行通常使用鼠标执行 ...

随机推荐

  1. @RequestBody和@ResponseBody的使用情形以及RestTemplate的http报文转换

    @RequestBody和@ResponseBody两个注解,分别完成请求报文到对象和对象到响应报文的转换. @RequestBody 1.@requestBody注解常用来处理content-typ ...

  2. ES6 随记(3.3)-- 数组的拓展

    上一章请见: 1. ES6 随记(1)-- let 与 const 2. ES6 随记(2)-- 解构赋值 3. ES6 随记(3.1)-- 字符串的拓展 4. ES6 随记(3.2)-- 正则的拓展 ...

  3. contain与compareDocumentPosition

    contain方法由IE创建,用于判断元素之间是否是父亲与后代的关系,例如:如果A元素包含B元素,则返回true,否则,返回false eg: <div id= "a"> ...

  4. Linux系统基本的内存管理知识讲解

    内存是Linux内核所管理的最重要的资源之一.内存管理系统是操作系统中最为重要的部分,因为系统的物理内存总是少于系统所需要的内存数量.虚拟内存就是为了克服这个矛盾而采用的策略.系统的虚拟内存通过在各个 ...

  5. Timer in C#

    https://docs.microsoft.com/en-us/dotnet/api/system.timers.timer?view=netframework-4.7.2 Be aware tha ...

  6. scala学习手记13 - 类继承

    在scala里,类继承有两点限制: 重写方法需要使用override关键字: 只有主构造函数才能往父类构造函数中传参数. 在java1.5中引入了override注解,但不强制使用.不过在scala中 ...

  7. 如何让Myeclipse已经关闭掉的项目不显示出来

    一.打开Package Explorer视图,在它的右上角有一个向下的三角图标. 2.点击后选择Filters,在弹出的Filter配置窗口中选中"Closed Projects" ...

  8. angularjs分页组件

    这是我第一次写博客,激动,首先,我也是个菜鸟,分享一下自己写的服务器端分页的代码,自己一步一步写的,其中也有参考别人的代码.技术比较渣,先这样了. // ====== 2019-1-3 ======/ ...

  9. charles抓包工具的使用:手机抓包设置和安装证书

    一. 设置手机抓包 第一步:在charles里设置允许手机联网的权限,并设置接入接口 在Charles的菜单栏上选择"Proxy"->"Proxy Settings ...

  10. poj1986带权lca

    lca求距离,带权值 的树上求lca,我是用倍增法求的,求两点之间的距离转化为到根节点之间的距离 (de了一个小时 的bug,重打居然就过了....) #include<map> #inc ...