Ваша проблема, так сказать о двух концах:

1) В ББ ARRAY OF INTEGER - это ТЭГОВЫЙ массив, т.е. массив, перед которым идет тег его типа (статического или, если массив выделен динамически, временного описателя). Поэтому к нему, например, можно применять LEN(a) - возвращается размер этого массива. Такие массивы можно передавать только внутри одного ББ - даже между двумя DLL, написанными на ББ - уже нельзя, т.к. сборщики мусора-то у них разные.

Ваш модуль должен выглядеть так:

MODULE MyDll;
(* sample module to be linked into a dll *)

IMPORT SYSTEM; (* Читайте Особенности платформы (Platform-Specific-Issues *)

(* Говорим, что массив безтеговый. Размер передаем явно, т.к. без тега определить размер открытого массива невозможно *)
PROCEDURE ArrayIncrement*(VAR x: ARRAY [untagged] OF INTEGER; n: INTEGER);
VAR i: INTEGER;
BEGIN
FOR i := 0 TO n DO
INC(x[i])
END
END ArrayIncrement;

END MyDll.

С INTEGER нет проблем с выравниванием. А если бы передавали ARRAY OF BYTE, то надо было бы явно указать [noalign] или другое выравнивание и то же самое в Дельфе.

2) В Дельфе опять же, свои заморочки.
VAR array of - открытый массив. По-моему, размер открытых массивов в Дельфе передается скрытым параметром в стеке, т.е. получаем несовместимость по параметрам.

Посему можно использовать один из следующих вариантов:

PROCEDURE ArrayIncrement(x: array of integer; n: integer); stdcall; external 'MyDll.dll';

(array of integer в Дельфе - это динамический массив, "указатель на массив" - что нам и надо)

или

Type IntArray = array [0..High(Integer) div 4 -1] of Integer;
pIntArray = ^IntArray;

procedure ArrayIncrement (x: pIntArray; n: integer); stdcall; external 'MyDll.dll';

procedure Test;
VAR x: array [0..256] of integer;
begin
ArrayIncrement(@x, Length(x)) - только @ не забывать ставить...
end;


Я не на 100% уверен, т.к. Дельфу подзабыл изрядно - но попробуйте оба варианта, хотя бы один должен сработать.