创建快捷方式 (并添加到快速启动栏 、桌面、开始菜单)

首先需要获取三个路径 :桌面路径 、快速启动栏路径、 开始->程序组路径

//得到当前桌面路径  
BOOL GetDesktopPath(char *pszDesktopPath)  
{  
    LPITEMIDLIST  ppidl = NULL;   

    if (SHGetSpecialFolderLocation(NULL, CSIDL_DESKTOP, &ppidl) == S_OK)  
    {  
        BOOL flag = SHGetPathFromIDList(ppidl, pszDesktopPath);  
        CoTaskMemFree(ppidl);  
        return flag;  
    }  

    return FALSE;  
}     
//得到快速启动栏的路径  
BOOL GetIEQuickLaunchPath(char *pszIEQueickLaunchPath)  
{     
    LPITEMIDLIST  ppidl;              

    if (SHGetSpecialFolderLocation(NULL, CSIDL_APPDATA, &ppidl) == S_OK)  
    {  
        BOOL flag = SHGetPathFromIDList(ppidl, pszIEQueickLaunchPath);  
        strcat(pszIEQueickLaunchPath, "\\Microsoft\\Internet Explorer\\Quick Launch");  
        CoTaskMemFree(ppidl);  
        return flag;  
    }  

    return FALSE;  
}  
//得到 开始->程序组 的路径  
BOOL GetProgramsPath(char *pszProgramsPath)  
{  
    LPITEMIDLIST  ppidl;   

    if (SHGetSpecialFolderLocation(NULL, CSIDL_PROGRAMS, &ppidl) == S_OK)  
    {  
        BOOL flag = SHGetPathFromIDList(ppidl, pszProgramsPath);  
        CoTaskMemFree(ppidl);  
        return flag;  
    }  

    return FALSE;  
}  

这样返回的
pszProgramsPath就是指当前获取的路径


程序的思路:得到路径,在当前路径下创建exe相对应的快捷方式,并通过ShellExecute函数来锁定到快速启动栏或开始菜单


/* 
函数功能:对指定文件在指定的目录下创建其快捷方式 
函数参数: 
lpszFileName    指定文件,为NULL表示当前进程的EXE文件。 
lpszLnkFileDir  指定目录,不能为NULL。 
lpszLnkFileName 快捷方式名称,为NULL表示EXE文件名。 
wHotkey         为0表示不设置快捷键 
pszDescription  备注 
iShowCmd        运行方式,默认为常规窗口 
*/  
BOOL CreateFileShortcut(LPCSTR lpszFileName, LPCSTR lpszLnkFileDir, LPCSTR lpszLnkFileName, LPCSTR lpszWorkDir, WORD wHotkey, LPCTSTR lpszDescription, int iShowCmd = SW_SHOWNORMAL)  
{  
    if (lpszLnkFileDir == NULL)  
        return FALSE;  

    HRESULT hr;  
    IShellLink     *pLink;  //IShellLink对象指针  
    IPersistFile   *ppf; //IPersisFil对象指针  

    //创建IShellLink对象  
    hr = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (void**)&pLink);  
    if (FAILED(hr))  
        return FALSE;  

    //从IShellLink对象中获取IPersistFile接口  
    hr = pLink->QueryInterface(IID_IPersistFile, (void**)&ppf);  
    if (FAILED(hr))  
    {  
        pLink->Release();  
        return FALSE;  
    }  
    //获取当前exe所在路径
    TCHAR exeFullPath[MAX_PATH]; // MAX_PATH
    GetModuleFileName(NULL,exeFullPath,MAX_PATH);
    
    //目标  
    if (lpszFileName == NULL)  
        pLink->SetPath(_pgmptr);  
    else  
        pLink->SetPath(exeFullPath); 

    //工作目录  
    if (lpszWorkDir != NULL)  
        pLink->SetWorkingDirectory(lpszWorkDir);  

    //快捷键  
    if (wHotkey != 0)  
        pLink->SetHotkey(wHotkey);  

    //备注  
    if (lpszDescription != NULL)  
        pLink->SetDescription(lpszDescription);  

    //显示方式  
    pLink->SetShowCmd(iShowCmd);  

    //快捷方式的路径 + 名称  
    char szBuffer[MAX_PATH];  
    if (lpszLnkFileName != NULL) //指定了快捷方式的名称  
        sprintf(szBuffer, "%s\\%s", lpszLnkFileDir, lpszLnkFileName);  
    else     
    {  
        //没有指定名称,就从取指定文件的文件名作为快捷方式名称。  
        //char *pstr;  

        char *buf = new char[strlen(lpszFileName)+1];
        strcpy(buf, lpszFileName);  

        if (buf == NULL)  
        {     
            ppf->Release();  
            pLink->Release();  
            return FALSE;  
        }  
        //注意后缀名要从.exe改为.lnk  
        sprintf(szBuffer, "%s\\%s", lpszLnkFileDir, buf);  
        int nLen = strlen(szBuffer);
        //char lkName = ;
        strcat(szBuffer, ".lnk");
    }  
    //保存快捷方式到指定目录下  
    WCHAR  wsz[MAX_PATH];  //定义Unicode字符串  
    MultiByteToWideChar(CP_ACP, 0, szBuffer, -1, wsz, MAX_PATH);  

    hr = ppf->Save(wsz, TRUE);  

    ppf->Release();  
    pLink->Release();  
    CoUninitialize(); //释放com接口
    return SUCCEEDED(hr);  
}  

下面说一下调用 :


char  szPath[MAX_PATH];  
CoInitialize(NULL);  

GetDesktopPath(szPath);
//GetIEQuickLaunchPath(szPath);
//GetProgramsPath(szPath);
            
if (!CreateFileShortcut(_T("QQMusicEx"), szPath, NULL, NULL, 0 , NULL)) 
    return ;
else
{
    //strcat(szPath,"\\QQMusicEx.lnk");
    //ShellExecute(NULL,_T("TaskbarPin"), szPath, NULL, NULL, SW_SHOW); // 锁定程序到任务栏
    //ShellExecute(NULL,_T("startpin"), szPath, NULL, NULL, SW_SHOW); // 锁定程序到开始菜单
                //startpin
}

红色代表桌面快捷方式,下面的else注释掉 

蓝色放开注释,else里面的strcat跟着一起放开

紫色放开注释,else操作同上


注意:1.  需要注意的是 在创建开解方式的时候需要添加头文件 

#include <shlobj.h>

#pragma comment(lib, "shell32.lib")


2. TaskbarPin是锁定  Task
barUnpin是解锁 

    startpin和startunpin是相对应的

    原文作者:张念
    原文地址: https://blog.csdn.net/qq_25867649/article/details/53741227
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