创建桌面快捷方式

在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 创建桌面快捷方式的更多相关文章

  1. windows创建桌面快捷方式的VBA脚本

    Dim wShell, oShortcut    'Dim strDesktop$ ' 为了与VBS兼容,    Dim strDesktop    ' 这里改写一下,测试通过...    Set w ...

  2. Windows中创建桌面快捷方式

    Windows中创建桌面快捷方式 -------------- -------------- -------------- --------------

  3. 手把手教你在ubuntu下创建桌面快捷方式

    习惯使用windows的朋友来说创建桌面快捷方式简直就是so easy, 鼠标右键点击文件-->选择发送桌面快捷方式.就OK了.对于ubuntu下该如何创建桌面快捷方式呢?以下以创建eclips ...

  4. winform创建桌面快捷方式

    //引用IWshRuntimeLibrary COM组件-Windows Script Host Object Model /// <summary> /// 创建快捷方式的类 /// & ...

  5. Ubuntu创建桌面快捷方式

    默认情况下,ubuntu会将自动安装的软件快捷方式保存在/usr/share/applications目录下,如果我们要创建桌面快捷方式,只需要右键-复制-桌面 就Ok,如图: 上面的方法是通过系统自 ...

  6. WPF 创建桌面快捷方式

    #region 创建桌面快捷方式 string deskTop = System.Environment.GetFolderPath(System.Environment.SpecialFolder. ...

  7. 解决Inno Setup制作安装包无法创建桌面快捷方式的问题

    转自:http://yedward.net/?id=104 昨天想把个java程序做成exe安装软件,然后就去下载了Inno Setup这个软件安装包制作软件,Inno Setup这个软件确实非常好用 ...

  8. C#创建桌面快捷方式 和 开机启动

              /// <summary>         /// 创建桌面快捷方式 2010-11-25         /// </summary>         p ...

  9. android 为应用程序创建桌面快捷方式技巧分享

    手机装的软件过多,找起来很不方便,所以在主页面有一个快捷方式的话会很不错的,本文将介绍如何实现,需要了解跟多的朋友可以参考下     我们开发一款软件后,如果手机装的软件过多,去翻的话会很难翻的,所以 ...

随机推荐

  1. java的null

    null表示没有地址,它可以赋值给引用变量,但不能将null赋给基本类型变量,例如int.double.float.boolean

  2. 20145222黄亚奇《网络对抗》web安全基础实践

    web安全基础实践 实验后回答问题 (1)SQL注入攻击原理,如何防御 原理:指web应用程序对用户输入数据的合法性没有判断,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语 ...

  3. React生命周期及事件详解

    引用原文:http://blog.csdn.net/limm33/article/details/50942808 一.组件的详细说明和生命周期ComponentSpecs and Lifecycle ...

  4. centos、linux关机与重启命令详解

    Linux centos关机与重启命令详解与实战 Linux centos重启命令: 1.reboot 2.shutdown -r now 立刻重启(root用户使用) 3.shutdown -r 1 ...

  5. Timer in C#

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

  6. java分页的实现(后台工具类和前台jsp页面)

    1.首先,新建一个类Page.java public class Page implements Serializable { private static final long serialVers ...

  7. Pandas时间差(Timedelta)

    时间差(Timedelta)是时间上的差异,以不同的单位来表示.例如:日,小时,分钟,秒.它们可以是正值,也可以是负值.可以使用各种参数创建Timedelta对象,如下所示 - 字符串 通过传递字符串 ...

  8. Android中getDimension,getDimensionPixelOffset和getDimensionPixelSize 区别

    getDimension 获取某个dimen的值,如果是dp或sp的单位,将其乘以density,如果是px,则不乘   返回float getDimensionPixelOffset 获取某个dim ...

  9. 虚拟主机(多站点配置)的实现--centos上的实现

    Apache中配置多主机多站点,可以通过两种方式实现 将同一个域名的不同端口映射到不同的站点(虚拟主机) 将同一个端口映射成不同的域名,不同的域名映射到不同的站点 两种方法可以同时存在,局域网通过   ...

  10. MySQL二进制日志功能介绍

    二进制日志记录所有更新数据的SQL语句,其中也包含可能更新数据的SQL语句,例如DELETE语句执行过程中无匹配的行.二进制日志中还包含了与执行SQL语句相关的内容,例如SQL语句执行的时间.错误代码 ...