Здравствуйте!
Уже давно работаю над программой, которую начинал писать на Delphi 7. Программа разрослась, и транслировать ее для новых IDE в настоящее время проблематично.
Недавно столкнулся с проблемой в процедуре SetLength(): при повторном вызове этой процедуры с целью установления нужного размера динамического массива программа выдает ошибку AV.
Мне сказали, что в Delphi7 процедура SetLength() работает не всегда корректно.
Я решил написать отдельную DLL в XE2. В ней только одна функция, изменяет размер входного массива. Вот код из DLL:
library vgsiutils;
uses
System.SysUtils, System.Classes;
type
TGistoCell = record
X: double;
Y: double;
end;
TDistGistoArray = array of TGistoCell;
function SetLen(var DGA: TDistGistoArray; Len: integer): Boolean; stdcall;
begin
Result := True;
try
SetLength(DGA, Len);
except
Result := False;
end;
end;
exports
SetLen;
begin
end.
А вот кусок кода из основной программы, вызывающий из DLL функцию SetLen:
TSetLenProc = function(var DGA: TDistGistoArray; Len: integer): Boolean; stdcall;
H: Cardinal;
SetLenFunc: TSetLenProc;
SetLenRes: Boolean;
{Load library}
H := LoadLibrary('vgsiutils.dll');
{Получение адреса ф-ции SetLen}
@SetLenFunc := GetProcAddress(H, 'SetLen');
{Вызов ф-ции и получение ее результата}
SetLenRes := SetLenFunc(DistGistoArray, 2);
{Выгружаем библиотеку}
FreeLibrary(H);
// Ставлю здесь Break point при отладке. Навожу курсор на DistGistoArray,
// но не вижу того, чтобы размер вновь созданного массива стал равным 2 элементам.
Что же я не так делаю? Или можно как-то по-другому решить проблему с SetLength() ? Спасибо.