Как узнать длину динамического массива в Inno Setup? - PullRequest
1 голос
/ 11 марта 2019

Вот мой код:

[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
UninstallDisplayIcon={app}\MyProg.exe
OutputDir=userdocs:Inno Setup Examples Output

[Code]
const
  CLSID_SetupConfiguration = '{177F0C4A-1CD3-4DE7-A32C-71DBBB9FA36D}';

type
  ISetupPackageReference = interface(IUnknown)
    '{DA8D8A16-B2B6-4487-A2F1-594CCCCD6BF5}'
    function GetId(out result: WideString): HResult;
  end;

  packageReference = array of ISetupPackageReference;

  ISetupInstance = interface(IUnknown)
    '{B41463C3-8866-43B5-BC33-2B0676F7F42E}'
    function GetInstanceId(out id: WideString): HResult;
    procedure Dummy2;
    function GetInstallationName(out installationName: WideString): HResult;
    function GetInstallationPath(out installationName: WideString): HResult;
    function GetInstallationVersion(out installationVersion: WideString): HResult;
    function GetDisplayName(lcid: Integer; out displayName: WideString): HResult;
    function GetDescription(lcid: Integer; out description: WideString): HResult;
    function ResolvePath(pwszRelativePath: WideString; out result: WideString): HResult;
  end;

  ISetupInstance2 = interface(IUnknown)
    '{89143C9A-05AF-49B0-B717-72E218A2185C}'
    function GetInstanceId(out id: WideString): HResult;
    procedure Dummy2;
    function GetInstallationName(out installationName: WideString): HResult;
    function GetInstallationPath(out installationName: WideString): HResult;
    function GetInstallationVersion(out installationVersion: WideString): HResult;
    function GetDisplayName(lcid: Integer; out displayName: WideString): HResult;
    function GetDescription(lcid: Integer; out description: WideString): HResult;
    function ResolvePath(pwszRelativePath: WideString; out result: WideString): HResult;
    procedure Dummy3;
    function GetPackages(out pack: packageReference): HResult;
  end;

  arrISetupInstance2 = array[1..1] of ISetupInstance2;

  IEnumSetupInstances = interface(IUnknown)
    '{6380BCFF-41D3-4B2E-8B2E-BF8A6810C848}'
    function Next(celt: Integer; var rgelt: arrISetupInstance2; out pceltFetched: Integer): HResult;
    function Skip(celt: Integer): HResult;
    function Reset: HResult;
    function Clone(out pEnumSetupInstances: IEnumSetupInstances): HResult;
  end;

  ISetupConfiguration = interface(IUnknown)
    '{42843719-DB4C-46C2-8E7C-64F1816EFD5B}'
    function EnumInstances(out pEnumSetupInstances: IEnumSetupInstances): HResult;
  end;

  ISetupConfiguration2 = interface(IUnknown)
    '{26AAB78C-4A60-49D6-AF3B-3C35BC93365D}'
    function EnumInstances(out pEnumSetupInstances: IEnumSetupInstances): HResult;
    function EnumAllInstances(out pEnumSetupInstances: IEnumSetupInstances): HResult;
  end;

procedure TestProcedure;
var
  obj: IUnknown;
  setupConfiguration: ISetupConfiguration2;
  setupInstances: IEnumSetupInstances;
  instances: arrISetupInstance2;
  instance: ISetupInstance2;
  fetched: Integer;
  instanceVersion: WideString;
  MyPackages: packageReference;
  lengthOfArray : longint;
  OneInstance: ISetupPackageReference;
  MyString: WideString;

begin
  obj := CreateComObject(StringToGUID(CLSID_SetupConfiguration));
  setupConfiguration := ISetupConfiguration2(obj);
  setupConfiguration.EnumInstances(setupInstances);
  fetched := 0;
  setupInstances.Next(1, instances, fetched);
  instance := instances[1];
  instance.GetInstallationVersion(instanceVersion);
  instance.GetPackages(MyPackages);
  lengthOfArray := Length(MyPackages);  // Why do I get negative value(-177484340)?
  OneInstance := MyPackages[5];         // If try to get access to first five elements of packageReference
                                        // you get either null pointer exception or access violation.
  OneInstance.GetId(MyString);
end;

function InitializeSetup(): Boolean;
begin
    TestProcedure;
end;

После вызова метода GetPackages (), определенного в ISetupInstance2, я получил заполненный массив packageReference.Но чтобы перечислить его, мне нужно знать его длину.Вот проблема: такие функции, как «GetArrayLength» и «Length» у меня не работают - они загадочным образом возвращают отрицательное значение.Я был бы очень признателен, если бы кто-нибудь мог дать мне подсказку, чтобы решить эту проблему.

Кроме того, я заметил странное поведение - если я пытаюсь получить доступ к первым пяти элементам packageReference, я получаю либо исключение нулевого указателяили нарушение доступа.Если я использую индекс выше 5, все работает просто отлично.

...