相当无语的一个bug。又是关于DLL中接口的释放

procedure TFormMain.btn1Click(Sender: TObject);
begin
  //加载dll
  TReportConsoleLibWrapper.checkInitialize;
  try
    //创建一个接口,由DLL创建
    with TReportConsoleLibWrapper.createReportConsole(createDefaultOperator) do
    try
      //调用接口方法,显示窗体
      ShowConsole;
    finally
      //调用接口方法,释放窗体
      FreeConsole;
    end;
  finally
    //释放dll
    TReportConsoleLibWrapper.checkFinalization;
  end;
end;

以上代码点击按钮运行完后出错

 

 

稍微修改一下

procedure TFormMain.btn1Click(Sender: TObject);
begin
  //加载dll
  TReportConsoleLibWrapper.checkInitialize;
  try
    //创建一个接口,由DLL创建
    lvReportConsole:=TReportConsoleLibWrapper.createReportConsole(createDefaultOperator);
    with lvReportConsole do
    try
      //调用接口方法,显示窗体
      ShowConsole;
    finally
      //调用接口方法,释放窗体
      FreeConsole;
    end;

    //设置nil,会调用接口对象的.relase方法 必须在释放dll之前释放
    //否则函数执行完成后释放领的接口对象时会出现异常.因为整个dll都释放了
    lvReportConsole := nil;
  finally
    //释放dll
    TReportConsoleLibWrapper.checkFinalization;
  end;
end;

仔细下来想想确实还是自己的问题。明明知道,还犯下了这样的错误,还我调了4个小时。头都晕了

 

posted @ 2013-05-02 20:35  D10.天地弦  阅读(519)  评论(0编辑  收藏  举报