Windows C++ 创建桌面快捷方式

创建.exe的桌面快捷方式

大致分五步

1.获取快捷方式的起始位置(开始执行的位置)与目标位置(最终指向的exe全地址),可选获取图标地址,参数列表
2.获取创建实例,创建ShellLink对象并将1中属性赋予对象
3.通过ShellLink对象获取IPersistFile对象(用于将文件存储于磁盘)
4.通过给予save方法快捷方式的路径,将快捷方式创建于此。
5.释放资源(release)
下面直接贴代码~
//标准字符串转宽字符串
 std::wstring s2ws(const std::string &s)
 {
     int len;
     int slength = (int)s.length() + 1;
     len = MultiByteToWideChar(CP_ACP, NULL, s.c_str(), slength, nullptr, 0);
     wchar_t* buf = new wchar_t[len];
     MultiByteToWideChar(CP_ACP, NULL, s.c_str(), slength, buf, len);
     std::wstring r(buf);
     delete[] buf;
     return r;
 }
//宽字符串转标准字符串
 std::string ws2s(const std::wstring &s)
 {
     int len;
     int slength = (int)s.length() + 1;
     len = WideCharToMultiByte(CP_ACP, NULL, s.c_str(), slength, nullptr, 0, 0, 0);
     char* buf = new char[len];
     WideCharToMultiByte(CP_ACP, NULL, s.c_str(), slength, buf, len, 0, 0);
     std::string r(buf);
     delete[] buf;
     return r;
 }
/*
   BOOL TestCreateDesktopShotCut(
              wstring strName,                      //快捷方式名称
              wstring strTargetPath,              //快捷方式目标位置
              wstring strIconPath                 //图标路径
              wstring strArguments              //参数设置
              )
*/


BOOL CreateDesktopShortCut(int argc, char **argv)
{
    if (FAILED(CoInitialize(NULL)))
        return FALSE;
    BOOL bRet = FALSE;

    wstring strName = s2ws(argv[2]);
    wstring strTargetPath = s2ws(argv[3]);
    wstring strIconPath = s2ws(argv[4]);
    wstring strArguments = s2ws(argv[5]);

    TCHAR Path[MAX_PATH+1];
    wstring strDestDir;
    LPITEMIDLIST pidl;
    LPMALLOC pShell;
    if(SUCCEEDED(SHGetMalloc(&pShell)))	//获取内存控制指针pShell
    {
        if(SUCCEEDED(SHGetSpecialFolderLocation(NULL,CSIDL_DESKTOPDIRECTORY,&pidl)))
        {
            if(!SHGetPathFromIDList(pidl,Path))
            {
                pShell->Free(pidl);
            }
            pShell->Release();
            strDestDir = stringformatW(L"%s\\%s.lnk",Path,strName.c_str());
             TRACKINFO("strDestDir = %s\r\n",strDestDir.c_str());
            IShellLink* psl;
            
			//获取ShellLink指针
            if(SUCCEEDED(CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (LPVOID*)&psl)))	
            {
                psl->SetPath(strTargetPath.c_str());                         //设置快捷方式的目标位置
                psl->SetWorkingDirectory(strTargetPath.c_str());   //设置快捷方式的起始位置(暂时设为目标位置)
                psl->SetIconLocation(strIconPath.c_str(), 0);           //设置图标路径
                psl->SetArguments(strArguments.c_str());               //设置参数

                TRACKINFO("strTargetPath = %s,strArguments = %s\r\n",strTargetPath.c_str(),strArguments.c_str());

                IPersistFile* ppf;
                if(SUCCEEDED(psl->QueryInterface(IID_IPersistFile,(LPVOID*)&ppf)))
                {
                    if(SUCCEEDED(ppf->Save(strDestDir.c_str(),TRUE)))//保存快捷方式到桌面
                    {
                        bRet = TRUE;
                        system(ws2s(strDestDir.c_str()).c_str());   //启动该快捷方式
                    }
                }
                ppf->Release();
                psl->Release();
            }
        }
    }

    CoUninitialize();
    return bRet;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值