Delphi7 процедура SetLength()
От: Charly22  
Дата: 28.11.16 19:23
Оценка:
Здравствуйте!
Уже давно работаю над программой, которую начинал писать на 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() ? Спасибо.
delphi 7 setlength
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.