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
    Membre habitué
    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
    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 chevronné
    Inscrit en
    Décembre 2010
    Messages
    290
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 290
    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 Expert
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    869
    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 : 869
    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 : 62
    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
    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.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  5. #5
    Membre habitué
    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
    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 : 62
    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
    Par défaut
    @Stochelo : ne pas oublier le bouton si la réponse est correcte
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

+ 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