如何在桌面或者开始菜单中创建快捷方式

源地址:http://blog.csdn.net/vcforever/article/details/326269

作者:vcforever

//在桌面或者开始菜单中创建快捷方式
//pazSrcPath:源文件路径
//bDesktop:标志位,用来判断是否在桌面上创建快捷方式,真,在桌面上创建,否则在开始菜单中创建

bool createShortcut(const char* pszSrcPath, bool bDesktop)
{
    CoInitialize(NULL);

    bool bRet = false;
    IShellLink* psl;
    LPITEMIDLIST pidl;
    LPMALLOC pShellMalloc;
    std::string strDesktopPath;
    std::string strStartMenuPath;

    const int nFolder[2] = { CSIDL_DESKTOPDIRECTORY,CSIDL_STARTMENU };

    if (SUCCEEDED(SHGetMalloc(&pShellMalloc))) {
        char Path[MAX_PATH + 1];
        for (int i = 0; i < 2; i++) {
            if (SUCCEEDED(SHGetSpecialFolderLocation(NULL, nFolder[i], &pidl))) {
                if (SHGetPathFromIDList(pidl, Path)) {
                    if (i == 0)
                        strDesktopPath = Path;
                    else
                        strStartMenuPath = Path;
                }
                pShellMalloc->Free(pidl);
            }
        }
        pShellMalloc->Release();
    }

    char szFileTitle[MAX_PATH] = { 0 };
    ::GetFileTitle(pszSrcPath, szFileTitle, MAX_PATH);

    std::string str;
    if (bDesktop)
        str = strDesktopPath;
    else
        str = strStartMenuPath;

    str += "//";
    str += std::string(szFileTitle);
    str += ".lnk";

    HRESULT hr = CoCreateInstance(CLSID_ShellLink,
             NULL,CLSCTX_INPROC_SERVER,
             IID_IShellLink,
             (LPVOID*)&psl);
    if (SUCCEEDED(hr)) {
        IPersistFile* ppf;
        psl->SetPath(pszSrcPath);
        psl->SetDescription("Shortcut created by custom code");
        psl->SetShowCmd(SW_SHOW);
        if (SUCCEEDED(psl->QueryInterface(IID_IPersistFile, (LPVOID *)&ppf))) {
            WORD mbw[MAX_PATH];
            MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, str.c_str(), -1, mbw, MAX_PATH);
            if (SUCCEEDED(ppf->Save(mbw, TRUE)))
                bRet = true;
            ppf->Release();
        }
        psl->Release();
    }

    CoUninitialize();

    return bRet;
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值