• 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);

    }

    相关头文件自行引入

  • 相关阅读:
    C# 程序一个cmd命令窗口执行多条dos命令
    单例模式学习
    C#中的typeof()和GetType()的区别
    C#判断字符串A是否包含字符串B--by winter
    ASP.NET内置对象Session缺点及解决办法---by winter
    冒泡排序--by winter
    as关键字---?号用法---各种路径
    自创page类中获取当前用户权限 --by winter
    自建的Page类的使用--by winter
    无法添加App_Code文件的解决办法
  • 原文地址:https://www.cnblogs.com/snowbook/p/5363509.html
Copyright © 2020-2023  润新知