精华内容
下载资源
问答
  • 通常的应用软件安装程序会在Windows的开始菜单和桌面创建快捷方式的图标,现在我们也为MyProg.exe创建快捷方式的图标,先来看看如何在开始菜单创建图标: [Setup] AppName=MySetup AppVersion=1.0.0.0 ...

    接着上次的内容,我们在空的安装程序里加入一个程序文件并安装到目标路径:

     

    [Setup]
    AppName=MySetup
    AppVersion=1.0.0.0
    DefaultDirName={pf}\MySetup
    
    [Languages]
    Name: "eng"; MessagesFile: "compiler:default.isl"
    Name: "chs"; MessagesFile: "compiler:Languages\ChineseSimplified.isl"
    
    [Files]
    Source: "compiler:\Examples\MyProg.exe"; DestDir: "{app}"


    加入的文件在Files段里列出,Source表示其源路径,DestDir代表其目标安装路径。

     

    InnoSetup所在目录的Examples子目录下有示例文件,这里直接引用了其中的MyProg.exe,所以其路径以compiler:\Examples\MyProg.exe来表示。

    而其目标安装路径则指向{app},也就是用户设置的安装目录,其默认值就是Setup段的DefaultDirName属性值,这里是{pf}\MySetup。

     

    在InnoSetup Studio中按F9运行安装程序,安装完成后,到系统的程序目录可以找到MySetup子目录,可以看到有下面几个文件,说明安装成功:

     

    除了我们加入的MyProg.exe外,还有uninsxxx开头的文件(xxx代表数字),如unins000.exe是卸载程序,而unins000.dat则保存了卸载所要用到的信息。

    运行unins000.exe,则会运行卸载程序,完成后会自动删除安装的文件及目录。

     

     

     

    通常的应用软件安装程序会在Windows的开始菜单和桌面创建快捷方式的图标,现在我们也为MyProg.exe创建快捷方式的图标,先来看看如何在开始菜单中创建图标:

     

     

    [Setup]
    AppName=MySetup
    AppVersion=1.0.0.0
    DefaultDirName={pf}\MySetup
    DefaultGroupName=MySetup
    
    [Languages]
    Name: "eng"; MessagesFile: "compiler:default.isl"
    Name: "chs"; MessagesFile: "compiler:Languages\ChineseSimplified.isl"
    
    [Files]
    Source: "compiler:\Examples\MyProg.exe"; DestDir: "{app}"
    
    [Icons]
    Name: "{group}\MyProg"; Filename: "{app}\MyProg.exe"; WorkingDir: "{app}"


    注意到上面的代码在[Setup]段多出了DefaultGroupName=MySetup,表示要开始菜单中的默认程序组名为MySetup,它可以用常量{group}来引用。

     

    而下面多出的[Icons]段则告诉安装程序要创建哪些图标,Name指定了图标的位置及名称,而Filename则指向实际的文件路径,WorkingDir则指向文件的工作目录。

    示例中Name为{group}\MyProg,表示在{group}指定的程序组中创建一个名为MyProg的快捷方式,它指向的文件为Filename中指定的{app}\MyProg.exe,表示应用安装目录中的MyProg.exe文件,其工作目录为{app}指向的应用程序安装目录。

     

    按F9运行上面的安装脚本后,在Windows 10系统的开始菜单中可以发现名为MySetup的程序组,包含了我们创建的快捷方式MyProg:

     

    在MyProg上点击鼠标右键,再左击打开文件所在位置,可以定位到该快捷方式实际的存储位置:

    在MyProg快捷方式上右击鼠标,点击属性后,可以看到快捷方式的详细信息:

     

    快捷方式属性页里显示的起始位置就对应于安装脚本中指定的WorkingDir,这里指向了应用程序实际的默认安装路径"C:\Program Files (x86)\MySetup"。

     

    因为MyProg.exe是一个可执行文件 ,并且自身有一个图标资源,所以快捷方式的图标会自动设置为MyProg.exe的这个图标。

    展开全文
  • Qt之创建桌面和开始菜单快捷方式

    千次阅读 2017-01-02 19:50:28
    将安装好的酷狗拷贝到C:\data目录中1.创建桌面快捷方式QFile::link("C:/data/KuGou.exe", QStandardPaths::writableLocation(QStandardPaths::...2.创建开始菜单快捷方式QString startMenuPath=QSta...

    将安装好的酷狗拷贝到C:\data目录中

    1.创建桌面快捷方式

    QFile::link("C:/data/KuGou.exe", QStandardPaths::writableLocation(QStandardPaths::DesktopLocation).append("/").append("KuGou.lnk"));
    2.创建开始菜单快捷方式
    QString startMenuPath=QStandardPaths::writableLocation(QStandardPaths::ApplicationsLocation).append("/").append(QStringLiteral("酷狗"));
    QDir dir(startMenuPath);
    if(!dir.exists())
    {
         dir.mkdir(startMenuPath);
    }
    if(dir.exists())
    {
         QFile::link("C:/data/KuGou.exe", startMenuPath.append("/").append("KuGou.lnk"));
    }

    3.将快捷方式锁定到任务栏

    Win7、Win8有效

       //快捷方式必须存在,才能锁定到任务栏
       QFile::link("C:/data/KuGou.exe", QStandardPaths::writableLocation(QStandardPaths::DesktopLocation).append("/").append("KuGou.lnk"));
       QString strTemp=QStandardPaths::writableLocation(QStandardPaths::DesktopLocation).append("/").append("KuGou.lnk");
    
       //锁定到任务栏
       int nRet = (int)::ShellExecute(NULL, QString("taskbarpin").toStdWString().c_str(), strTemp.toStdWString().c_str(), NULL, NULL, SW_SHOW);
       //返回值大于32表示成功
       if (nRet <= 32)
       {
           qDebug() << "无法将快捷方式锁定到任务栏!";
       }
       //解锁
       nRet = (int)::ShellExecute(NULL, QString("taskbarunpin").toStdWString().c_str(), strTemp.toStdWString().c_str(), NULL, NULL, SW_SHOW);
       if (nRet <= 32)
       {
            qDebug() << "解锁失败!";
       }



    展开全文
  • Qt创建桌面和开始菜单快捷方式

    千次阅读 2017-11-04 16:51:49
    使用QFile的link方法可以非常方便的创建快捷方式 //建立桌面快捷方式 QString strAppPath = "C:/Windows/System32/notepad.exe"; QString strDesktopLink = QStandardPaths::writableLocation...

    使用QFile的link方法可以非常方便的创建快捷方式

        //建立桌面快捷方式
        QString strAppPath = "C:/Windows/System32/notepad.exe";
        QString strDesktopLink = QStandardPaths::writableLocation(QStandardPaths::DesktopLocation) + "/";
        strDesktopLink += "notepad.lnk";
        QFile fApp(strAppPath);
        fApp.link(strDesktopLink);
    
        //建立开始菜单快捷方式
        QString strMenuLink = QStandardPaths::writableLocation(QStandardPaths::ApplicationsLocation) + "/";
        strMenuLink += "notepad/";
        QDir pathDir;
        pathDir.mkpath(strMenuLink);
        strMenuLink += "notepad.lnk";
        fApp.link(strMenuLink);
    

    在这里插入图片描述

    需要完整代码请访问QtReleaseExamples

    联系方式:


    作者 郑天佐
    QQ 278969898
    主页 http://www.camelstudio.cn
    邮箱 camelsoft@163.com
    博客 http://blog.csdn.net/zhengtianzuo06
    github https://github.com/zhengtianzuo
    QQ群 199672080

    在这里插入图片描述

    觉得分享的内容还不错, 就请作者喝杯咖啡吧~~

    展开全文
  • VC++创建快捷方式、删除快捷方式、添加开始菜单程序组菜单并删除程序组菜单的实例,这些小技巧都是在平时软件开发过程中经常用到的功能,有必要掌握。删除快捷方式只需要简单地调用文件操作函数SHFileOperation()就...

    VC++创建快捷方式、删除快捷方式、添加开始菜单程序组菜单并删除程序组菜单的实例,这些小技巧都是在平时软件开发过程中经常用到的功能,有必要掌握。删除快捷方式只需要简单地调用文件操作函数SHFileOperation()就可以了,在完成上述操作后,要调用SHChangeNotify()通知Windows外壳更新状态变化。

    VC++增加程序组(创建文件夹)和快捷方式,及删除操作相关代码如下:

    001 //浏览文件夹
    002 BOOL CShortCutDlg::BrowseForFolder(
    003     LPITEMIDLIST pidlRoot,//浏览开始处的PIDL
    004     LPITEMIDLIST *ppidlDestination,
    005                 //浏览结束时所选择的PIDL
    006     LPCSTR lpszTitle)//浏览对话框中的提示文字
    007 {
    008     BROWSEINFO BrInfo ;
    009     ZeroMemory( &BrInfo, sizeof(BrInfo)) ;
    010     BrInfo.hwndOwner = HWND_DESKTOP ;
    011     BrInfo.pidlRoot = pidlRoot ;
    012     BrInfo.lpszTitle = lpszTitle ;
    013     //浏览文件夹
    014     *ppidlDestination= SHBrowseForFolder(&BrInfo);
    015     //用户选择了取消按钮
    016     if(NULL == *ppidlDestination)
    017         return FALSE ;
    018     return TRUE ;
    019 }
    020 //取得快捷方式的目标应用程序名
    021 BOOL CShortCutDlg::SelectMenuItem( LPSTR szFileName)
    022 {
    023     OPENFILENAME ofn ;
    024     static CHAR szFilter[] = "Programs\0*.exe\0" ;
    025     ZeroMemory(&ofn, sizeof( OPENFILENAME)) ;
    026     ofn.lStructSize = sizeof( OPENFILENAME) ;
    027     ofn.hwndOwner = HWND_DESKTOP;
    028     ofn.lpstrFilter = szFilter ;
    029     ofn.nFilterIndex = 0 ;
    030     ofn.nMaxFile = MAX_PATH ;
    031     ofn.lpstrTitle = "请选择目标应用程序:" ;
    032     ofn.lpstrFile = szFileName ;
    033     ofn.Flags = OFN_FILEMUSTEXIST |
    034             OFN_PATHMUSTEXIST | OFN_EXPLORER ;
    035     //文件浏览
    036     if(!GetOpenFileName( &ofn))//选择了取消按钮
    037         return FALSE ;
    038     return TRUE ;
    039 }
    040 //取得要创建的快捷方式的名字
    041 BOOL CShortCutDlg::GetShortcutCrt(LPSTR szPath)
    042 {
    043     LPITEMIDLIST pidlBeginAt, pidlDestination ;
    044  
    045     // 取得开始菜单或桌面的PIDL
    046     SHGetSpecialFolderLocation( HWND_DESKTOP,
    047                 nBeginAt, &pidlBeginAt) ;
    048     // 取得要创建的快捷方式所在的位置
    049     if( !BrowseForFolder(pidlBeginAt, &pidlDestination,
    050                 "请选择快捷方式所在的位置:"))
    051         return FALSE ;
    052     // 把PIDL转换为路径名
    053     SHGetPathFromIDList( pidlDestination, szPath) ;
    054     // 取得快捷方式名称
    055     CNameDlg name_dlg;
    056     if(name_dlg.DoModal() == IDCANCEL)
    057         return FALSE ;
    058     //把快捷方式名和扩展名.LNK添加到路径名后
    059     //形成完整的快捷方式数据文件名
    060     wsprintf(szPath+lstrlen(szPath),"\\%s.lnk",
    061                 name_dlg.m_strName) ;
    062     return TRUE ;
    063 }
    064 //创建快捷方式
    065 BOOL CShortCutDlg::CreateLink (
    066     LPSTR szPath,//快捷方式的目标应用程序名
    067     LPSTR szLink)//快捷方式的数据文件名(*.lnk)
    068 {
    069     HRESULT hres ;
    070     IShellLink * psl ;
    071     IPersistFile* ppf ;
    072     WORD wsz[ MAX_PATH] ;
    073     //创建一个IShellLink实例
    074     hres = CoCreateInstance( CLSID_ShellLink, NULL,
    075         CLSCTX_INPROC_SERVER, IID_IShellLink,
    076         (void **)&psl) ;
    077     if( FAILED( hres))
    078         return FALSE ;
    079     //设置目标应用程序
    080     psl -> SetPath( szPath) ;
    081     //设置快捷键(此处设为Shift+Ctrl+'R')
    082     psl -> SetHotkey( MAKEWORD( 'R',
    083         HOTKEYF_SHIFT |HOTKEYF_CONTROL)) ;
    084     //从IShellLink获取其IPersistFile接口
    085     //用于保存快捷方式的数据文件 (*.lnk)
    086     hres = psl -> QueryInterface( IID_IPersistFile,
    087         (void**)&ppf) ;
    088     if( FAILED( hres))
    089         return FALSE ;
    090     // 确保数据文件名为ANSI格式
    091     MultiByteToWideChar( CP_ACP, 0, szLink, -1,
    092         wsz, MAX_PATH) ;
    093     //调用IPersistFile::Save
    094     //保存快捷方式的数据文件 (*.lnk)
    095     hres = ppf -> Save( wsz, STGM_READWRITE) ;
    096     //释放IPersistFile和IShellLink接口
    097     ppf -> Release( ) ;
    098     psl -> Release( ) ;
    099     return TRUE;
    100 }
    101 BOOL CShortCutDlg::DeleteFolder( LPSTR pszFolder)
    102 {
    103     SHFILEOPSTRUCT fos ;
    104  
    105     ZeroMemory( &fos, sizeof( fos)) ;
    106     fos.hwnd = HWND_DESKTOP;
    107     fos.wFunc = FO_DELETE ;
    108     fos.fFlags = FOF_SILENT | FOF_ALLOWUNDO ;
    109     fos.pFrom = pszFolder ;
    110     // 删除文件夹及其内容
    111     if( 0 != SHFileOperation( &fos))
    112         return FALSE ;
    113     return TRUE;
    114 }
    115 //取得要删除的快捷方式
    116 BOOL CShortCutDlg::GetShortcutDel (
    117         LPSTR lpszInitDir,//选择文件的开始目录
    118         LPSTR lpszShortcut)//快捷方式名
    119 {
    120     OPENFILENAME ofn ;
    121     char szFilter[] = "Shortcuts\0*.lnk\0" ;
    122     ZeroMemory(&ofn,sizeof( OPENFILENAME));
    123     ofn.lStructSize = sizeof( OPENFILENAME) ;
    124     ofn.hwndOwner = HWND_DESKTOP ;
    125     ofn.lpstrFilter = szFilter ;
    126     ofn.nFilterIndex = 0 ;
    127     ofn.nMaxFile = MAX_PATH ;
    128     ofn.lpstrTitle = "请选择要删除的快捷方式:" ;
    129     ofn.lpstrFile = lpszShortcut;
    130     ofn.lpstrInitialDir = lpszInitDir ;
    131     ofn.Flags = OFN_FILEMUSTEXIST |
    132         OFN_PATHMUSTEXIST | OFN_EXPLORER |
    133         OFN_NODEREFERENCELINKS ;
    134     //文件浏览
    135     if(! GetOpenFileName( &ofn))//选择了取消按钮
    136         return FALSE ;
    137     return TRUE ;
    138 }
    139 //删除快捷方式的数据文件 (*.lnk)
    140 BOOL CShortCutDlg::DeleteLink( LPSTR lpszShortcut)
    141 {
    142     SHFILEOPSTRUCT fos ;
    143     ZeroMemory( &fos, sizeof(fos)) ;
    144     fos.hwnd = HWND_DESKTOP ;
    145     fos.wFunc = FO_DELETE ;
    146     fos.pFrom = lpszShortcut;
    147     fos.pTo = NULL ;
    148     fos.fFlags = FOF_SILENT | FOF_ALLOWUNDO ;
    149     //删除快捷方式(*.lnk)
    150     if( 0 != SHFileOperation( &fos))
    151         return FALSE ;
    152     return TRUE ;
    153 }
    154 // 通知shell有关变化
    155 void CShortCutDlg::NotifyShell(LONG wEventId,//事件标志
    156             LPSTR szPath)//路径
    157 {
    158     SHChangeNotify( wEventId,
    159                     SHCNF_FLUSH | SHCNF_PATH,
    160                     szPath,0);
    161     //取得szPath的父目录
    162     char* p;
    163     for( p=szPath+lstrlen(szPath)-1;
    164             *p != '\\';
    165             p--);
    166     *p='\0';
    167     SHChangeNotify(SHCNE_UPDATEDIR
    168             |SHCNE_INTERRUPT,
    169             SHCNF_FLUSH | SHCNF_PATH,szPath,0);
    170 }
    171 void CShortCutDlg::OnCreateGroup()
    172 {
    173     UpdateData(TRUE);
    174     if(m_nLocation==0)
    175     {
    176         //设置起始文件夹为桌面
    177         nBeginAt=CSIDL_DESKTOPDIRECTORY ;
    178     }
    179     else
    180     {
    181         //设置起始文件夹为“开始”菜单
    182         nBeginAt=CSIDL_STARTMENU;
    183     }
    184     LPITEMIDLIST pidlBeginAt, pidlDestination ;
    185     char szPath[ MAX_PATH] ;
    186     // 取得开始菜单或桌面的PIDL
    187     SHGetSpecialFolderLocation( HWND_DESKTOP,
    188             nBeginAt, &pidlBeginAt) ;
    189     // 取得新建文件夹的父文件夹
    190     if( !BrowseForFolder(pidlBeginAt ,
    191             &pidlDestination,
    192             "请选择新建文件夹/菜单组的位置:"))
    193         return ;
    194     // 把PIDL转换为路径名
    195     SHGetPathFromIDList( pidlDestination, szPath) ;
    196     //取得新建文件夹的名字
    197     CNameDlg name_dlg;
    198     if(name_dlg.DoModal() == IDCANCEL)
    199         return;
    200     //形成完整的新建文件夹名
    201     wsprintf(szPath+lstrlen(szPath),"\\%s",
    202                 name_dlg.m_strName);