清泛IT社区

标题: c++ 代码调用nsis安装包实现静默安装 [打印本页]

作者: 清泛网    时间: 2016-04-08 16:58
标题: c++ 代码调用nsis安装包实现静默安装
  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社区 (https://bbs.tsingfun.com/) Powered by Discuz! X3.3