Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2435 connectés 

  FORUM HardWare.fr
  Programmation
  Delphi/Pascal

  [RESOLU] Une erreur 998 lors d'un CreateProcess()

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[RESOLU] Une erreur 998 lors d'un CreateProcess()

n°1268722
HERIBERT
Posté le 16-12-2005 à 19:39:37  profilanswer
 

Cette erreur : Error code 998: ERROR_NOACCESS - Invalid access to memory location. Son numéro m'est retourné par GetLastError, juste après un appel à CreateProcess().  
 
Le code est en Pascal. J'ai suivi le conseil d'Antp au sujet de CreateProcess avec passage de paramètre au processus fils : tout mettre ds la même ligne de commande, le nom du prog à appeler, et son paramètre séparés par un espace.  
 
Appel : string  // contenant le prog appelé et le paramètre qui lui est passé
Retour : boolean
Rep : string // le répertoire où le prog est situé. J'ai choisi ça disons... par défaut
 
  Retour := CreateProcess(nil,
                         PChar(Appel),
      nil,
                         nil,
                         false,
                         normal_priority_class,
                         nil,
                         PChar(Rep), Startupinfo,ProcessInfo);
 
Retour = false. Donc erreur. Et pas n'importe laquelle :o 998. Une recherche Google m'a appris (en anglais suffisamment déchiffré pr me miner le moral) que c'est une des pires que l'on puisse rencontrer.  
 
Effectivement, comment savoir où est l'erreur !? :??:
 
Help :hello:

Message cité 1 fois
Message édité par HERIBERT le 24-12-2005 à 06:08:09
mood
Publicité
Posté le 16-12-2005 à 19:39:37  profilanswer
 

n°1268781
HERIBERT
Posté le 16-12-2005 à 21:36:33  profilanswer
 

HERIBERT a écrit :

Cette erreur : Error code 998: ERROR_NOACCESS - Invalid access to memory location. Son numéro m'est retourné par GetLastError, juste après un appel à CreateProcess().  
 
Le code est en Pascal. J'ai suivi le conseil d'Antp au sujet de CreateProcess avec passage de paramètre au processus fils : tout mettre ds la même ligne de commande, le nom du prog à appeler, et son paramètre séparés par un espace.  
 
Appel : string  // contenant le prog appelé et le paramètre qui lui est passé
Retour : boolean
Rep : string // le répertoire où le prog est situé. J'ai choisi ça disons... par défaut
 
  Retour := CreateProcess(nil,
                         PChar(Appel),
      nil,
                         nil,
                         false,
                         normal_priority_class,
                         nil,
                         PChar(Rep), Startupinfo,ProcessInfo);
 
Retour = false. Donc erreur. Et pas n'importe laquelle :o 998. Une recherche Google m'a appris (en anglais suffisamment déchiffré pr me miner le moral) que c'est une des pires que l'on puisse rencontrer.  
 
Effectivement, comment savoir où est l'erreur !? :??:
 
Help :hello:


 
:bounce:

n°1269057
antp
Super Administrateur
Champion des excuses bidons
Posté le 17-12-2005 à 18:59:32  profilanswer
 

Startupinfo et ProcessInfo sont déclarés/initialisés comment ?


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
n°1269085
HERIBERT
Posté le 17-12-2005 à 19:36:58  profilanswer
 

antp a écrit :

Startupinfo et ProcessInfo sont déclarés/initialisés comment ?



var
  StartupInfo: TStartupinfo;
  ProcessInfo: TProcessInformation;
 
begin
   (...)
     FillChar(Startupinfo,Sizeof(TStartupinfo),0);  
     Startupinfo.cb:=Sizeof(TStartupInfo);

     
Lorsque je supprime un test sur une var booléeenne, pas de plantage -même si l'appel échoue. Je vais tripatouiller mon if ... else;
 
En quoi exactement FillChar et Startupinfo.cb peuvcent-ils affecter lappel de l'API ?  

n°1269128
antp
Super Administrateur
Champion des excuses bidons
Posté le 17-12-2005 à 20:17:53  profilanswer
 

Si c'est pas initialisé ça peut foirer :D


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
n°1269151
HERIBERT
Posté le 17-12-2005 à 20:29:25  profilanswer
 

antp a écrit :

Si c'est pas initialisé ça peut foirer :D


Et là, ça l'est mal ?

n°1269213
antp
Super Administrateur
Champion des excuses bidons
Posté le 17-12-2005 à 21:21:51  profilanswer
 

Non, et il me semble que l'autre structure c'est Windows qui la remplit. À moins qu'il faille aussi l'initialiser ? Faut voir dans la doc...


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
n°1272349
cyberstorm
Posté le 23-12-2005 à 11:31:35  profilanswer
 

Essaye ceci...
 
procedure ExecuteProcess(const Title, CmdLine: string);
var
   StartupInfos : TStartupInfo;
   ProcessInfos : TProcessInformation;
   ExitCode       : DWord;
begin
    GetStartupInfo(StartupInfos);
    StartupInfos.lpTitle := PChar(Title);
    Win32Check(CreateProcess(nil, PChar(CmdLine), nil, nil, TRUE, NORMAL_PRIORITY_CLASS, nil, nil,  StartupInfos, ProcessInfos));
end;
 
