Стоп, стоп...
PROCEDURE (a: array of integer) - это не статический открытый массив, таких в Дельфе просто нет.
array of... - это как раз динамический массив, память под который выделяется SetLength. Фактически, указатель на массив.

Я могу написать:
VAR a, b: array of integer
SetLength(a, 256); SetLength(b, 512);
a := b - тут я присвою указатели, и a и b станут указывать на один массив.

Посему
PROCEDURE (a: array of integer)
PROCEDURE (a: pIntArray)
и
PROCEDURE (VAR a: array [0..n] of char)
на низком уровне абсолютно идентичны, в заголовках к внешним DLL в Дельфе с одинаковым успехом используют все три формы.