1

我正在尝试为我默默开发的 .net 2.0 应用程序检测和安装 reportviewer 2005 我已经下载了 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;

如果我在安装了 reportviewer 的开发机器上运行 inno 设置,它仍然会弹出 reportviewer 设置并且它不会静默安装

我究竟做错了什么?

编辑

我发现安装silen的参数是ReportViewer.exe /q:a /c:"install.exe /q" 我如何/q:a /c:"install.exe /q"将shell执行命令传递给?

4

1 回答 1

2

你应该看两件事:

第一名(感谢发现此问题的 TLama)

字符串-字符串中Key存在冗余。HKEY_LOCAL_MACHINE\Value

你打电话给HKLM分支RegQueryDWordValue(HKLM, key, 'Install', install);

正确的Key应该是:

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


第二

如果您知道命令行参数,则可以调用 ReportViewer 的静默安装。

如您所知,您持有 use /q:a /c:"install.exe /q",您只需将其添加到ShellExec函数中:

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

于 2013-06-05T10:27:04.380 回答