请问如何创建快捷方式? 请问如何为一个EXE文件创建快捷方式文件并将快捷方式分别放在桌面上和快速启动上.谢谢! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 MSDN 的例子,创建快捷方式并改变图标 /*PARAMETERS fname_to_create_link = (e.g.) "c:\\mytextfile.txt" lnk_fname = (e.g.) "yourname.lnk" */ void CreateLinkThenChangeIcon(LPTSTR fname_to_create_link, LPTSTR lnk_fname) { HRESULT hres; IShellLink *psl = NULL; IPersistFile *pPf = NULL; WORD wsz[256]; TCHAR buf[256]; int id; LPITEMIDLIST pidl; hres = CoCreateInstance( CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (LPVOID*)&psl); if(FAILED(hres)) goto cleanup; hres = psl->QueryInterface(IID_IPersistFile, (LPVOID*)&pPf); if(FAILED(hres)) goto cleanup; hres = psl->SetPath(fname_to_create_link); if(FAILED(hres)) goto cleanup; //place the shortcut on the desktop SHGetSpecialFolderLocation(hwnd, CSIDL_DESKTOP, >pidl); SHGetPathFromIDList(pidl, buf); lstrcat(buf,"\\"); lstrcat(buf,lnk_fname); MultiByteToWideChar(CP_ACP, 0, buf, -1, wsz, MAX_PATH); hres = pPf->Save(wsz, TRUE); if(FAILED(hres)) goto cleanup; GetSystemDirectory(buf, 256); lstrcat(buf,"\\shell32.dll"); hres = psl->SetIconLocation(buf, 1); if(FAILED(hres)) goto cleanup; hres = psl->GetIconLocation(buf, 256, &id); if(FAILED(hres)) goto cleanup; pPf-&Save(wsz, TRUE); cleanup: if(pPf) pPf->Release(); if(psl) psl->Release(); } 在应用程序中创建快捷方式 [关键字: C/C++/VC++] 最后出处:http://www.cnpu.net 作者:不祥 收录于:2001年11月16日 1 引言 在Windows 3.x中,软件安装程序通常使用动态数据交换(DDE)的方法在程序管理器 (Program Manager)中创建一个程序组(Program Group)。随着Windows95/98/NT这些32 操作系统在系统内核和用户界面上的巨大改进,这种方法在已经不再适用了。现在,几 乎所有的安装程序都是在“开始”菜单中添加新的菜单项,或者在桌面上建立新的快捷 方式(Shortcut)(有时还要建立相应的菜单组或文件夹来包含多个菜单项或快捷方式), 以便于用户使用时方便快捷地启动软件。 通过手工操作建立这些菜单项或快捷方式并不复杂,在一般Windows使用手册中都有介 绍,相信大家都很熟悉,在此不再赘述。笔者在有关资料的基础上,通过实践摸索,找 到了在应用程序中完成上述工作的方法。这正是开发安装程序所必需的。 2 快捷方式的实质 Windows的快捷方式实际上是一个带有扩展名LNK的数据文件,其中包含有用于访问 Windows某一对象(即在资源管理器中所能浏览的所有对象,包括文件,文件夹,驱动 器及打印机等)的有关信息,如目标对象的路径和名称,工作目录,要传递的命令行参 数,运行时的初始显示状态,图标及其快捷键等。通过在快捷方式上单击鼠标右键并在 弹出菜单中选择“属性”可以观察该快捷方式的这些性质。 快捷方式的数据文件如果存放在C:\Windows\Desktop子目录下,这个快捷方式就会显示 在桌面上,而如果存放在C:\Windows\”Start Menu”\Programs子目录下,这个快捷方 式就会作为“开始”菜单的一个菜单项出现。而桌面上的文件夹和“开始”菜单的菜单 组则是上述两个子目录下的子目录的表现。 3 编程思想 Windows外壳(Shell)的快捷方式是以OLE技术的组件对象模型COM(Component Object Modal)为基础而设计的。利用COM模型,一个应用程序可以调用另一应用程序的某些功 能。这方面的技术细节请参阅有关文献。 在了解了上述基本原理后,创建Windows的快捷方式就比较容易了。首先利用OLE通过调 用CoCreateInstance()函数建立一个IID_IShellLink实例,并同时得到其接口指针。利 用这个接口指针可以对其各项属性进行设置。为了使这些信息以快捷方式的数据文件 (*.lnk)格式保存起来,还需要从IID_IShellLink对象取得其IID_IPersistFile接口指 针,以便于调用其成员函数Save()保存前面设置的信息。 至于如何删除快捷方式以及创建和删除文件夹,则只需要简单地调用文件操作函数 SHFileOperation()就可以了。 另外应该注意,在完成上述操作之后,都要调用SHChangeNotify()函数通知Windows外 壳有关变化以使之及时更新其显示状态。 4 应用举例 为了具体演示上述思想的使用方法,我们用MS VC++5.0编制了如下的示例程序(如下 图)。该示例程序为一个基于对话框的应用程序,两个圆形按钮用于设置要创建/删除 的文件夹或快捷方式的位置,下面的四个按钮则用于执行不同的操作。另外,该程序还 需要一个简单的对话框,用于输入要创建的文件夹或快捷方式的名称。 下面为建立该程序后需添加的代码(方框内部分): // SortCut.cpp : BOOL CSortCutApp::InitInstance() { ...... CoInitialize (NULL); CSortCutDlg dlg; m_pMainWnd = &dlg; ...... CoUninitialize (); return FALSE; } // SortCutDlg.cpp : #include "stdafx.h" #include "SortCut.h" #include "SortCutDlg.h" #include "NameDlg.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif file://起始文件夹的PIDL int nBeginAt=CSIDL_DESKTOPDIRECTORY; ...... ///浏览文件夹 BOOL BrowseForFolder( LPITEMIDLIST pidlRoot,//浏览开始处的PIDL LPITEMIDLIST *ppidlDestination, file://浏览结束时所选择的PIDL LPCSTR lpszTitle)//浏览对话框中的提示文字 { BROWSEINFO BrInfo ; ZeroMemory( &BrInfo, sizeof(BrInfo)) ; BrInfo.hwndOwner = HWND_DESKTOP ; BrInfo.pidlRoot = pidlRoot ; BrInfo.lpszTitle = lpszTitle ; file://浏览文件夹 *ppidlDestination= SHBrowseForFolder(&BrInfo); file://用户选择了取消按钮 if(NULL == *ppidlDestination) return FALSE ; return TRUE ; } file://取得快捷方式的目标应用程序名 SelectMenuItem( LPSTR szFileName) { OPENFILENAME ofn ; static CHAR szFilter[] = "Programs\0*.exe\0" ; ZeroMemory(&ofn, sizeof( OPENFILENAME)) ; ofn.lStructSize = sizeof( OPENFILENAME) ; ofn.hwndOwner = HWND_DESKTOP; ofn.lpstrFilter = szFilter ; ofn.nFilterIndex = 0 ; ofn.nMaxFile = MAX_PATH ; ofn.lpstrTitle = "请选择目标应用程序:" ; ofn.lpstrFile = szFileName ; ofn.Flags = OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST | OFN_EXPLORER ; file://文件浏览 if(!GetOpenFileName( &ofn))//选择了取消按钮 return FALSE ; return TRUE ; } file://取得要创建的快捷方式的名字 BOOL GetShortcutCrt(LPSTR szPath) { LPITEMIDLIST pidlBeginAt, pidlDestination ; // 取得开始菜单或桌面的PIDL SHGetSpecialFolderLocation( HWND_DESKTOP, nBeginAt, &pidlBeginAt) ; // 取得要创建的快捷方式所在的位置 if( !BrowseForFolder(pidlBeginAt, &pidlDestination, "请选择快捷方式所在的位置:")) return FALSE ; // 把PIDL转换为路径名 SHGetPathFromIDList( pidlDestination, szPath) ; // 取得快捷方式名称 CNameDlg name_dlg; if(name_dlg.DoModal() == IDCANCEL) return FALSE ; file://把快捷方式名和扩展名.LNK添加到路径名后 file://形成完整的快捷方式数据文件名 wsprintf(szPath+lstrlen(szPath),"\\%s.lnk", name_dlg.m_strName) ; return TRUE ; } file://创建快捷方式 BOOL CreateLink LPSTR szPath,//快捷方式的目标应用程序名 LPSTR szLink)//快捷方式的数据文件名(*.lnk) { HRESULT hres ; IShellLink * psl ; IPersistFile* ppf ; WORD wsz[ MAX_PATH] ; file://创建一个IShellLink实例 hres = CoCreateInstance( CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (void **)&psl) ; if( FAILED( hres)) return FALSE ; file://设置目标应用程序 psl -> SetPath( szPath) ; file://设置快捷键(此处设为Shift+Ctrl+'R') psl -> SetHotkey( MAKEWORD( 'R', HOTKEYF_SHIFT |HOTKEYF_CONTROL)) ; file://从IShellLink获取其IPersistFile接口 file://用于保存快捷方式的数据文件 (*.lnk) hres = psl -> QueryInterface( IID_IPersistFile, (void**)&ppf) ; if( FAILED( hres)) return FALSE ; // 确保数据文件名为ANSI格式 MultiByteToWideChar( CP_ACP, 0, szLink, -1, wsz, MAX_PATH) ; file://调用IPersistFile::Save file://保存快捷方式的数据文件 (*.lnk) hres = ppf -> Save( wsz, STGM_READWRITE) ; file://释放IPersistFile和IShellLink接口 ppf -> Release( ) ; psl -> Release( ) ; return TRUE; } file://删除文件夹 BOOL DeleteFolder( LPSTR pszFolder) { SHFILEOPSTRUCT fos ; ZeroMemory( &fos, sizeof( fos)) ; fos.hwnd = HWND_DESKTOP; fos.wFunc = FO_DELETE ; fos.fFlags = FOF_SILENT | FOF_ALLOWUNDO ; fos.pFrom = pszFolder ; // 删除文件夹及其内容 if( 0 != SHFileOperation( &fos)) return FALSE ; #include <shobjidl.h>::CoInitialize(NULL);IShellLink* pShellLink = NULL;HRESULT hr = ::CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_ALL, IID_IShellLink, reinterpret_cast<void**>(&pShellLink));if (FAILED(hr)){ ::CoUninitialize(); return;}hr = pShellLink->SetPath(_T("E:\\天河传说\\SkyRiver.exe"));if (FAILED(hr)){ pShellLink->Release(); ::CoUninitialize(); return;}hr = pShellLink->SetWorkingDirectory(_T("E:\\天河传说\\"));if (FAILED(hr)){ pShellLink->Release(); ::CoUninitialize(); return;}IPersistFile* pPF = NULL;hr = pShellLink->QueryInterface(IID_IPersistFile, reinterpret_cast<void**>(&pPF));if (FAILED(hr)){ pShellLink->Release(); ::CoUninitialize(); return;}hr = pPF->Save(L"C:\\天河传奇.lnk", TRUE);pPF->Release();pShellLink->Release();::CoUninitialize();IShellLink还有如下的一些方法:SetArguments是用来设置运行参数的SetDescription是用来设置快捷方式描述的SetHotKey是用来设置快捷键的其他还有一些你可以看看MSDN 加入新的类 怎么使它出现在 类向导的class type 的下拉菜单中, 多个应用程序共用一个端口是什么情况? CScrollView 求救:怎样在资源中添加msado15.dll Socket->Connect()的问题,求救? 学习串口通信系列问题(一) 在VC里面怎样把整型数转换为字符串? 生成*.exe问题!(吐血送分---50!) NSIS 32位/64位共用一个安装包 窗口,视口 这是一个sniffer程序,为什么在VC中没编译通过。 基础问题
fname_to_create_link = (e.g.) "c:\\mytextfile.txt"
lnk_fname = (e.g.) "yourname.lnk"
*/ void CreateLinkThenChangeIcon(LPTSTR fname_to_create_link,
LPTSTR lnk_fname)
{
HRESULT hres;
IShellLink *psl = NULL;
IPersistFile *pPf = NULL;
WORD wsz[256];
TCHAR buf[256];
int id;
LPITEMIDLIST pidl; hres = CoCreateInstance( CLSID_ShellLink, NULL,
CLSCTX_INPROC_SERVER,
IID_IShellLink,
(LPVOID*)&psl);
if(FAILED(hres))
goto cleanup;
hres = psl->QueryInterface(IID_IPersistFile, (LPVOID*)&pPf);
if(FAILED(hres))
goto cleanup;
hres = psl->SetPath(fname_to_create_link);
if(FAILED(hres)) goto cleanup;
//place the shortcut on the desktop
SHGetSpecialFolderLocation(hwnd, CSIDL_DESKTOP, >pidl); SHGetPathFromIDList(pidl, buf); lstrcat(buf,"\\");
lstrcat(buf,lnk_fname); MultiByteToWideChar(CP_ACP, 0, buf, -1, wsz, MAX_PATH); hres = pPf->Save(wsz, TRUE); if(FAILED(hres)) goto cleanup; GetSystemDirectory(buf, 256); lstrcat(buf,"\\shell32.dll"); hres = psl->SetIconLocation(buf, 1); if(FAILED(hres)) goto cleanup; hres = psl->GetIconLocation(buf, 256, &id); if(FAILED(hres)) goto cleanup; pPf-&Save(wsz, TRUE); cleanup: if(pPf) pPf->Release(); if(psl) psl->Release(); }
最后出处:http://www.cnpu.net 作者:不祥 收录于:2001年11月16日
1 引言
在Windows 3.x中,软件安装程序通常使用动态数据交换(DDE)的方法在程序管理器
(Program Manager)中创建一个程序组(Program Group)。随着Windows95/98/NT这些32
操作系统在系统内核和用户界面上的巨大改进,这种方法在已经不再适用了。现在,几
乎所有的安装程序都是在“开始”菜单中添加新的菜单项,或者在桌面上建立新的快捷
方式(Shortcut)(有时还要建立相应的菜单组或文件夹来包含多个菜单项或快捷方式),
以便于用户使用时方便快捷地启动软件。
通过手工操作建立这些菜单项或快捷方式并不复杂,在一般Windows使用手册中都有介
绍,相信大家都很熟悉,在此不再赘述。笔者在有关资料的基础上,通过实践摸索,找
到了在应用程序中完成上述工作的方法。这正是开发安装程序所必需的。 2 快捷方式的实质
Windows的快捷方式实际上是一个带有扩展名LNK的数据文件,其中包含有用于访问
Windows某一对象(即在资源管理器中所能浏览的所有对象,包括文件,文件夹,驱动
器及打印机等)的有关信息,如目标对象的路径和名称,工作目录,要传递的命令行参
数,运行时的初始显示状态,图标及其快捷键等。通过在快捷方式上单击鼠标右键并在
弹出菜单中选择“属性”可以观察该快捷方式的这些性质。
快捷方式的数据文件如果存放在C:\Windows\Desktop子目录下,这个快捷方式就会显示
在桌面上,而如果存放在C:\Windows\”Start Menu”\Programs子目录下,这个快捷方
式就会作为“开始”菜单的一个菜单项出现。而桌面上的文件夹和“开始”菜单的菜单
组则是上述两个子目录下的子目录的表现。 3 编程思想
Windows外壳(Shell)的快捷方式是以OLE技术的组件对象模型COM(Component Object
Modal)为基础而设计的。利用COM模型,一个应用程序可以调用另一应用程序的某些功
能。这方面的技术细节请参阅有关文献。
在了解了上述基本原理后,创建Windows的快捷方式就比较容易了。首先利用OLE通过调
用CoCreateInstance()函数建立一个IID_IShellLink实例,并同时得到其接口指针。利
用这个接口指针可以对其各项属性进行设置。为了使这些信息以快捷方式的数据文件
(*.lnk)格式保存起来,还需要从IID_IShellLink对象取得其IID_IPersistFile接口指
针,以便于调用其成员函数Save()保存前面设置的信息。
至于如何删除快捷方式以及创建和删除文件夹,则只需要简单地调用文件操作函数
SHFileOperation()就可以了。
另外应该注意,在完成上述操作之后,都要调用SHChangeNotify()函数通知Windows外
壳有关变化以使之及时更新其显示状态。 4 应用举例
为了具体演示上述思想的使用方法,我们用MS VC++5.0编制了如下的示例程序(如下
图)。该示例程序为一个基于对话框的应用程序,两个圆形按钮用于设置要创建/删除
的文件夹或快捷方式的位置,下面的四个按钮则用于执行不同的操作。另外,该程序还
需要一个简单的对话框,用于输入要创建的文件夹或快捷方式的名称。 下面为建立该程序后需添加的代码(方框内部分):
// SortCut.cpp :
BOOL CSortCutApp::InitInstance()
{
......
CoInitialize (NULL);
CSortCutDlg dlg;
m_pMainWnd = &dlg;
......
CoUninitialize ();
return FALSE;
}
// SortCutDlg.cpp :
#include "stdafx.h"
#include "SortCut.h"
#include "SortCutDlg.h" #include "NameDlg.h" #ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif file://起始文件夹的PIDL
int nBeginAt=CSIDL_DESKTOPDIRECTORY;
......
///浏览文件夹
BOOL BrowseForFolder(
LPITEMIDLIST pidlRoot,//浏览开始处的PIDL
LPITEMIDLIST *ppidlDestination,
file://浏览结束时所选择的PIDL
LPCSTR lpszTitle)//浏览对话框中的提示文字
{ BROWSEINFO BrInfo ; ZeroMemory( &BrInfo, sizeof(BrInfo)) ;
BrInfo.hwndOwner = HWND_DESKTOP ;
BrInfo.pidlRoot = pidlRoot ;
BrInfo.lpszTitle = lpszTitle ; file://浏览文件夹
*ppidlDestination= SHBrowseForFolder(&BrInfo);
file://用户选择了取消按钮
if(NULL == *ppidlDestination)
return FALSE ;
return TRUE ;
}
file://取得快捷方式的目标应用程序名
SelectMenuItem( LPSTR szFileName)
{
OPENFILENAME ofn ;
static CHAR szFilter[] = "Programs\0*.exe\0" ; ZeroMemory(&ofn, sizeof( OPENFILENAME)) ;
ofn.lStructSize = sizeof( OPENFILENAME) ;
ofn.hwndOwner = HWND_DESKTOP;
ofn.lpstrFilter = szFilter ;
ofn.nFilterIndex = 0 ;
ofn.nMaxFile = MAX_PATH ;
ofn.lpstrTitle = "请选择目标应用程序:" ;
ofn.lpstrFile = szFileName ;
ofn.Flags = OFN_FILEMUSTEXIST |
OFN_PATHMUSTEXIST | OFN_EXPLORER ;
file://文件浏览
if(!GetOpenFileName( &ofn))//选择了取消按钮
return FALSE ;
return TRUE ;
}
file://取得要创建的快捷方式的名字
BOOL GetShortcutCrt(LPSTR szPath)
{
LPITEMIDLIST pidlBeginAt, pidlDestination ; // 取得开始菜单或桌面的PIDL
SHGetSpecialFolderLocation( HWND_DESKTOP,
nBeginAt, &pidlBeginAt) ;
// 取得要创建的快捷方式所在的位置
if( !BrowseForFolder(pidlBeginAt,
&pidlDestination,
"请选择快捷方式所在的位置:"))
return FALSE ;
// 把PIDL转换为路径名
SHGetPathFromIDList( pidlDestination, szPath) ;
// 取得快捷方式名称
CNameDlg name_dlg;
if(name_dlg.DoModal() == IDCANCEL)
return FALSE ;
file://把快捷方式名和扩展名.LNK添加到路径名后
file://形成完整的快捷方式数据文件名
wsprintf(szPath+lstrlen(szPath),"\\%s.lnk",
name_dlg.m_strName) ;
return TRUE ;
}
file://创建快捷方式
BOOL CreateLink LPSTR szPath,//快捷方式的目标应用程序名
LPSTR szLink)//快捷方式的数据文件名(*.lnk)
{
HRESULT hres ;
IShellLink * psl ;
IPersistFile* ppf ;
WORD wsz[ MAX_PATH] ;
file://创建一个IShellLink实例
hres = CoCreateInstance( CLSID_ShellLink, NULL,
CLSCTX_INPROC_SERVER, IID_IShellLink,
(void **)&psl) ;
if( FAILED( hres))
return FALSE ;
file://设置目标应用程序
psl -> SetPath( szPath) ;
file://设置快捷键(此处设为Shift+Ctrl+'R')
psl -> SetHotkey( MAKEWORD( 'R',
HOTKEYF_SHIFT |HOTKEYF_CONTROL)) ;
file://从IShellLink获取其IPersistFile接口
file://用于保存快捷方式的数据文件 (*.lnk)
hres = psl -> QueryInterface( IID_IPersistFile,
(void**)&ppf) ;
if( FAILED( hres))
return FALSE ;
// 确保数据文件名为ANSI格式
MultiByteToWideChar( CP_ACP, 0, szLink, -1,
wsz, MAX_PATH) ;
file://调用IPersistFile::Save
file://保存快捷方式的数据文件 (*.lnk)
hres = ppf -> Save( wsz, STGM_READWRITE) ;
file://释放IPersistFile和IShellLink接口
ppf -> Release( ) ;
psl -> Release( ) ;
return TRUE;
}
file://删除文件夹
BOOL DeleteFolder( LPSTR pszFolder)
{
SHFILEOPSTRUCT fos ; ZeroMemory( &fos, sizeof( fos)) ;
fos.hwnd = HWND_DESKTOP;
fos.wFunc = FO_DELETE ;
fos.fFlags = FOF_SILENT | FOF_ALLOWUNDO ;
fos.pFrom = pszFolder ; // 删除文件夹及其内容
if( 0 != SHFileOperation( &fos))
return FALSE ;
HRESULT hr = ::CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_ALL, IID_IShellLink, reinterpret_cast<void**>(&pShellLink));
if (FAILED(hr))
{
::CoUninitialize();
return;
}hr = pShellLink->SetPath(_T("E:\\天河传说\\SkyRiver.exe"));
if (FAILED(hr))
{
pShellLink->Release();
::CoUninitialize();
return;
}hr = pShellLink->SetWorkingDirectory(_T("E:\\天河传说\\"));
if (FAILED(hr))
{
pShellLink->Release();
::CoUninitialize();
return;
}IPersistFile* pPF = NULL;
hr = pShellLink->QueryInterface(IID_IPersistFile, reinterpret_cast<void**>(&pPF));
if (FAILED(hr))
{
pShellLink->Release();
::CoUninitialize();
return;
}hr = pPF->Save(L"C:\\天河传奇.lnk", TRUE);pPF->Release();
pShellLink->Release();::CoUninitialize();
IShellLink还有如下的一些方法:
SetArguments是用来设置运行参数的
SetDescription是用来设置快捷方式描述的
SetHotKey是用来设置快捷键的
其他还有一些你可以看看MSDN