【杂谈接口】-Delphi中使用接口的一些注意事项

原则一:

   如果一个接口需要as成其他接口使用, 如果该接口的实例在该过程中可能会被释放,那么最好将 as 的接口用临时变量保存起来, 然后在使用完后及时将临时接口:= nil;

   如果用as成其他接口直接使用时(如  (lvIntf as IOpera).DoSomething() )系统会自动生成临时变量,存放对应的接口,然后在过程退出时,进行接口变量清理时,会触发接口实例的_release方法。如果对应实例的内存块被破坏,就有可能会导致访问违规的异常。

// 下面这段执行时可能会出现AV异常
var
  lvPlugin: IPlugin;
  lvStoProcessor   : IStoProcessor;
begin
  //物料库存_逻辑处理
  lvPlugin := FPluginConsole.CreatePlugin('STOLogic');
  try
    lvPlugin.PrepareForCreate;
    
    with lvPlugin as IStoProcessor do
    begin
      //处理结存
      DoOnHand(pvFormKey, OPERA_UNAPPR);
      CheckNegative(pvFormKey);
    end;
  finally
    lvPlugin.FreePlugin;
    lvPlugin := nil;
  end;

  // 执行库存处理后的其他脚本
  ExecuteAfterScript(pvFormKey, FJsnConfig.O['STO']);

end;



// 这样做是最安全的
var
  lvPlugin: IPlugin;
  lvStoProcessor   : IStoProcessor;
begin
  //物料库存_逻辑处理
  lvPlugin := FPluginConsole.CreatePlugin('STOLogic');
  try
    lvPlugin.PrepareForCreate;
    
    lvStoProcessor := lvPlugin as IStoProcessor;
    //处理结存
    lvStoProcessor.DoOnHand(pvFormKey, OPERA_UNAPPR);
    lvStoProcessor.CheckNegative(pvFormKey);

    lvStoProcessor := nil;
  finally
    lvPlugin.FreePlugin;
    lvPlugin := nil;
  end;

  // 执行库存处理后的其他脚本
  ExecuteAfterScript(pvFormKey, FJsnConfig.O['STO']);
end;

 

 

…. 未完待续

 

 

 

 

 

==========================================

DIOCP官方社区|MyBean官方社区

http://diocp.wedelphi.com/

==========================================

发表评论

电子邮件地址不会被公开。