VC创建快捷方式

//得到当前桌面路径
BOOL GetDesktopPath(TCHAR * 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(TCHAR * pszIEQueickLaunchPath)
{
                 LPITEMIDLIST   ppidl;
                 if (SHGetSpecialFolderLocation(NULL , CSIDL_APPDATA, &ppidl) == S_OK )
                {
                                 BOOL flag = SHGetPathFromIDList (ppidl, pszIEQueickLaunchPath);
                                 lstrcat (pszIEQueickLaunchPath , _T( "\\Microsoft\\Internet Explorer\\Quick Launch" ));
                                CoTaskMemFree(ppidl);
                                 return flag;
                }
                 return FALSE ;
}

//得到 开始->程序组 的路径
BOOL GetProgramsPath(TCHAR * pszProgramsPath)
{
                 LPITEMIDLIST   ppidl;
                 if (SHGetSpecialFolderLocation(NULL , CSIDL_PROGRAMS, &ppidl) == S_OK )
                {
                                 BOOL flag = SHGetPathFromIDList (ppidl, pszProgramsPath);
                                CoTaskMemFree(ppidl);
                                 return flag;
                }
                 return FALSE ;
}

/*
函数功能:对指定文件在指定的目录下创建其快捷方式
函数参数:
lpszFileName    指定文件,为NULL表示当前进程的EXE文件。
lpszLnkFileDir  指定目录,不能为NULL。
lpszLnkFileName 快捷方式名称,为NULL表示EXE文件名。
wHotkey         为0表示不设置快捷键
pszDescription  备注
iShowCmd        运行方式,默认为常规窗口
*/

BOOL CreateFileShortcut(LPCTSTR lpszFileName, LPCTSTR lpszLnkFileDir , LPCTSTR lpszLnkFileName , LPCTSTR 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 ;
                }

                 //目标
                 if (lpszFileName == NULL)
                                pLink->SetPath( _wpgmptr );
                 else
                                pLink->SetPath( lpszFileName );

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

                                pLink->SetWorkingDirectory( lpszWorkDir );
                }

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

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

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

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

                                 if (pstr == NULL )
                                {
                                                ppf->Release();
                                                pLink->Release();
                                                 return FALSE ;
                                }

                                 //注意后缀名要从.exe改为.lnk
                                 wsprintf (szBuffer, _T ( "%s\\%s"), lpszLnkFileDir , pstr);
                                 int nLen = lstrlen (szBuffer);
                                szBuffer[nLen - 3] = 'l' ;
                                szBuffer[nLen - 2] = 'n' ;
                                szBuffer[nLen - 1] = 'k' ;
                }

                 //保存快捷方式到指定目录下

                 //WCHAR  wsz[MAX_PATH];  //定义Unicode字符串

                 //MultiByteToWideChar(CP_ACP, 0, szBuffer, -1, wsz, MAX_PATH);

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

                ppf->Release();
                pLink->Release();
                 return SUCCEEDED (hr);

}

调用

TCHAR wszModulePath[MAX_PATH ];
::memset(wszModulePath, 0, sizeof (TCHAR )* MAX_PATH);
GetModuleFileName (NULL , wszModulePath, MAX_PATH);
PathAppend (wszModulePath, _T ( "..\\"));
wcscat_s(wszModulePath, _T ("3D绘图宝.exe" ));

TCHAR wszModulePath2[MAX_PATH ];
::memset(wszModulePath2, 0, sizeof (TCHAR )* MAX_PATH);
GetModuleFileName (NULL , wszModulePath2, MAX_PATH);
PathAppend (wszModulePath2, _T ( "..\\"));

TCHAR   szPath[MAX_PATH ];
CoInitialize( NULL );

GetProgramsPath(szPath);
if (CreateFileShortcut(wszModulePath, szPath, NULL, wszModulePath2, MAKEWORD (VK_F12 , HOTKEYF_CONTROL ), _T ( "")))
{

}

memset(szPath, 0, sizeof (TCHAR )* MAX_PATH);

GetDesktopPath(szPath);
if (CreateFileShortcut(wszModulePath, szPath, NULL, wszModulePath2, MAKEWORD (VK_F12 , HOTKEYF_CONTROL ), _T ( "")))
{
        AfxMessageBox( _T ("软件安装成功欢迎使用。" ));
}


CoUninitialize();
本文为“技术点滴”的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注