IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Delphi Discussion :

DCC64 - F2046 Out of memory


Sujet :

Delphi

  1. #1
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 452
    Points : 24 863
    Points
    24 863
    Par défaut DCC64 - F2046 Out of memory
    Le sujet
    Compilation de GSQLParser, obtenir les DCU pour les inclure aux autres projets et éviter ainsi presque une minute de compilation (on fonctionne déjà ainsi avec les DCU fournies par l'auteur, lui n'a fourni que les BAT DCC32)

    Mon Objectif
    Double-Clic sur un BAT et tout est fait automatiquement ... j'y suis presque

    L'erreur
    Code DCC64 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ...\GSQLParser64\src\gsp_vcl\parse\mssql\lzyaccmssqlsql.pas(291348) Conseil: H2443 La fonction inline 'TObjectList.Extract' n'a pas été étendue car l'unité 'System.Types' n'est pas spécifiée dans la liste USES
    ...\GSQLParser64\src\gsp_vcl\parse\mssql\lzyaccmssqlsql.pas(1653) Conseil: H2164 La variable 'lctmpj' est déclarée mais jamais utilisée dans 'TLzParserMssqlSql.yyparse'
    ...\GSQLParser64\src\gsp_vcl\parse\mssql\lzyaccmssqlsql.pas(292028) Fatale: F2046 Mémoire insuffisante

    F2046 Mémoire insuffisante (Delphi)
    - virtual memory à 8Go - Sans Effet, cela bloque vers 970Mo ( EDIT moins d'une seconde cela monte de 1300 à 2600Mo pour BDS mais DCC64 plante à 1800Mo)
    - MS Build ou dcc64 sont utilisé hors EDI donc "Utiliser MSBuild de façon externe pour compiler" n'est pas valable
    - "Construisez votre groupe de projets sur la ligne de commande." ... dommage c'est ça qui fonctionne pas
    - "Refactorez les applications et les bibliothèques" ... euh non, fichier généré par un LEX soit 292055 lignes pour 7888 Ko ... cela implique de modifier le projet LEX\YACC, on verra ça lorsque je serais obligé de gérer MS SQL 2021 (Version 16 même pas encore sortie) donc pas avant 2030

    Ne se produit QUE hors DELPHI
    Je l'ai eu une seule fois via l'IDE alors que c'est systématique en ligne de Commande

    Le coupable (plutôt, les coupables)
    Code BAT : Sélectionner tout - Visualiser dans une fenêtre à part
    "C:\Program Files (x86)\Embarcadero\Studio\17.0\bin\dcc64.exe" -B -Q -DRELEASE -$D0 -$L- -$Y-  -H -W -B -R"C:\Program Files (x86)\Embarcadero\Studio\17.0\lib\Win64\release" -NSSystem.Win;System;Winapi;Vcl; -E..\bin\ -NU..\dcu\RELEASE\ -K00400000 getDCU.dpr
    ou
    Code BAT : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CALL "C:\Program Files (x86)\Embarcadero\Studio\17.0\bin\rsvars.bat"
    msbuild.exe ...\GSQLParser64\src\gsp_vcl\ /t:Rebuild /p:Configuration=RELEASE

    qui me sort pareil
    Code msbuild : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    Microsoft (R) Build Engine, Version 3.5.30729.9135
    [Microsoft .NET Framework, Version 2.0.50727.9151]
    Copyright (C) Microsoft Corporation*2007. Tous droits réservés.
    
    Build started 09/03/2021 15:35:41.
    Project "...\GSQLParser64\src\make\getDCU.dproj" on node 0 (Rebuild target(s)).
      CodeGear Resource Compiler/Binder
      Version 1.2.2 Copyright (c) 2008-2012 Embarcadero Technologies Inc.
    
      Microsoft (R) Windows (R) Resource Compiler Version 6.0.5724.0
    
      Copyright (C) Microsoft Corporation.  All rights reserved.
    
    
      Suppression du fichier "getDCU.vrc".
    PreBuildEvent:
              1 fichier(s) copié(s).
    _PasCoreCompile:
      Embarcadero Delphi for Win64 compiler version 30.0
      Copyright (c) 1983,2015 Embarcadero Technologies, Inc.
    
      ... quelques 700 warnings
      ...\GSQLParser64\src\gsp_vcl\parse\mssql\lzyaccmssqlsql.pas(1653): Conseil warning H2164: La variable 'lctmpj' est déclarée mais jamais utilisée dans 'TLzParserMssqlSql.yyparse'
    
    "...\GSQLParser64\src\make\getDCU.dproj" (Rebuild target) (1) ->
    (_PasCoreCompile target) ->
      ...\GSQLParser64\src\gsp_vcl\parse\mssql\lzyaccmssqlsql.pas(292028): error F2046: Mémoire insuffisante
    
        733 Warning(s)
        1 Error(s)
    
    Time Elapsed 00:00:50.49

    ou encore un petit programme Delphi contenant un CreateProcess encapsulé (j'ai même du coup découvert un erreur de Zéro Terminal manquant PipeToRead + 1 pour le SetLength et ZeroMemory)
    J'ai même repris la ligne dcc64 s'affichant dans la sortie de Delphi lorsqu'il compile, erreur F2046 aussi

    Le mode Administrateur, pas mieux

    En dehors de cette veille QC [dcc64] Compiler fail with OutOfMemory qui plantait sur un fichier RDBOSQLParser qui est un fichier autogénéré surement aussi par un LEX d'un dictionnaire SQL pour aussi un autre SQLParser, alors le diviser en plus morceaux n'est pas un solution car le jour où il faudra le régénérer, pas trop envie de le splitter ça dans quelques années, le code est incompréhensible, c'est presque une seule fonction sur 99% du fichier contenant plein de sous-fonctions, de case et des longuuuuueees constantes tableaux.




    Voilà comme Delphi arrive à la lancer MSBuild et indirectement dcc64 pour ce projet sans que cela pose un problème mémoire ?
    Il lui passe quoi ?

    Ah la cerise sur le gâteau
    Code BAT : Sélectionner tout - Visualiser dans une fenêtre à part
    "C:\Program Files (x86)\Embarcadero\Studio\17.0\bin\dcc64.exe" -B -Q -DRELEASE -$D0 -$L- -$Y- -$O- -H -W -B -R"C:\Program Files (x86)\Embarcadero\Studio\17.0\lib\Win64\release" -NSSystem.Win;System;Winapi;Vcl; -E..\bin\ -NU..\dcu\RELEASE\ -K00400000 getDCU.dpr

    Ceci fonctionne, car en DEBUG avec les options associés cela fonctionne, et en fait, suffit de retirer les optimisations pour que cela compile aussi en RELEASE !
    C'est au moment d'optimiser la monstrueuse fonction de L'analyseur syntaxique soit yyparse() qu'il se vautre.

    Du coup, en laissant les optimisations pour DCC64 pour le projet mais en ajoutant juste {$O-} dans l'unité coupable, cela compile aussi, c'est le moins pire pour le moment.

    C'était clair ?
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  2. #2
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 430
    Points
    28 430
    Par défaut
    Hello,

    tu parles de ce produit ? si la compilation DCC64 -$O+ plante systématiquement ça serait bien de créer une entrée dans Quality Central...sur un projet OpenSource ce serait encore mieux mais bon
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  3. #3
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 452
    Points : 24 863
    Points
    24 863
    Par défaut
    Remarque

    BDS.exe monte durant la compilation à 2600 Mo de RAM donc je suppose qu'il a été compilé en {$SetPEFlags IMAGE_FILE_LARGE_ADDRESS_AWARE}
    DCC64.exe monte durant la compilation à 1800 Mo de RAM et plante, le plafond de 2Go du 32Bit (oui DCC64 compile du 64Bit mais est un programme 32Bit)

    J'ai testé "Utiliser MSBuild de façon externe pour compiler" depuis l'IDE, cela fait apparaître DCC64 comme sous-processus de BSD et là ça plante !

    Hum ... euh peut-on appeler BDS.exe pour compiler au lieu de lancer l'IDE ?
    EDIT oh comme ce "-b" me plait dans IDE Command Line Switches and Options
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 452
    Points : 24 863
    Points
    24 863
    Par défaut
    Oui, c'est ce produit, abandonné par son auteur pour la VCL donc on a acheté les sources pour prévoir l'avenir quand on passera à une autre version de Delphi, en espérant par devoir modifier du code

    Quality Central ... oui c'est fait, pour Seattle, c'est mort, si un jour, il corrige le bug, ça sera dans une version future, changer de version n'est pas anondin.
    Et puis c'est des tanches sur ce site, tu as toujours un "Needs feedback" alors que tu as fourni le code source Delphi corrigé
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  5. #5
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 452
    Points : 24 863
    Points
    24 863
    Par défaut
    Désolé pour le dérangement

    Code BAT : Sélectionner tout - Visualiser dans une fenêtre à part
    "C:\Program Files (x86)\Embarcadero\Studio\17.0\bin\bds.exe" getDCU.dproj -b

    C'est pas le mieux, cela ne se ferme pas automatiquement, cela ne sort pas les warnings dans un fichier comme il dit est par la documentation mais bon à défaut de merle, on mange des grives.

    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  6. #6
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 430
    Points
    28 430
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    Quality Central ... oui c'est fait, pour Seattle, c'est mort, si un jour, il corrige le bug, ça sera dans une version future, changer de version n'est pas anondin.
    Et puis c'est des tanches sur ce site, tu as toujours un "Needs feedback" alors que tu as fourni le code source Delphi corrigé
    le problème des bugs corrigés c'est quand tu ne proposes pas un test qui montre le bug...c'est le principe même des tests unitaires, avant de corriger un bug, tu le reproduits. Ensuite tu le corriges, et là tu constates que le test unitaire passe...et les précédents tests unitaires permettent de t'assurer que ta correction n'a pas produit une régression.

    c'est encore plus vrai si ta correction provoque justement une régression alors qu'on ne sait pas précisément le problème qu'elle corrige...j'ai déjà rencontré ce cas de figure...et ça fini sur un "needs feeback"
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  7. #7
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 452
    Points : 24 863
    Points
    24 863
    Par défaut
    Oui mais ils en abusent de ce "needs feeback", le dernier que j'avais sur ADO, le FmtBCD mappé en adCurrency au lieu adDecimal, tu leurs fourni un code d'appel, les traces du déboggueurs SQL Server, le SQL, ils attendent quoi ?
    il te réclame un "test project" ... vu que pour constater l'anomalie, il te faut des outils externes, le projet de test doit donc être paramètrable pour se connecter sur leur Serveur, il faut qu'il crée les tables, remplissent les données, ... j'ai pas que ça à faire de faire leur boulot d'étude, j'ai bricolé et j'ai résolu mon problème, mon travail est fait.

    Faut quoi ? que je leur installe une WM Ware sur Amazon avec Delphi et SQL Server installé dessus, un catalog et un schema prêt à l'emploi et juste un bouton "Cliquez ici !"
    Non, il ne font aucun effort et cela depuis toujours, j'ai du coup arrêté d'y mettre des trucs comme je le faisais avant comme en XE, XE2, XE3 où j'étais Beta Test.

    Avec ce systématique "test project" réclamé 6 mois après le dépôt de la demande, c'est certains que c'est un ticket mort, si on ne se connecte pas sur le site, on ne sait même pas qu'il y a une demande, du coup, un an plus tard, c'est bon, tu laisses tomber l'affaire car tu ne vas pas passer une journée à leur refaire un projet de test que tu as mis à la poubelle depuis un an !
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  8. #8
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 452
    Points : 24 863
    Points
    24 863
    Par défaut
    Depuis un BAT, ça effectue des COPY, DELETE, MKDIR ... et invoque BDSWrapper pour compiler et profiter de ses 3Go de mémoire
    Pour D10 Seatle cela le rend le plus discret que possible, juste son SplashScreen, on voit clignoter un instant l'editeur et cela laisse visible la progression de la compilation

    Code BAT : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    ...
    set DelphiRoot=C:\Program^ Files^ (x86)\Embarcadero\Studio\17.0
    set DelphiIDEBuilder="%DelphiRoot%\bin\bds.exe"
    ...
      %CD%\BDSWrapper\BDSWrapper.exe -bds:%DelphiIDEBuilder% -p:%CD%\getDCU.dproj
    ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    program BDSWrapper;
     
    uses
      System.SysUtils,
      Winapi.Windows;
     
    {$R *.res}
     
    type
      TBDSWrapper = class(TObject)
      private
        class var FBDSProcessId: DWORD;
        class var FAppBuilder: HWND;
        class var FProgressForm: HWND;
        class var FProgressFormCreated: Boolean;
        class var FCancelBkgCompDlg: HWND;
        class var FCancelBkgCompDlgClosed: Boolean;
     
        class procedure WaitEvent(var AbortProcess: Boolean);
      public
        class function Run(const CmdDirectory, CmdName, CmdParam, CmdWorkDir: string; out ExitCode: Int64; Delay: Cardinal = INFINITE): Boolean;
      end;
     
    class function TBDSWrapper.Run(const CmdDirectory, CmdName, CmdParam, CmdWorkDir: string; out ExitCode: Int64; Delay: Cardinal = INFINITE): Boolean;
    var
      StartupInfo: TStartupInfo;
      ProcessInfo: TProcessInformation;
      CommandLine: string; // utile pour le débogage, ne pas confondre CommandLine avec SysUtils.CmdLine
      SecurityAttr : TSecurityAttributes;
      Terminated: Boolean;
      AbortProcess: Boolean;
      HandleFunctionProcess: Cardinal;
    begin
      FBDSProcessId := 0;
      FAppBuilder := 0;
      FProgressForm := 0;
      FProgressFormCreated := False;
      FCancelBkgCompDlg := 0;
      FCancelBkgCompDlgClosed := False;
     
      try
        SecurityAttr.nLength := SizeOf(TSecurityAttributes);
        SecurityAttr.lpSecurityDescriptor := nil;
        SecurityAttr.bInheritHandle := True;
     
        ZeroMemory(@StartupInfo, SizeOf(StartupInfo)); // GetStartupInfo(StartupInfo);
        StartupInfo.cb := SizeOf(StartupInfo);
        ZeroMemory(@ProcessInfo, SizeOf(ProcessInfo));
     
        CommandLine := Format('"%s%s" %s', [IncludeTrailingPathDelimiter(CmdDirectory), CmdName, CmdParam]);
        Result := CreateProcess(nil, PChar(CommandLine), @SecurityAttr, @SecurityAttr, True, 0, nil, PChar(CmdWorkDir), StartupInfo, ProcessInfo);
        if Result then
        begin
          FBDSProcessId := ProcessInfo.dwProcessId;
     
          try
            Terminated := False;
            AbortProcess := False;
            while not Terminated do
            begin
              case WaitForSingleObject(ProcessInfo.hProcess, Delay) of
                WAIT_OBJECT_0 :
                  begin
                    WaitEvent(AbortProcess);
                    Terminated := True;
                  end;
                WAIT_ABANDONED : Terminated := True;
                WAIT_TIMEOUT :
                  begin
                    WaitEvent(AbortProcess);
                    Terminated := Delay = INFINITE;
                  end;
                WAIT_FAILED: Abort;
              else
                Terminated := True;
              end;
     
              if AbortProcess then
              begin
               HandleFunctionProcess := OpenProcess(PROCESS_TERMINATE, False, ProcessInfo.dwProcessId);
               if HandleFunctionProcess > 0 then
               begin
                 TerminateProcess(HandleFunctionProcess, 0);
                 CloseHandle(HandleFunctionProcess);
               end;
              end;
            end;
     
            ULARGE_INTEGER(ExitCode).HighPart := 0;
            if not GetExitCodeProcess(ProcessInfo.hProcess, ULARGE_INTEGER(ExitCode).LowPart) then
              ExitCode := -1;
          finally
            CloseHandle(ProcessInfo.hThread);
            CloseHandle(ProcessInfo.hProcess); // The handles for both the process and the main thread must be closed through calls to CloseHandle
     
            FBDSProcessId := 0;
          end;
        end;
      except
        on E: Exception do
        begin
          OutputDebugString(PChar(Format('%s.Run - Error %s, Message : %s', [Self.ClassName(), E.ClassName(), E.Message])));
          raise;
        end;
      end;
    end;
     
     
    class procedure TBDSWrapper.WaitEvent(var AbortProcess: Boolean);
     
      function EnumWindowsCallBackProc(hWnd: HWND; lParam: LPARAM): BOOL; stdcall;
      var
        dwProcessId: DWORD;
        WindowClassName: array[0..255] of Char;
      begin
        if GetWindowThreadProcessId(hWnd, @dwProcessId) <> 0 then
        begin
          if dwProcessId = FBDSProcessId then
          begin
            if GetClassName(hWnd, WindowClassName, SizeOf(WindowClassName)) > 0 then
            begin
              if SameText(WindowClassName, 'TProgressForm') then
              begin
                if FProgressForm = 0 then
                  FProgressFormCreated := True;
                FProgressForm := hWnd;
              end
              else if SameText(WindowClassName, 'TCancelBkgCompDlg') then
                FCancelBkgCompDlg := hWnd
              else if SameText(WindowClassName, 'TAppBuilder') then
                FAppBuilder := hWnd;
            end;
          end;
        end;
        // To continue enumeration, the callback function must return TRUE; to stop enumeration, it must return FALSE.
        Result := (FAppBuilder = 0) or (FProgressForm = 0) or ((FCancelBkgCompDlg = 0) and not FCancelBkgCompDlgClosed);
      end;
     
    begin
      FCancelBkgCompDlg := 0;
      FProgressForm := 0;
     
      EnumWindows(@EnumWindowsCallBackProc, 0);
     
      // Si la fenêtre de progession n'est plus là, c'est donc la Fin
      if FProgressForm = 0 then
        if FProgressFormCreated then
          AbortProcess := True;
     
      // Si la fenêtre d'annulation de la compilation est là, il faut la fermer
      if FCancelBkgCompDlg <> 0 then
      begin
        CloseWindow(FCancelBkgCompDlg);
        FCancelBkgCompDlg := 0;
        FCancelBkgCompDlgClosed := True;
      end;
     
      if FAppBuilder <> 0 then
        ShowWindow(FAppBuilder, SW_MINIMIZE);
    end;
     
    var
      BDSPath, ProjectName: string;
      BDSExitCode: Int64;
    begin
      if FindCmdLineSwitch('bds', BDSPath) and FindCmdLineSwitch('p', ProjectName) then
      begin
        // bds.exe -ns -b Project.dproj
        TBDSWrapper.Run(ExtractFileDir(BDSPath), ExtractFileName(BDSPath), '-b ' + ProjectName, ExtractFileDir(ProjectName), BDSExitCode, 100);
      end;
    end.
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XStream][String]out of memory
    Par Invité dans le forum Persistance des données
    Réponses: 8
    Dernier message: 10/01/2006, 14h52
  2. [C++] [gcc] out of memory
    Par fxp17 dans le forum GCC
    Réponses: 5
    Dernier message: 06/01/2006, 10h29
  3. [pb mémoire] out of memory d'eclipse
    Par Casp dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 12/05/2005, 16h39
  4. Out of memory
    Par shurato dans le forum ANT
    Réponses: 1
    Dernier message: 10/11/2004, 16h19
  5. [JBuilder 8] Out of memory problem ...
    Par keros dans le forum JBuilder
    Réponses: 2
    Dernier message: 08/09/2003, 19h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo