如何在VC++中创建快捷方式
Windows快捷方式是扩展名为*.lnk的数据文件,一般是在桌面和开始菜单中。本文介绍如何在VC中创建应用程序快捷方式和INTERNET快捷方式。创建普通快捷方式非常简单。首先调用CoCreateInstance()函数创建一个IID_IShellLink实例,得到其接口指针。 利用接口指针对其快捷方式的属性进行设置。再从IID_IShellLink对象取得其IID_IPersistFile接口指针,调用函数Save() 保存前面设置的信息即可。如果要想删除快捷方式或创建和删除文件夹,只需要调用文件操作函数SHFileOperation()进行操作即可。完成上述操 作之后,调用SHChangeNotify()函数通知Windows外壳有关变化以使之及时更新其显示状态。
如需要创建Internet快捷方式,方法也类似处理,不过是创建IID_InternetShortcut实例。下面直接附上两个例子。
示例1:
//创建普通快捷方式
BOOL CModieDlg::fnCreateLink ( )
{
LPCSTR pszPath,pszLink;
pszPath="C:\123.exe";//目标程序名
pszLink="c:\\123.url";//快捷方式名
HRESULT hres=NULL;
IShellLink * psl ;
IPersistFile* ppf ;
WCHAR wsz[MAX_PATH]; // buffer for Unicode string
hres = CoCreateInstance( CLSID_ShellLink, NULL,CLSCTX_INPROC_SERVER, IID_IShellLink,(void **)&psl) ;
if(NULL ==hres) return FALSE ;
psl->SetPath(pszPath) ;//设置路径
psl->SetHotkey(MAKEWORD('A',HOTKEYF_CONTROL)) ; //设置快捷键、热键
hres = psl -> QueryInterface( IID_IPersistFile, (void**)&ppf);//获取IPersistFile接口
if(NULL ==hres) return FALSE ;
MultiByteToWideChar(CP_ACP,0,pszLink,-1,wsz,MAX_PATH);
hres = ppf -> Save( pszLink, STGM_READWRITE) ;//保存快捷方式
ppf->Release();//释放IPersistFile和IShellLink接口
psl->Release();
// 通知SHELL变化
SHChangeNotify( ....) ;//从略,具体可以参考该函数定义,一般创建后通知本目录和父目录即可。
return TRUE;
}
//删除快捷方式
BOOL CModieDlg::fnDeleteLink( LPSTR lpszShortcut)
{
SHFILEOPSTRUCT fost ;
ZeroMemory( &fos, sizeof(fost )) ;
fost .hwnd = HWND_DESKTOP ;
fost .wFunc = FO_DELETE ;//操作代码
fost .pFrom = lpszShortcut;
fost .pTo = NULL ;
fost .fFlags = FOF_SILENT | FOF_ALLOWUNDO ;
//删除快捷方式
if( 0 != SHFileOperation( &fost )) return FALSE ;
return TRUE ;
}
示例2:
//创建INTERNET快捷方式
#include <intshcut.h> //一定要包含这个文件
void CModieDlg::OnButton1()
{
// TODO: Add your control notification handler code here
HRESULT hRes;
IUniformResourceLocator *pURL = NULL;
LPCSTR pszURL,pszLinkFile;
pszURL="http://www.metsky.com";
pszLinkFile="c:\\metsky.url";
//Create an IUniformResourceLocator object
hRes =CoCreateInstance(CLSID_InternetShortcut,NULL,CLSCTX_INPROC_SERVER,IID_IUniformResourceLocator,(LPVOID*) &pURL);
if(SUCCEEDED(hRes))
{
IPersistFile *pPF = NULL;
hRes =pURL->SetURL(pszURL, 0);
if (SUCCEEDED(hRes))
{
WCHAR wsz[MAX_PATH]; // buffer for Unicode string
//Ensure that the string consists of ANSI characters.
MultiByteToWideChar(CP_ACP,0,pszLinkFile,-1,wsz,MAX_PATH);
hRes = pURL->QueryInterface(IID_IPersistFile, (void **)&pPF);
if(SUCCEEDED(hRes))
{
// Save the shortcut via the IPersistFile::Save member function.
hRes =pPF->Save(wsz,TRUE);
// Release the pointer to IPersistFile.
pPF->Release();
}
}
// Release the pointer to IUniformResourceLocator
pURL->Release();
}
}
