Utiliser la fonction CreateProcess pour Exécuter un Fichier de commandes
Je suis en train d'utiliser la fonction CreateProcess pour démarrer un nouveau bloc d'environnement et d'exécuter un fichier de commandes dans le nouveau bloc d'environnement. J'ai lu à travers la msdn exemple pour la fonction CreateProcess, et est venu avec le code indiqué ci-dessous.
Ce qui se passe, il va ouvrir la nouvelle invite de commande, et de s'arrêter là. Il ne sera pas exécuté mes .le fichier bat pour une raison quelconque. À l'aide de system("l'APPEL du chemin") qui fera appel à la .le fichier bat.
#include <iostream>
#define WINDOWS_LEAN_AND_MEAN
#include <Windows.h>
#include <strsafe.h>
#define BUFSIZE 4096
int main()
{
//system("CALL C:\\HFSS\\setup_vars.bat");
//return 0;
LPWCH chNewEnv;
LPTSTR lpszCurrentVariable;
DWORD dwFlags = 0;
TCHAR szAppName[] = TEXT("C:\\windows\\system32\\cmd.exe");
TCHAR cmdArgs[] = TEXT("C:\\HFSS\\setup_var.bat");
STARTUPINFO si;
PROCESS_INFORMATION pi;
BOOL fSuccess;
//Copy environment strings into an environment block.
chNewEnv = GetEnvironmentStrings();
lpszCurrentVariable = (LPTSTR)chNewEnv;
if (FAILED(StringCchCopy(lpszCurrentVariable, BUFSIZE, TEXT("MySetting=A"))))
{
printf("String copy failed\n");
return FALSE;
}
lpszCurrentVariable += lstrlen(lpszCurrentVariable) + 1;
if (FAILED(StringCchCopy(lpszCurrentVariable, BUFSIZE, TEXT("MyVersion=2"))))
{
printf("String copy failed\n");
return FALSE;
}
//Terminate the block with a NULL byte.
lpszCurrentVariable += lstrlen(lpszCurrentVariable) + 1;
*lpszCurrentVariable = (TCHAR)0;
//Create the child process, specifying a new environment block.
SecureZeroMemory(&si, sizeof(STARTUPINFO));
si.cb = sizeof(STARTUPINFO);
#ifdef UNICODE
dwFlags = CREATE_UNICODE_ENVIRONMENT;
#endif
fSuccess = CreateProcess(szAppName, cmdArgs, NULL, NULL, TRUE, dwFlags,
(LPVOID)chNewEnv, //new environment block
NULL, &si, &pi);
if (!fSuccess)
{
printf("CreateProcess failed (%d)\n", GetLastError());
return FALSE;
}
std::cout << "In new environment\n";
WaitForSingleObject(pi.hProcess, INFINITE);
return TRUE;
}
Sur quelle ligne il déclenche un point de rupture? Les lignes que vous n'êtes pas sûr des essayez d'ajouter deux nouvelles variables d'environnement pour le bloc d'environnement du processus de sur le point d'être lancé, et vous avez indiqué que ce que vous essayez de le faire, donc je ne suis pas sûr de ce que votre question les concernant, peut-être.
Je suis en train d'essayer de définir les variables d'environnement dans le fichier de commandes. Toutefois, le temps que je reçois pour le fichier de commandes (sans créer de nouveaux processus), la variable %PATH% a tous les arbres de données à partir de visual studio. Donc, lorsque j'essaie d'ajouter le nouveau chemin d'accès à la variable %PATH%, il est notamment l'redondant et l'excès d'information. Aussi, j'ai trouvé la panne était due à l'utilisation de "\" au lieu de "\\"
Votre modification ne pas répondre à tous les points que j'ai soulevés.
Si vous ne souhaitez que des variables d'environnement système, vous pouvez appeler
Je suis en train d'essayer de définir les variables d'environnement dans le fichier de commandes. Toutefois, le temps que je reçois pour le fichier de commandes (sans créer de nouveaux processus), la variable %PATH% a tous les arbres de données à partir de visual studio. Donc, lorsque j'essaie d'ajouter le nouveau chemin d'accès à la variable %PATH%, il est notamment l'redondant et l'excès d'information. Aussi, j'ai trouvé la panne était due à l'utilisation de "\" au lieu de "\\"
Votre modification ne pas répondre à tous les points que j'ai soulevés.
Si vous ne souhaitez que des variables d'environnement système, vous pouvez appeler
CreateEnvironmentBlock
avec hToken
comme NULL
et bInherit
comme FALSE
.OriginalL'auteur user2970916 | 2014-09-18
Vous devez vous connecter pour publier un commentaire.
Quelques problèmes:
/C
option pourcmd.exe
afin de faire exécuter l' .le fichier bat.CreateProcess
doit être modifiable chaîne. Pas un littéral.lpszCurrentVariable
points de la mémoire tampon retournée parGetEnvironmentStrings
. Vous ne pouvez pas modifier cette mémoire tampon. Vous devez allouer un nouveau tampon de longueur suffisante et de copier de l'environnement. Ajoutez ensuite vos modifications.StringCchCopy
plutôt que C runtime fonctions est tout simplement déroutant. Ne prenez pas de MSDN exemple de code comme étant le parangon de style.std::wstring
et les autres classes de la bibliothèque standard et la fonction.WINDOWS_LEAN_AND_MEAN
avant de les importerWindows.h
.int main(void)
est incorrect. Le pas d'argumentmain
estint main()
.Le code suivant vous montre comment faire:
Fonctionne très bien ici. Qui plus est, vous pourrez observer que le code que j'spectacle est plus simple que la vôtre et vous montre comment éviter tous ces horribles C standard.
De toute façon, commencer avec mon programme exact. Remplacer la .chauve-souris de nom de fichier avec un nom de fichier valide sur votre système. Dans votre .fichier bat placez le
set
de commande qui liste des variables d'environnement. Ce qui se passe quand vous faites cela?Je vois la variable de CHEMIN d'accès et à la fin il a 3x le Chemin que je veux ajouter, puis un Visual Studio chemin pour AMD64 et Visual Studio 12.0 dossier lui-même.
Donc, mon programme fonctionne très bien et affiche la modification de l'environnement?
OriginalL'auteur David Heffernan