首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >调用手动创建的服务实例后检测到RemObjects泄漏

调用手动创建的服务实例后检测到RemObjects泄漏
EN

Stack Overflow用户
提问于 2018-02-28 17:17:23
回答 1查看 84关注 0票数 0

我有以下代码,用于创建RemObjects服务的实例并调用.net服务器

代码语言:javascript
复制
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服务的调用如下所示:

代码语言:javascript
复制
  try
        Result := BinaryArray.Create;
        LLabelPrintingManager := TLabelPrintingServiceProxy.GetInstance();
        Result.Add(LLabelPrintingManager.GetVSSLabelImage(APrintJob));
    finally 
        TLabelPrintingServiceProxy.ReleaseLabelPrintingServiceProxyInstance(LLabelPrintingManager);
    end;

在调用之后,RemObjects应该会自动释放LLabelPrintingManager接口,但它没有这样做,它会泄漏所使用的对象。

我尝试过在ReleaseLabelPrintingServiceProxyInstance (下面的代码)上手动释放服务实例中的所有对象,但它仍在泄漏

代码语言:javascript
复制
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;

我漏掉了什么吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-01 16:29:54

在与来自RemObjects的人讨论后,以下是解决方案:

代码语言:javascript
复制
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;

打电话

代码语言:javascript
复制
try
  LLabelPrintingRemoteService := TLabelPrintingServiceProxy.GetRemoteServiceInstance();
  (LLabelPrintingRemoteService as ILabelPrintingManager).PrintVSSJob(printJob);
finally
  TLabelPrintingServiceProxy.ReleaseLabelPrintingServiceProxyInstance(LLabelPrintingRemoteService);
end;

并释放对象

代码语言:javascript
复制
try
  LLabelPrintingRemoteService := TLabelPrintingServiceProxy.GetRemoteServiceInstance();
  (LLabelPrintingRemoteService as ILabelPrintingManager).PrintVSSJob(printJob);
finally
  TLabelPrintingServiceProxy.ReleaseLabelPrintingServiceProxyInstance(LLabelPrintingRemoteService);
end;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49025869

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档