大家好!
   现有一个主程序Client.exe ,调用了很多dll文件。
   如何在关闭这个主程序之前,释放掉所有被掉用的dll文件。因为不释放掉这些被打开的DLL文件,关闭主程序时会报错!谢谢!

解决方案 »

  1.   

    用一个TStringList来保存调用的DLL,然后通过TStringList释放。
      

  2.   

    程序关闭时,在确保该作的事情作完的情况下,直接给一句ExitProcess(0);来退出进程,其他的工作Windows会处理,要确保该作的工作已经作了,因为这句只后,将不会执行后面的代码了(单元退出节点的代码也不会执行了)
      

  3.   

    这些DLL是静态加载还是动态加载的,动态加载的话随用随卸,不然还不如静态加载
      

  4.   

    进程退出的时候会自己卸载DLL的,关键很有可能是你的DLL中有对象或者内存分配或者某些资源没有释放,导致进程退出的时候DLL卸载会报错.
      

  5.   

    如何判断主程序是否已经调用某个DLL呢。假如现在有主程序Client.exe。如何看出它调用了那些Dll。如INV.DLL或COP.DLL......
      

  6.   

    procedure TfrmMain.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    var
      i:integer;
      cHandle: THandle;
      sFrom:String;
      QryTmp:TADOQuery;
      loFormClass:TPersistentClass;  
    begin
      inherited;
      try
        QryTmp:=TADOQuery.Create(nil);
        QryTmp.Connection:=cdm.adoCn;
        QryTmp.Close;
        QryTmp.SQL.Clear;
        QryTmp.SQL.Add(' SELECT DISTINCT SAE01 '+
                       ' FROM (SELECT SAE01 '+
                       '       FROM SYSAA '+
                       '       INNER JOIN SYSAF ON SYSAA.SAA01=SYSAF.SAF01 '+
                       '       INNER JOIN SYSAE ON SYSAF.SAF02=SYSAE.SAE02 '+
                       '       WHERE SAA01='+VarToSql(Trim(pUserCode))+' and SAE03=1 '+
                       '       UNION ALL '+
                       '       SELECT SAG03 AS SAE01 '+
                       '       FROM SYSAA '+
                       '       INNER JOIN SYSAG ON SYSAA.SAA01=SYSAG.SAG01 '+
                       '       WHERE SAA01='+VarToSql(Trim(pUserCode))+' and SAG04=1 ) AS AA '+
                       ' INNER JOIN SYSAC ON  SYSAC.SAC01=AA.SAE01 '+
                       ' WHERE SAC07 NOT IN (''S'') ');
        QryTmp.Open;
        if QryTmp.RecordCount >0 Then
        begin
          QryTmp.First;
          While not QryTmp.Eof do
          begin
            sFrom:='Tfrm'+Trim(QryTmp.FieldByName('SAE01').AsString);
            cHandle:=FindWindow(pChar(sFrom),nil);
            if cHandle>0 Then
            begin
              Application.MessageBox('请关闭所有窗体!','信息窗口',MB_IconInformation+MB_OK);
              Abort;
            end;
            QryTmp.Next;
          end;
        end;
      finally
        QryTmp.Close;
        QryTmp.Free;
      end;
      
      if not iscSocketClose then
         if application.Messagebox('是否真的要退出本系统?','提示信息',Mb_YesNo+Mb_IconQuestion)=IDNO then
            begin
              canClose:=False;
              Exit;
            end;
      for i:=0 to MainPageC.PageCount-1 do
         begin
           pFormHandle := 0;
           if MainPageC.ActivePage.Hint<>'' then
              pFormHandle:=Strtoint(MainPageC.ActivePage.Hint);
           SendDataToDll(pFormHandle,'Close');
         end;
      if Assigned(Cdm) then
         begin
           if cSocket.Socket.Connected then
              cSocket.Socket.Sendtext('Disconnect'+pClientName);
           cSocket.Close;
           Cdm.adoCn.Close;
           Cdm.Free;
         end;
      Application.Terminate;
    end;