zoukankan      html  css  js  c++  java
  • 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);

    }

    相关头文件自行引入

  • 相关阅读:
    Android通过包名启动应用程序
    android 通过反射方法获取状态栏高度
    Android在输入法界面监听按键(以返回键为例)
    Android主动弹出输入法
    Android使用内部类自定义控件
    Android中ListView列表Item的圆角效果实现
    Android中关于系统Dialog无法全屏的问题
    Dart学习记录(五)
    Dart学习记录(四)—— 库
    Dart学习记录(三)—— 泛型
  • 原文地址:https://www.cnblogs.com/snowbook/p/5363509.html
Copyright © 2011-2022 走看看