【问题标题】:Command Line Parms: Function Return Type As Array?命令行参数:函数返回类型为数组?
【发布时间】:2017-11-23 04:57:58
【问题描述】:

这是current problem:
this solution 之后使用命令行参数执行卸载字符串:
以下是我们以非功能代码的形式拥有的内容:

const MAX_PATH = 260;
function GetUninstallString(): TArrayOfString;
var
  sUnInstPath: String;
  sUnInstallString: String;
  sUnInstallStringPrm: String;

begin
sUnInstPath := ExpandConstant('Software\Microsoft\Windows\CurrentVersion\Uninstall\{#MyAppName}');
sUnInstallString := '';
if not RegQueryStringValue(HKLM, sUnInstPath, 'UninstallString', sUnInstallString) then
RegQueryStringValue(HKCU, sUnInstPath, 'UninstallString', sUnInstallString);

if sUnInstallString = '' Then
Begin
sUnInstPath := ExpandConstant('Software\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\{#MyAppName}');
RegQueryStringValue(HKLM, sUnInstPath, 'UninstallString', sUnInstallString);
End;
if sUnInstallString <> '' Then
Begin
sUnInstallStringPrm:= copy(sUnInstallString, pos(' ', sUnInstallString) + 1, MAX_PATH);
MsgBox(sUnInstallStringPrm, mbInformation, MB_OK);
Delete(sUnInstallString, pos(' ', sUnInstallString), MAX_PATH);
End;
Result := [sUnInstallString, UnInstallStringPrm];
end;


/////////////////////////////////////////////////////////////////////
function IsUpgrade(): Boolean;
begin
  Result := (GetUninstallString() <> '');
end;


/////////////////////////////////////////////////////////////////////
function UnInstallOldVersion(): Integer;
var
  sUnInstallString: String;
  iResultCode: Integer;
begin
// Return Values:
// 1 - uninstall string is empty
// 2 - error executing the UnInstallString
// 3 - successfully executed the UnInstallString

  // default return value
  Result := 0;

  // get the uninstall string of the old app
  sUnInstallString := GetUninstallString();
  if sUnInstallString <> '' then begin
    sUnInstallString := RemoveQuotes(sUnInstallString);
    if ShellExec('open', sUnInstallString, '','', SW_SHOW, ewWaitUntilTerminated, iResultCode) then
    Result := 3
    else
    Result := 2;
  end else
  Result := 1;
end;

/////////////////////////////////////////////////////////////////////
procedure CurStepChanged(CurStep: TSetupStep);
begin
  if (CurStep=ssInstall) then
  begin
    if (IsUpgrade()) then
    begin
      UnInstallOldVersion();
    end;
  end;
end;

关于如何在这种情况下使用 GetUninstallString 的信息很少。有可能吗?
不确定是否可以将包含 sUnInstallString... 的字符串数组作为上述夹具中的参数传递,尽管作为数组的返回类型似乎更适合一点。

【问题讨论】:

    标签: arrays function types inno-setup


    【解决方案1】:

    GetUninstallStringthe code 中使用了两次。

    1. IsUpgrade
    2. UnInstallOldVersion

    IsUpgrade 中只测试非空值。

    UnInstallOldVersion 中执行。

    所以让函数返回整个UninstallString 作为一个简单的字符串。

    IsUpgrade 就足够了。

    并且只对 UnInstallOldVersion 中的程序路径及其参数进行实际解析。


    你还应该:

    • 处理字符串中没有空格(无参数)的情况
    • 卸载程序的路径也可以包含空格(通常会包含空格,因为卸载程序往往位于Program Files)。

    【讨论】:

    • 非常感谢您的帮助。在这种情况下,Wise 使用了 8.3 名称,所以空间的事情很容易——但是是的。 :)
    猜你喜欢
    • 2011-07-12
    • 2023-03-14
    • 1970-01-01
    • 2023-02-01
    • 2020-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-16
    相关资源
    最近更新 更多