автоматически обнаруживать и устанавливать reportviwer с помощью inno setup

я пытаюсь обнаружить и установить reportviewer 2005 для приложения .net 2.0, которое я разрабатываю молча, я уже загрузил распространяемый установщик reportviewer 2005, и у меня есть этот скрипт

Код для проверки, установлен ли ReportViewer

/////////////////////////////////////////////////
// check if report viewer is installed
////////////////////////////////////////////////
function IsReportViewerInstalled(version: string): boolean;
//    'v2.0.50727'          .NET Framework 2.0

var
    key: string;
    install: cardinal;
    success: boolean;
       ErrorCode: Integer;
begin

    // installation all report viewer
    key := 'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ReportViewer\' + version;

    success := RegQueryDWordValue(HKLM, key, 'Install', install);

    result := success and (install = 1);
end;

код для обнаружения и установки

if not IsReportViewerInstalled('v2.0.50727') then  begin
        ExtractTemporaryFile('ReportViewer.exe');
        Log(ExpandConstant('{tmp}\ReportViewer.exe'));
        if ShellExec('', ExpandConstant('{tmp}\ReportViewer.exe'), '','', SW_SHOWNORMAL, ewWaitUntilTerminated, ErrorCode) then  begin
              Result := True;
           end  else begin
    MsgBox('ReportViewer installation failed. '+SysErrorMessage(ErrorCode), mbError, MB_OK);
              Result := false;
        end;
end else  begin
    result := true;
end;

если я запускаю установку inno на своем компьютере разработчика, на котором установлен ReportViewer, он все равно выдает настройку ReportViewer, и он не устанавливается автоматически

Что я делаю не так?

Изменить

Я обнаружил, что параметром для установки silen является ReportViewer.exe /q:a /c:"install.exe /q", как мне добавить /q:a /c:"install.exe /q" в команду выполнения оболочки?


person Smith    schedule 04.06.2013    source источник
comment
Я не вижу параметра для установки в автоматическом режиме для ReportViewer.exe. Вы должны добавить определенный параметр (например, /q или /silent — вы должны проверить, какой из них является правильным для этого приложения). Изменить: я проверил: ваш отсутствующий параметр /Q. Таким образом, строка будет: ShellExec('', ExpandConstant('{tmp}\ReportViewer.exe'), '\Q',ExpandConstant('{tmp}'), SW_HIDE, ewWaitUntilTerminated, ErrorCode)   -  person RobeN    schedule 04.06.2013
comment
я получаю сообщение об ошибке командной строки, когда выполняю ваш код ShellExec('', ExpandConstant('{tmp}\ReportViewer.exe'), '\Q',ExpandConstant('{tmp}'), SW_HIDE, ewWaitUntilTerminated, ErrorCode)   -  person Smith    schedule 04.06.2013
comment
Извините за опечатку: должно быть /Q, а не \Q :(   -  person RobeN    schedule 04.06.2013
comment
он не молчит, он по-прежнему открывает диалоговое окно настройки ReportViewer.exe. возможно, я плохо обнаруживаю   -  person Smith    schedule 04.06.2013
comment
Хорошо, я скачал ReportViewer 2005, и на самом деле он неправильно определяет параметр. Но когда я распаковал (просто распаковал с помощью 7z) ReportViewer.exe, я смог установить приложение без вывода сообщений с помощью install.exe /q   -  person RobeN    schedule 04.06.2013
comment
как насчет обнаружения, если он уже установлен   -  person Smith    schedule 04.06.2013
comment
Вы видите рег. значение ключа, которое вы запрашиваете в реестре?   -  person TLama    schedule 04.06.2013
comment
да [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ReportViewer\v2.0.50727] "Install"=dword:00000001   -  person Smith    schedule 04.06.2013
comment
А, теперь я вижу это. Удалите эту часть HKEY_LOCAL_MACHINE из пути к ключу. Запросить только ключ 'SOFTWARE\Microsoft\ReportViewer\ + Version'. Этот корневой ключ HKEY_LOCAL_MACHINE, который вы передаете HKLM в вызове функции RegQueryDWordValue.   -  person TLama    schedule 04.06.2013
comment
@RobeN эта команда install.exe /q выдала ошибку командной строки   -  person Smith    schedule 04.06.2013
comment
Что касается install.exe /q, я успешно установил приложение с помощью этой команды, когда у меня были извлечены все (41) установочные файлы (вы не установите приложение, если будете извлекать только install.exe; у вас должен быть хотя бы один языковой файл, MSI, INI и CAB-файлы).   -  person RobeN    schedule 04.06.2013
comment
Команда остается аналогичной, вы просто заменяете параметр /Q своей новой строкой /q:a /c:"install.exe /q", хотя ewWaitUntilTerminated в этом случае может работать некорректно - вы должны проверить это на своей стороне. ShellExec('', ExpandConstant('{tmp}\ReportViewer.exe'), '/q:a /c:"install.exe /q"', ExpandConstant('{tmp}'), SW_HIDE, ewWaitUntilTerminated, ErrorCode)   -  person RobeN    schedule 04.06.2013
comment
Поскольку вы запускаете exe-файл, использование Exec лучше, чем использование ShellExec. Параметры немного отличаются, но они достаточно похожи, чтобы их можно было легко преобразовать. Просто прочитайте документацию в файле справки.   -  person Miral    schedule 05.06.2013
comment
@roben, вы можете опубликовать ответ, чтобы я мог отметить решенным   -  person Smith    schedule 05.06.2013


Ответы (1)


Есть 2 вещи, на которые вы должны обратить внимание:

1 место (спасибо TLama, которая заметила эту проблему)

Строка Key - в строке Value есть лишнее HKEY_LOCAL_MACHINE\.

Вы звоните в HKLM филиал в RegQueryDWordValue(HKLM, key, 'Install', install);

Правильный Key должен быть:

key := 'SOFTWARE\Microsoft\ReportViewer\' + version;


2nd

Вы можете вызвать автоматическую установку ReportViewer, если знаете параметры командной строки.

Поскольку вы знаете, что вам следует использовать /q:a /c:"install.exe /q", вы просто добавляете его в функцию ShellExec:

ShellExec('', ExpandConstant('{tmp}\ReportViewer.exe'), '/q:a /c:"install.exe /q"', ExpandConstant('{tmp}'), SW_HIDE, ewWaitUntilTerminated, ErrorCode)

person RobeN    schedule 05.06.2013