vc 创建桌面快捷方式

BOOL CDlg::CreateDesktopShotCut(CString strName, CString strSourcePath)
{
    if (FAILED(CoInitialize(NULL)))
        return FALSE;
    BOOL bRet = FALSE;
    
    TCHAR Path[MAX_PATH+1];
    CString strDestDir;
    LPITEMIDLIST pidl;
    LPMALLOC pShell;
    if(SUCCEEDED(SHGetMalloc(&pShell)))
    {
        if(SUCCEEDED(SHGetSpecialFolderLocation(NULL,CSIDL_DESKTOPDIRECTORY,&pidl)))
        {
            if(!SHGetPathFromIDList(pidl,Path))
            {
                pShell->Free(pidl);
            }
            pShell->Release();
            strDestDir.Format(_T("%s"),Path);
            strDestDir+= _T("\\");
            strDestDir+= strName;//设置桌面快捷方式的名字
            strDestDir+= _T(".lnk");
            IShellLink* psl;
            
            if(SUCCEEDED(CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (LPVOID*)&psl)))
            {
                psl->SetPath(strSourcePath + _T("Player.exe"));//设置快捷方式的目标位置 
                //比如目标位置为C:\windows\a.txt 起始位置就应该设置为C:\windows否则会导致不可预料的错误
                
                //如果是文件夹的快捷方式起始位置和目标位置可以设置为一样
                
                psl->SetWorkingDirectory(strSourcePath); //设置快捷方式的起始位置 
                IPersistFile* ppf;
                if(SUCCEEDED(psl->QueryInterface(IID_IPersistFile,(LPVOID*)&ppf)))
                {
                    //WCHAR wsz[MAX_PATH];
                    //MultiByteToWideChar(CP_THREAD_ACP,MB_PRECOMPOSED, (LPCTSTR)strDestDir,-1,wsz,MAX_PATH);//设置桌面快捷方式的名字
                    if(SUCCEEDED(ppf->Save(strDestDir,TRUE)))//保存快捷方式到桌面 
                    {
                        ppf->Release();
                        psl->Release();
                        bRet = TRUE;
                    }else{
                        ppf->Release();
                        psl->Release();
                    }
                }else{
                    ppf->Release();
                    psl->Release();
                }
            }
        }
    }

    CoUninitialize();

    if (!bRet)
    {
        LPVOID   lpMsgBuf; 
        FormatMessage( 
            FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, 
            NULL, 
            GetLastError(), 
            MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language 
            (LPTSTR) &lpMsgBuf, 
            0, 
            NULL 
            ); 
        //   Display   the   string. 
        TRACE(_T("----------------Create Link Error: %s\r\n"), (TCHAR*)lpMsgBuf);
        _ComnLog->LogOutV(_T("----------------CreateDesktopShotCut Failed: %s\r\n"), (TCHAR*)lpMsgBuf);
        //   Free   the   buffer. 
        LocalFree(   lpMsgBuf   ); 
    }
    return bRet;
}
原文地址:https://www.cnblogs.com/qintangtao/p/2918184.html