Donc, j'ai un petit fragment de code C en cours d'exécution sur une boîte de fenêtres, qui se lit ainsi:Pourquoi le processus de spawn de Windows déclenche-t-il parfois une erreur STATUS_SXS_ASSEMBLY_NOT_FOUND?
/* invoke command */
impl->procHandle = _spawnve(_P_NOWAIT, command, vargs, env);
if (impl->procHandle == -1) {
printf("Failed to invoke command: %s\n", strerror(errno));
impl->busy = false;
}
printf("VICTORY\n");
j'ai écrit quelques tests unitaires autour de ce où ma "commande" est C: \ windows \ system32 \ ipconfig. exe et ça marche, pas de problème.
Essayé de l'utiliser pour un lanceur d'application ... doo doo. A échoué avec l'erreur utile:
The application failed to initialize properly (0xc0150004).
Click on OK to terminate the application.
Ok ... je recherche autour découvert que le code d'erreur est STATUS_SXS_ASSEMBLY_NOT_FOUND, et il arrive lorsque je tente de lancer notepad.exe aussi bien. Assemblées manquantes?
Pourquoi cela se produit-il?
Comment puis-je contourner ce problème?
Je suis juste devinant ici, mais je soupçonne que cela a quelque chose à voir avec avoir besoin de la variable PATH à définir dans le _spawnve(), mais je ne sais pas ce qu'il devrait être. J'ai essayé de passer sur le chemin, mais cela ne semble pas aider. L'exécution de ce code:
int offset = 0;
while (vargs[offset] != NULL) {
printf("vargs %d: %s\n", offset, vargs[offset]);
++offset;
}
offset = 0;
while (env[offset] != NULL) {
printf("env %d: %s\n", offset, env[offset]);
++offset;
}
yeilds:
vargs 0: C:\windows\system32\notepad.exe
env 0: PATH=c:\WINDOWS\system32
ie. Je passe dans argv [0], et une valeur de chemin; pas d'autres variables ou arguments env.
Des idées?
-
Edit:
Ainsi, il semble que cette erreur se produit car le chemin est pas correctement quand j'invoque la commande à l'aide _spawnve(). Ceci est rendu évident en invoquant _spawnv() ou _spawnvpe(), qui semblent fonctionner correctement tous les deux.
Cependant, cela ne m'aide pas vraiment, parce que je dois spécifier un composant PATH supplémentaire pour l'application quand il s'exécute. Passer PATH = ... dans _spawnvpe() provoque la même erreur, et évidemment _spawnv n'est pas utilisé car il ne vous permet pas de spécifier le PATH.
Donc vraiment, la réponse à cette question est: Parce que la variable PATH est fausse.
... mais je n'ai encore aucune idée de ce que devrait être. Il ne semble y avoir aucun exemple de travail que je puisse trouver nulle part. J'accepte n'importe quelle réponse qui lie à un exemple de codage utilisant _spawnve() ou _spawnvpe() et passant la variable PATH dedans (et fonctionnant).
Édition 2:
Vraiment. Non, en fait, cela ne fonctionne pas. Voici un exemple ne fonctionne pas. Oubliez le lien vers un exemple qui fonctionne; il suffit de modifier mon exemple et de publier un diff qui 1) passe dans PATH et 2) s'exécute sans erreur.
Nb.Voulez-vous le voir fonctionner? changez pour _spawnv() ou faites la valeur d'env NULL et cela fonctionne très bien.
#include <stdio.h>
#include <windows.h>
#include <process.h>
#include <errno.h>
int main(int argc, char *argv[]) {
char *path_value;
char buffer[4000];
const char *env[2];
const char *args[1];
char *command;
int result;
intptr_t procHandle;
path_value = getenv("PATH");
sprintf(buffer, "PATH=%s", path_value);
env[0] = buffer;
env[1] = NULL;
args[0] = NULL;
int offset = 0;
while (env[offset] != NULL) {
printf("env %d: %s\n", offset, env[offset]);
++offset;
}
offset = 0;
while (args[offset] != NULL) {
printf("arg %d: %s\n", offset, args[offset]);
++offset;
}
command = "C:\\windows\\system32\\notepad.exe";
procHandle = _spawnvpe(_P_NOWAIT, command, args, NULL);
if (procHandle == -1) {
printf("Failed to invoke command: %s\n", strerror(errno));
exit(1);
}
_cwait(&result, procHandle, 0);
if (result != 0)
printf("Command exited with error code %d\n", result);
}
Sortie:
env 0: PATH=.;c:\Program Files\Common Files\Microsoft Shared\Windows Live;c:\WINDOWS\system32;c:\WINDOWS;c:\WINDOWS\System32\Wbem;c:\Program Files\Microsoft SQL Server\100\Tools\Binn\;c:\Program Files\Microsoft SQL Server\100\DTS\Binn\;c:\Program Files\CMake 2.8\bin;c:\Program Files\Microsoft ASP.NET\ASP.NET Web Pages\v1.0\;c:\Program Files\Common Files\Microsoft Shared\Windows Live
Command exited with error code -1072365564
Documentez ce que vous trouvez dans le journal des événements de l'application Windows. –
Si vous parlez du journal "Application" dans l'afficheur d'événements, il n'y a rien là. J'ai couru le code défaillant une douzaine de fois et aucune nouvelle entrée de journal n'a été affichée. Si vous parlez d'autre chose, soyez plus précis. – Doug
Cela peut simplement signifier que votre application a besoin de DLL qui ne sont pas là. Voir sur SO: http://stackoverflow.com/questions/1582844/vcredist-x86-dll-and-version-8-0-50727-4053 –