清泛IT社区App Inventor 2 中文社区

搜索

扫码访问移动社区 移动社区,您的掌上技术专家

关注我,精彩不错过! 关注我,精彩不错过!

扫码安装最新版AI伴侣 最新版AI伴侣v2.72

Aia Store .aia 源码一站式解决方案 发布日志AI2连接测试ai2Starter模拟器

开通会员送SVIPApp Inventor 2 拓展有奖征文 VIP会员享专有教程,免费赠送基础版*技术支持服务! AI2入门必读中文文档中文教程IoT专题

查看: 1004|回复: 0
打印 上一主题 下一主题

c++ 代码调用nsis安装包实现静默安装

  • TA的每日心情
    开心
    2024-02-17 18:16
  • 签到天数: 14 天

    [LV.3]偶尔看看II

    546

    主题

    715

    帖子

    1万

    积分

    管理员

    这里没有广告...

    Rank: 9Rank: 9Rank: 9

    积分
    10709
    QQ
    跳转到指定楼层
    楼主
    发表于 2016-04-08 16:58:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    1. TCHAR szCurPath[MAX_PATH] = {0};
    2. GetCurrentDirectory(MAX_PATH, szCurPath);

    3. TCHAR szFile[MAX_PATH] = {0};
    4. _stprintf_s(szFile, MAX_PATH, _T("%s\\setup.exe"), szCurPath);

    5. CString szPath = szFile;
    6. CString szCmdline = _T("");
    7. CString szWorking;
    8. szWorking = szPath.Mid( 0, szPath.ReverseFind( '\\' ) );
    9.         
    10. PROCESS_INFORMATION pi;
    11. STARTUPINFO si;
    12. memset( &si, 0, sizeof( si ) );
    13. si.cb = sizeof( si );
    14. si.wShowWindow = SW_SHOW;
    15. si.dwFlags = STARTF_USESHOWWINDOW;

    16. szCmdline = _T("/NCRC /S /D=");
    17. szCmdline.Append(szCurPath);

    18. BOOL fRet = CreateProcess( szPath, szCmdline.GetBuffer(), NULL, FALSE, NULL, NULL, NULL, szWorking, &si, &pi );
    19. ...
    复制代码
    以上方法使用CreateProcess函数创建一个进程并启动安装包静默安装,/D指定默认安装位置(没有引号,否则不生效),优先级最高。
    不过当遇到需要提示权限的情况(需要以管理员身份运行),CreateProcess会执行失败,这时需提升权限,代码如下:
    1. // ------提升权限------
    2.         // Initialize the structure.
    3.         SHELLEXECUTEINFO sei = { sizeof(SHELLEXECUTEINFO) };
    4.         sei.fMask = SEE_MASK_NOCLOSEPROCESS;
    5.         // Ask for privileges elevation.
    6.         sei.lpVerb = TEXT("runas");

    7.         // Create a Command Prompt from which you will be able to start
    8.         // other elevated applications.
    9.         sei.lpFile = szFile;
    10.         sei.lpParameters = szCmdline;
    11.         sei.lpDirectory = szWorking;

    12.         // Don't forget this parameter; otherwise, the window will be hidden.
    13.         sei.nShow = SW_SHOWNORMAL;

    14.         if (!ShellExecuteEx(&sei)) {
    15.                 DWORD dwStatus = GetLastError();

    16.                 if (dwStatus == ERROR_CANCELLED) {
    17.                         // The user refused to allow privileges elevation.
    18.                         UpdateMessage(_T("用户拒绝安装,升级失败。"));
    19.                 }
    20.                 else if (dwStatus == ERROR_FILE_NOT_FOUND) {
    21.                         // The file defined by lpFile was not found and
    22.                         // an error message popped up.
    23.                         UpdateMessage(_T("升级包不存在,请检查!"));
    24.                 }

    25.                 CString strMsg;
    26.                 ::GetLastErrorString(strMsg);
    27.                 LOG_ERROR(_T("启动安装程序失败:%s"), strMsg);

    28.                 return -1;
    29.         }

    30.         m_hCreatePackage = sei.hProcess;                // 句柄
    复制代码
    m_hCreatePackage 存储安装包进程的句柄,有了它我们就可以使用 WaitForSingleObject 对其执行各阶段的逻辑进行处理,后面请大家自己发挥了。
    清泛网 - 专注IT技能提升
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    © 2024 tsingfun.com, Inc.  沪ICP备2020034476号-1  沪公网安备31011702000040号

    GMT+8, 2024-11-22 18:13 , Processed in 0.024640 second(s), 39 queries .