J'ai une DLL qui est chargée dans un processus parent tiers en tant qu'extension. À partir de cette DLL, j'instancie des processus externes (les miens) en utilisant l'API CreateProcess. Cela fonctionne très bien dans 99,999% des cas, mais parfois cela échoue soudainement et arrête de fonctionner de manière permanente (peut-être un redémarrage du processus parent résoudrait cela mais ce n'est pas souhaitable et je ne veux pas le recommander avant de résoudre le problème). l'échec est symptomized par un processus externe non invoqué plus, même si CreteProcess() ne signale pas une erreur et par GetExitCodeProcess() retour 128. Voici la version simplifiée de ce que je fais:GetExitCodeProcess() renvoie 128
STARTUPINFO si;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = SW_HIDE;
PROCESS_INFORMATION pi;
ZeroMemory(&pi, sizeof(pi));
if(!CreateProcess(
NULL, // No module name (use command line).
"<my command line>",
NULL, // Process handle not inheritable.
NULL, // Thread handle not inheritable.
FALSE, // Set handle inheritance to FALSE.
CREATE_SUSPENDED, // Create suspended.
NULL, // Use parent's environment block.
NULL, // Use parent's starting directory.
&si, // Pointer to STARTUPINFO structure.
&pi)) // Pointer to PROCESS_INFORMATION structure.
{
// Handle error.
}
else
{
// Do something.
// Resume the external process thread.
DWORD resumeThreadResult = ResumeThread(pi.hThread);
// ResumeThread() returns 1 which is OK
// (it means that the thread was suspended but then restarted)
// Wait for the external process to finish.
DWORD waitForSingelObjectResult = WaitForSingleObject(pi.hProcess, INFINITE);
// WaitForSingleObject() returns 0 which is OK.
// Get the exit code of the external process.
DWORD exitCode;
if(!GetExitCodeProcess(pi.hProcess, &exitCode))
{
// Handle error.
}
else
{
// There is no error but exitCode is 128, a value that
// doesn't exist in the external process (and even if it
// existed it doesn't matter as it isn't being invoked any more)
// Error code 128 is ERROR_WAIT_NO_CHILDREN which would make some
// sense *if* GetExitCodeProcess() returned FALSE and then I were to
// get ERROR_WAIT_NO_CHILDREN with GetLastError()
}
// PROCESS_INFORMATION handles for process and thread are closed.
}
processus externe peut être appelé manuellement à partir de l'Explorateur Windows ou de la ligne de commande et il démarre très bien tout seul. Appelé comme ça, avant de faire un vrai travail, crée un fichier journal et consigne des informations à son sujet. Mais invoqué comme décrit ci-dessus cette information de journalisation n'apparaît pas du tout donc je suppose que le thread principal du processus externe n'entre jamais dans main() (Je teste cette supposition maintenant.)
Il y a au moins une chose que je pourrais faire pour essayer de contourner le problème (pas démarrer le fil suspendu) mais je voudrais d'abord comprendre la racine de l'échec en premier. Est-ce que quelqu'un a une idée de ce qui pourrait causer cela et comment le réparer?
Oublié de recommander l'édition: J'ai clarifié pourquoi je suppose que le processus externe ne s'exécute jamais et j'ai clarifié pourquoi je ne pense pas que l'explication ERROR_WAIT_NO_CHILDREN est appropriée. –