Une erreur 998 lors d'un CreateProcess() [RESOLU] - Delphi/Pascal - Programmation
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(). |
Marsh Posté le 17-12-2005 à 18:59:32
Startupinfo et ProcessInfo sont déclarés/initialisés comment ?
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 ?
Marsh Posté le 17-12-2005 à 20:17:53
Si c'est pas initialisé ça peut foirer
Marsh Posté le 17-12-2005 à 20:29:25
ReplyMarsh 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...
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.
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.
Marsh Posté le 23-12-2005 à 11:47:32
cyberstorm a écrit : |
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;
Marsh Posté le 23-12-2005 à 12:15:12
cyberstorm a écrit : Essaye ceci... |
Merci pr tes deux post
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 N'empêche : je revois mon code sitôt que possible.
Marsh Posté le 24-12-2005 à 06:07:37
cyberstorm a écrit : Essaye ceci... |
Résolu Win32Check m'a bien aidé Faute d'orthographe ds un répertoire !
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 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
Message édité par HERIBERT le 24-12-2005 à 06:08:09