RemObjects обнаруживает утечки после вызова вручную созданного экземпляра службы

У меня есть следующий код, который создает экземпляр службы RemObjects и делает вызов на.net-сервер

class function TLabelPrintingServiceProxy.GetInstance: ILabelPrintingManager;
var
  LRoRemoteService: TRoRemoteService;
begin
  LRoRemoteService := TRoRemoteService.Create(nil);
  LRoRemoteService.Message := TROSOAPMessage.Create();
  LRoRemoteService.Channel := TROIndyHTTPChannel.Create(nil);
  LRoRemoteService.Channel.TargetUri := TROUri.Create(ILabelPrintingIntf.LabelPrintingManager_EndPointURI);

  Result := (LRoRemoteService as ILabelPrintingManager);
end;

вызов в.net сервис выполняется так:

  try
        Result := BinaryArray.Create;
        LLabelPrintingManager := TLabelPrintingServiceProxy.GetInstance();
        Result.Add(LLabelPrintingManager.GetVSSLabelImage(APrintJob));
    finally 
        TLabelPrintingServiceProxy.ReleaseLabelPrintingServiceProxyInstance(LLabelPrintingManager);
    end;

После совершения вызова RemObjects должен автоматически освобождать интерфейс LLabelPrintingManager, но это не так и приводит к утечке используемых объектов.

Я попытался на ReleaseLabelPrintingServiceProxyInstance (код ниже), чтобы вручную освободить все объекты из экземпляра службы, но он все еще протекает

class procedure TLabelPrintingServiceProxy.ReleaseLabelPrintingServiceProxyInstance(aILabelPrintingManagerIntf: ILabelPrintingManager);
var
  lProxy: TRoProxy;
begin
  lProxy := TROProxy(aILabelPrintingManagerIntf);
  TROIndyHTTPChannel(lProxy.__TransportChannel).TargetUri.Free;
//  TROIndyHTTPChannel(lProxy.__TransportChannel).Free; this is generating an AV
  TRoMessage(lProxy.__Message).free;

  TRoRemoteService(aILabelPrintingManagerIntf).Free;

Я что-то упустил?

1 ответ

Решение

После обсуждения с ребятами из RemObjects, вот решение:

class function TLabelPrintingServiceProxy.GetRemoteServiceInstance: TRoRemoteService;
var
  LRoRemoteService: TRoRemoteService;
begin
  Result := TRoRemoteService.Create(nil);
  Result.Message := TROSOAPMessage.Create();
  Result.Channel := TROIndyHTTPChannel.Create(nil);
  Result.Channel.TargetUri := TROUri.Create(ILabelPrintingIntf.LabelPrintingManager_EndPointURI);
end;

вызов

try
  LLabelPrintingRemoteService := TLabelPrintingServiceProxy.GetRemoteServiceInstance();
  (LLabelPrintingRemoteService as ILabelPrintingManager).PrintVSSJob(printJob);
finally
  TLabelPrintingServiceProxy.ReleaseLabelPrintingServiceProxyInstance(LLabelPrintingRemoteService);
end;

и выпуская объекты

try
  LLabelPrintingRemoteService := TLabelPrintingServiceProxy.GetRemoteServiceInstance();
  (LLabelPrintingRemoteService as ILabelPrintingManager).PrintVSSJob(printJob);
finally
  TLabelPrintingServiceProxy.ReleaseLabelPrintingServiceProxyInstance(LLabelPrintingRemoteService);
end;
Другие вопросы по тегам