OpToSoapDomComv.TRefCache.FNodes содержит ссылки на несуществующие XMLNodes - PullRequest
2 голосов
/ 10 января 2011

В нашем приложении D2007 мы используем веб-сервис, доступ к которому осуществляется с помощью объекта THTTPRIO. Когда TDatamodule, содержащий объект THTTPRIO, уничтожен, возникает нарушение прав доступа.

Этот AV вызывается при освобождении TSoapDOMConvert, который в свою очередь выполняет:

TRefCache(RefMap[0].Instance).Free

вызывающий

destructor TRefCache.Destroy;
begin
  FHREFs.Free;
  FMHREFs.Free;
  FNodes := nil; //Causes AV
end;

FNodes - это TInterfaceList, содержащий одну ссылку на IXMLNodes, но объект, кажется, был освобожден до всего этого.

Кто-нибудь знает эту проблему? Как это решить?

[Редактировать] Подробнее об использовании объекта RIO Объект THTTPRIO используется только при следующем вызове веб-службы:

 LIResult.Assign((Rio as IWSLicenseIntf).CheckLicense(FLicenseInfo)); 

Объект LIResult позднее освобождается.

1 Ответ

2 голосов
/ 10 января 2011

THTTPRIO имеет две разные схемы управления временем жизни.Один как компонент и один как интерфейс.Смешивать их - плохая идея.Это может быть вашей проблемой.

Жан-Мари Бабе прокомментировал это здесь.http://www.delphigroups.info/2/11/344722.html

Исходный файл, сгенерированный из WSDL, должен иметь функцию GetIWSLicenseIntf (или аналогичную).Попробуйте использовать это вместо компонента Rio.Измените (Rio as IWSLicenseIntf) на GetIWSLicenseIntf() и добавьте параметры. При необходимости используйтеWSDL и URL.

Другой вариант будет выглядеть примерно так:

var
  WSLic: IWSLicenseIntf;
  RIO: THTTPRIO;
begin
  RIO := THTTPRIO.Create(nil);
  RIO.URL := 'www.whatever.com';
  WSLic := RIO as IWSLicenseIntf;
  LIResult.Assign((WSLic).CheckLicense(FLicenseInfo)); 
end;

Интерфейсы в Delphi считаются ссылками, поэтому вы не должны освобождатьWSLic и несвободная RIO.Он будет освобожден для вас, когда WSLic выйдет из области видимости.Код, конечно, не проверен, так как у меня нет вашего кода.

...