2017-06-20 34 views
0

这里的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 ...字符串数组可以与上述固定装置内的参数作为阵列似乎适合更好一点通过,尽管返回类型。

回答

1

GetUninstallStringthe code使用两次。

  1. IsUpgrade
  2. UnInstallOldVersion

IsUpgrade它只是测试非空值。

UnInstallOldVersion它被执行。

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

对于IsUpgrade就足够了。

,做实际的解析,以程序路径和其仅在UnInstallOldVersion参数。


而且你应该:

  • 处理的情况下有字符串中没有空间(无参数)
  • 的卸载程序路径可以包含空格太(它通常作为卸载程序往往在Program Files)。
+0

非常感谢您的帮助。在这种情况下,Wise使用了8.3个名字,因此空间很容易 - 但是。 :) –