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

Une erreur 998 lors d'un CreateProcess() [RESOLU] - Delphi/Pascal - Programmation

Marsh Posté le 16-12-2005 à 19:39:37    

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
Reply

Marsh Posté le 16-12-2005 à 19:39:37   

Reply

Marsh Posté le 16-12-2005 à 21:36:33    

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:

Reply

Marsh Posté le 17-12-2005 à 18:59:32    

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


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 17-12-2005 à 19:36:58    

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 ?  

Reply

Marsh Posté le 17-12-2005 à 20:17:53    

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


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 17-12-2005 à 20:29:25    

antp a écrit :

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


Et là, ça l'est mal ?

Reply

Marsh Posté le 17-12-2005 à 21:21:51    

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
Reply

Marsh Posté le 23-12-2005 à 11:31:35    

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. ;)

Reply

Marsh Posté le 23-12-2005 à 11:37:18    

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. ;)

Reply

Marsh Posté le 23-12-2005 à 11:47:32    

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;
 

Reply

Marsh Posté le 23-12-2005 à 11:47:32   

Reply

Marsh Posté le 23-12-2005 à 12:15:12    

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.

Reply

Marsh Posté le 24-12-2005 à 06:07:37    

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 !

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed