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 CreateEnvironmentBlock avec hToken comme NULL et bInherit comme FALSE.

OriginalL'auteur user2970916 | 2014-09-18