Управление памятью пакета - PullRequest
0 голосов
/ 22 февраля 2010

Поскольку у меня было много трудностей при использовании DLL, я решил попробовать пакеты времени выполнения (в основном, чтобы избежать проблем с менеджером памяти и проблемами реестра типов).

Из своего приложения я делаю что-то вроде этого:

HandleList := TList <THandle>.Create;
try
  PackageObj.DoSomething (HandleList);
finally
  FreeAndNil (HandleList);
end;

Метод (внутри пакета среды выполнения) просто добавляет что-то в список:

procedure TPackageObject.DoSomething (HandleList: TList <THandle>);
begin
  HandleList.Clear;
  HandleList.Add (0);
end;

Я получаю исключение Invalid Pointer либо при вызове Clear в пакете, либо при вызове FreeAndNil в приложении. Время от времени также случаются нарушения доступа.

При использовании FastMM иногда появляется сообщение «Заголовок блока поврежден».

Ошибка всегда возникает, когда память выделяется или освобождается, то есть добавление чего-либо в список и, следовательно, динамическое увеличение списка.

Способ передачи объекта HandleList в пакет и обратно в порядке? Что-нибудь важное знать о пакетах и ​​управлении памятью? Или ошибка должна быть где-то еще?

РЕДАКТИРОВАТЬ В случае, если ошибка может быть где-то еще, как я должен отладить что-то вроде этого? Есть опыт?

1 Ответ

3 голосов
/ 22 февраля 2010

Полагаю, вы компилируете один и тот же код в разных пакетах, возможно, в исполняемом файле приложения. Независимо от того, связываете ли вы свои пакеты времени выполнения статически (перечислите их в опциях проекта) или динамически (используя LoadPackage), каждый модуль должен быть связан только в одном модуле, в противном случае вы получите дублирующиеся конфликты кода. Проверьте зависимости пакетов (пункты requires), список пакетов времени выполнения в основных настройках проекта, посмотрите предупреждения компилятора о неявно включенных модулях.

...