2011-08-09 4 views
6

J'essaie de compiler le code hérité de Windows XP sous un nouvel environnement dans Windows 7. Il compile mais échoue lors de l'exécution.CreateProcess échoue sous Windows 7

CreateProcess() retourne 0 et GetLastError() renvoie 2, qui signifie ERROR_FILE_NOT_FOUND

Voici mon appel à CreateProcess

STARTUPINFO StartInfo; 
memset(&StartInfo, 0, sizeof(StartInfo)); 

wcsncpy(astrCommandLine, L"TFTP", MAX_OSCOMMANDLINE_SZ-1); 
BOOL bFuncRetn = CreateProcess(NULL, 
       astrCommandLine,  // command line 
       NULL,   // process security attributes 
       NULL,   // primary thread security attributes 
       NULL,   // handles are inherited 
       0,    // creation flags 
       NULL,   // use parent's environment 
       NULL,   // use parent's current directory 
       &StartInfo,   // STARTUPINFO pointer 
       &m_ProcInfo); // receives PROCESS_INFORMATION 

Maintenant, pour les bizarreries: Quand au lieu de tftp je lance calc, calc apparaît. Je peux exécuter tout ce qui se trouve sur ma ligne de commande à partir de n'importe où dans une invite de commande, ce qui m'indique que le% PATH% de c: \ windows \ system32 est connu et fonctionne correctement.

J'ai essayé de forcer CreateProcessA avec des chaînes ansi mais j'ai obtenu le même résultat. J'ai également essayé dans la configuration de débogage et de libération et à partir de la ligne de commande.

Une idée? Les deux fichiers calc.exe et tftp.exe se trouvent dans c: \ windows \ system32 qui se trouve dans le chemin système. L'exécution de "c: \ windows \ system32 \ tftp" ne fonctionne pas

+0

Est-ce que tftp est trouvé par un chemin d'accès d'application plutôt que par le chemin du système? Cela pourrait expliquer pourquoi calc est trouvé mais tftp ne l'est pas. CreateProcess n'utilise pas les chemins d'accès. Je suppose que vous définissez StartInfo.cb quelque part. –

+0

Il y a très peu d'espoir que cela fonctionne. Sûrement tftp.exe ne se trouve pas dans le répertoire de travail par défaut de votre programme. Calc.exe n'est pas un problème, il est sur le chemin. Passez le chemin d'accès * full * du fichier .exe, comme c: \ foo \ bar \ tfpt.exe. –

+0

Je n'ai jamais entendu parler de StartInfo.cb – Eric

Répondre

9

Le problème est que vous avez une application 32 bits qui tente d'exécuter une commande Windows 64 bits. Vous n'avez pas besoin de recompiler votre application en 64 bits pour résoudre le problème. Tout ce que vous avez à faire est de changer toutes les occurrences de c: \ windows \ system32 en c: \ windows \ SysNative.

Sous Windows 7 x64, les références à c: \ windows \ system32 à partir de programmes 32 bits sont automatiquement redirigées vers c: \ windows \ syswow64. En utilisant l'alias spécial c: \ windows \ SysNative, Windows 7 ne fait pas la redirection.