请问如何为一个EXE文件创建快捷方式文件并将快捷方式分别放在桌面上和快速启动上.谢谢!

解决方案 »

  1.   

    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();   } 
      

  2.   

    在应用程序中创建快捷方式  [关键字: 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 ; 
     
      

  3.   

    #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