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
Re: Delphi7 процедура SetLength()
От: BlackEric http://black-eric.lj.ru
Дата: 29.11.16 10:15
Оценка:
Здравствуйте, Charly22, Вы писали:

1. Я не припомню особых проблем с SetLength в Д7.
2. Покажите ваш код работы с массивом полностью, как он объявлен и что вы с ним делаете.
https://github.com/BlackEric001
Re: Delphi7 процедура SetLength()
От: Mr.Delphist  
Дата: 29.11.16 14:13
Оценка: +3
Здравствуйте, Charly22, Вы писали:

C>Здравствуйте!

C>Уже давно работаю над программой, которую начинал писать на Delphi 7. Программа разрослась, и транслировать ее для новых IDE в настоящее время проблематично.
C>Недавно столкнулся с проблемой в процедуре SetLength(): при повторном вызове этой процедуры с целью установления нужного размера динамического массива программа выдает ошибку AV.
C>Мне сказали, что в Delphi7 процедура SetLength() работает не всегда корректно.

C>Я решил написать отдельную DLL в XE2. В ней только одна функция, изменяет размер входного массива. Вот код из DLL:


Менеджер памяти один и тот же? Если нет, то AV абсолютно законен (один менеджер не может освободить память, принадлежащую другому менеджеру).
Re: Delphi7 процедура SetLength()
От: Danchik Украина  
Дата: 30.11.16 11:38
Оценка:
Здравствуйте, Charly22, Вы писали:

[Skip]

C> Что же я не так делаю? Или можно как-то по-другому решить проблему с SetLength() ? Спасибо.


Как уже писали у вас получаются два менеджера кучи.
Что делать:
  1. Использвать ShareMem.pas во всех проектах которые будут использовать эту библиотеку и в самой библиотеке (поставить самым первым юнитом в файле проекта).
  2. Вместо DLL, использовать Run-time Packages.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.