Sinon, il y a toujours l'option du "ShellExecute" qui n'est pas mal non plus et plus simple à utiliser. ;)

n°1272356
cyberstorm
Posté le 23-12-2005 à 11:37:18  profilanswer
 

Essaye ceci...
 
function ExecuteProcess(const Title, CmdLine: string) : DWord;
var
   StartupInfos : TStartupInfo;
   ProcessInfos : TProcessInformation;
begin
    GetStartupInfo(StartupInfos);
    StartupInfos.lpTitle := PChar(Title);
    Win32Check(CreateProcess(nil, PChar(CmdLine), nil, nil, TRUE, NORMAL_PRIORITY_CLASS, nil, nil,  StartupInfos, ProcessInfos));
   WaitForInputIdle(ProcessInfos.hProcess, 3000);
   Win32Check(GetExitCodeProcess(ProcessInfos.hProcess, Result));
end;
 
Sinon, il y a toujours l'option du "ShellExecute" qui n'est pas mal non plus et plus simple à utiliser. ;)

n°1272366
cyberstorm
Posté le 23-12-2005 à 11:47:32  profilanswer
 

cyberstorm a écrit :


function ExecuteProcess(const Title, CmdLine: string) : DWord;
var
   StartupInfos : TStartupInfo;
   ProcessInfos : TProcessInformation;
begin
    GetStartupInfo(StartupInfos);
    StartupInfos.lpTitle := PChar(Title);
    Win32Check(CreateProcess(nil, PChar(CmdLine), nil, nil, TRUE, NORMAL_PRIORITY_CLASS, nil, nil,  StartupInfos, ProcessInfos));
   WaitForInputIdle(ProcessInfos.hProcess, 3000);
   Win32Check(GetExitCodeProcess(ProcessInfos.hProcess, Result));
end;


 
Cette fonction est un extrait d'une fonction que j'ai implémenté il y a quelques temps et qui me permettait de lancer un processus et d'attendre que celui ci se termine pour obtenir son code d'erreur en fin de traitement. En fait, ce traitement est asynchrone, ce qui signifie qu'il faut attendre que le processus ai réellement terminée afin de récupérer son code de sortie. Tu pourras faire ceci, au moyen par exemple, d'une boucle:
 
   repeat
      Win32Check(GetExitCodeProcess(ProcessInfos.hProcess, Result));
      Application.ProcessMessages;
   until Result <> STILL_ACTIVE;
 

mood
Publicité
Posté le 23-12-2005 à 11:47:32  profilanswer
 

n°1272394
HERIBERT
Posté le 23-12-2005 à 12:15:12  profilanswer
 

cyberstorm a écrit :

Essaye ceci...
 
procedure ExecuteProcess(const Title, CmdLine: string);
var
   StartupInfos : TStartupInfo;
   ProcessInfos : TProcessInformation;
   ExitCode       : DWord;
begin
    GetStartupInfo(StartupInfos);
    StartupInfos.lpTitle := PChar(Title);
    Win32Check(CreateProcess(nil, PChar(CmdLine), nil, nil, TRUE, NORMAL_PRIORITY_CLASS, nil, nil,  StartupInfos, ProcessInfos));
end;
 
Sinon, il y a toujours l'option du "ShellExecute" qui n'est pas mal non plus et plus simple à utiliser. ;)


 
Merci pr tes deux post :hello:
Je vais m'en servir ;) Mais je pense que je me suis emmêlé les pinceaux sur une vulgaire itération testant la valeur vraie ou fausse d'une variable booléenne : rapport avec la choucroute ? Absolument inconnu :sacristic: N'empêche : je revois mon code sitôt que possible.

n°1272806
HERIBERT
Posté le 24-12-2005 à 06:07:37  profilanswer
 

cyberstorm a écrit :

Essaye ceci...
 
procedure ExecuteProcess(const Title, CmdLine: string);
var
   StartupInfos : TStartupInfo;
   ProcessInfos : TProcessInformation;
   ExitCode       : DWord;
begin
    GetStartupInfo(StartupInfos);
    StartupInfos.lpTitle := PChar(Title);
    Win32Check(CreateProcess(nil, PChar(CmdLine), nil, nil, TRUE, NORMAL_PRIORITY_CLASS, nil, nil,  StartupInfos, ProcessInfos));
end;
 
Sinon, il y a toujours l'option du "ShellExecute" qui n'est pas mal non plus et plus simple à utiliser. ;)


Résolu :hot: Win32Check m'a bien aidé :jap: Faute d'orthographe ds un répertoire !


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Delphi/Pascal

  [RESOLU] Une erreur 998 lors d'un CreateProcess()

 

Sujets relatifs
Message d'erreur[batch] [résolu] je n'arrive pas a faire une temporisation
"erreur de segmentation" avec les threads sous linux en C++Algo - Défilement de texte "doux" [Résolu]
[RESOLU] Problème avec un IF imbriqué dans une boucle FORErreur suspecte
[RESOLU][SED] Modifier une chaine avec un caractère mystèrepb résolu
[RESOLU][SH] Compter le nombre d'occurences d'un caractère....[résolu] avoir le dossier local dans lequel on est ?
Plus de sujets relatifs à : [RESOLU] Une erreur 998 lors d'un CreateProcess()


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR