IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Threads & Processus C++ Discussion :

Utilisation de CreateProcess()


Sujet :

Threads & Processus C++

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Décembre 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9
    Points : 7
    Points
    7
    Par défaut Utilisation de CreateProcess()
    Bonjour tout le monde!

    Je tente depuis hier de créer un processus avec CreateProcess, mais rien n'y fait, cela me renvoie une erreur (code 998).

    Voilà le code simplifié en question :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    #include <windows.h>
    #include <stdio.h>
    #include <errno.h>
    #include <string.h>
     
    // THREAD PRIMARIA
    int main()
    {
     
        bool bStatus;
        STARTUPINFO si;
        PROCESS_INFORMATION NewProcess;
     
        bStatus = CreateProcessA("C:\\WINXP\\Process2.exe", NULL, NULL, NULL, TRUE, NORMAL_PRIORITY_CLASS, NULL, "C:\\WINXP", &si, &NewProcess);
        if (!bStatus) printf ("Erro na criacao do Processo! Codigo = %d\n", GetLastError());
    }
    L'exécutable "Process2.exe" est un programme tout bête que j'ai créé qui imprime "Hello World" et sleep durant 10 secondes. Je ne comprends pas pourquoi la création de processus ne marche pas.

    Quelqu'un a une idée? J'ai des doutes sur le second argument de CreateProcess, j'ai essayé plusieurs choses en regardant sur le net, mais rien n'y fait. (dernière pierre manquante pour que mon projet soit opérationnel, je suis pressé de découvrir quelle pourrait être l'erreur!)


    Merci d'avance


    Stochelo

  2. #2
    Membre éclairé
    Inscrit en
    Décembre 2010
    Messages
    290
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 290
    Points : 719
    Points
    719
    Par défaut
    Tu n'initialises pas ta structure STARTUP_INFO.
    Comme spécifié dans la doc (http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx), c'est un paramètre d'entrée. C'est donc à toi de fournir quelque chose de cohérent.
    Le cas présent, ta structure si contient ce qui se trouve sur la pile au moment de l'appel, c'est à dire n'importe quoi. Tu as de la chance, ce n'importe quoi a provoqué une erreur. Avec moins de chance, ça aurait pu marcher durant tests, et planter lamentablement en production.

    A ce que je vois rapidement, tu dois au moins remplir le champ dwFlags à 0 et le champ cb à sizeof(STARTUP_INFO).

  3. #3
    Membre chevronné
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    856
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 856
    Points : 2 179
    Points
    2 179
    Par défaut
    L'API windows fournit aussi des fonctions permettant de connaître l'erreur. Voici un code que j'utilise :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    DWORD   dwLastError = ::GetLastError();
    TCHAR   lpBuffer[256] = L"?";
     
    if(dwLastError != 0) {
      ::FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, dwLastError,
                              MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT),
                              lpBuffer, sizeof(lpBuffer)-1, NULL);
      wcout << L"erreur: " << lpBuffer;
    }

  4. #4
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Citation Envoyé par phi1981 Voir le message
    A ce que je vois rapidement, tu dois au moins remplir le champ dwFlags à 0 et le champ cb à sizeof(STARTUP_INFO).
    Un gros +1

    l'erreur 998 signifie ERROR_NOACCESS ou encore "Invalid access to memory location."

    Probablement que l'appel CreateThread() tente de déréférencer quelque chose dans STARTUP_INFO et que, comme il y a n'importe quoi dedans, cela part en cacahuètes.

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Décembre 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9
    Points : 7
    Points
    7
    Par défaut
    Citation Envoyé par phi1981 Voir le message
    Tu n'initialises pas ta structure STARTUP_INFO.
    Comme spécifié dans la doc (http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx), c'est un paramètre d'entrée. C'est donc à toi de fournir quelque chose de cohérent.
    Le cas présent, ta structure si contient ce qui se trouve sur la pile au moment de l'appel, c'est à dire n'importe quoi. Tu as de la chance, ce n'importe quoi a provoqué une erreur. Avec moins de chance, ça aurait pu marcher durant tests, et planter lamentablement en production.

    A ce que je vois rapidement, tu dois au moins remplir le champ dwFlags à 0 et le champ cb à sizeof(STARTUP_INFO).
    Exactement cela, merci beaucoup! Obrigado!

  6. #6
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    @Stochelo : ne pas oublier le bouton si la réponse est correcte

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Utilisation de CreateProcess
    Par Faern dans le forum Threads & Processus
    Réponses: 1
    Dernier message: 02/11/2010, 03h20
  2. Problème d'utilisation de CreateProcess
    Par Mister Nowis dans le forum Windows
    Réponses: 4
    Dernier message: 22/03/2010, 11h34
  3. Utiliser Createprocess pour lancer une fonction
    Par lolita4882 dans le forum C++
    Réponses: 3
    Dernier message: 14/03/2008, 12h01
  4. Réponses: 5
    Dernier message: 14/02/2007, 17h06
  5. Réponses: 2
    Dernier message: 05/04/2004, 23h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo