Un petit problème en C

Romain -  
 Romain -
Bonjour,

J'ai une question sur le C, je développe actuellement un programme en C, qui nécessite certaines variables d'environnements. Quand je le fais manuellement, j'ouvre un fichier .bat qui me set les variables et depuis cette même console j'execute le programme.
Cependant je souhaiterais que ces variables se SET directement dans mon programme avec le .bat (en gros est ce que le programme peut executer le .bat dans sa propre console ?). Je travaille sous visual studio et je n'ai pas trouvé de solution

Toute aide ou remarque est bonne à prendre alors je vous écoute :)

Cordialement,

Romain

4 réponses

  1. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847
     
    Bonjour,

    A ma connaissance, tu ne peux pas faire ça.
    Le seul moyen que je vois est de parser le fichier .bat (sans l'exécuter, juste l'ouvrir).
    Et tu recherches les SET avec (strstr()), et tu réalises l'affection en dynamique.
    1
  2. Romain
     
    Bonjour et merci pour ta réponse,

    J'ai bien essayé de faire
    system("set MaVariable=MonChemin");

    mais quand j'affiche les variables environnement via ce programme, les nouvelles que je viens de seter n'apparaissent pas.

    Est ce que c'est bien comme ca qu'il faut s'y prendre ?

    Cordialement

    EDIT : j'ai aussi essayé avec
    putenv("MAVARIABLE=MONCHEMIN");

    au début de mon main, mais je ne peux plus compiler car j'ai des erreurs, comme si ce putenv ne permettait plus aucunes déclarations de variables par la suite....
    1
    1. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847
       
      Je répète : ce n'est pas possible ce que tu souhaites faire...
      putenv() c'est pour utiliser les variables d'environnement.
      Cela ne te permettra pas de récupérer la valeur d'un set défini dans une console.
      0
    2. Romain
       
      Je ré-explique mon problème car je ne pense pas m'être bien exprimé.
      Je développe un programme qui a besoin de variables d'environnement spécifiques.
      Quand je lance un cmd et que je set mes variables, je lance ce programme dans cette même fênetre sans soucis.
      Ce que je n'arrive pas à faire c'est débuguer ce programme dans mon visual studio. j'ai une erreur "Module not Found" avec des adresses mémoire.

      Encore merci pour tes réponses
      0
    3. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847
       
      Ben, ça dépend du module.
      Mais d'une manière générale, il faut éviter d'utiliser la commande system() et compagnie. Il vaut mieux utiliserles fonctions du kernel.
      0
    4. Romain
       
      Bonjour Fiddy,

      Voici l'intitulé de mon erreur :

      Exception non gérée à 0x773815de dans itk_essai02.exe : Exception Microsoft C++ : UGS::Error::Severe à l'emplacement mémoire 0x0037f668..


      SI jamais tu arrive à comprendre cette erreur dis le moi !

      Merci d'avance
      0
  3. [Dal] Messages postés 6122 Date d'inscription   Statut Contributeur Dernière intervention   1 108
     
    Salut Romain,

    Sous Windows, tu peux fixer les variables d'environnement pour ton programme avec la fonction SetEnvironmentVariable :

    https://docs.microsoft.com/en-us/windows/win32/api/processenv/nf-processenv-setenvironmentvariablea?redirectedfrom=MSDN

    Il s'agit de les fixer pour le programme seulement, cette commande n'affecte pas les variables d'environnement du système.

    Si ton programme appelle d'autres processus, ils peuvent hériter de l'environnement créé en le passant avec CreateProcess.

    Tu as des exemples là :

    https://docs.microsoft.com/en-us/windows/win32/procthread/changing-environment-variables?redirectedfrom=MSDN

    Bien sûr, ce n'est pas du C standard, mais des API Windows.

    Dal
    1
    1. Romain
       
      Bonjour Dal et merci pour ta réponse et ton complément d'informations. J'ai été voir les liens du MSDN, cependant cela n'a rien donné.

      J'ai essayé
      SetEnvironmentVariable((LPCWSTR)"MaVariable", (LPCWSTR)"MaValeur");
      mais c'est san résultats.
      C'est le premier projet en C que je fais et j'avoue que je suis assez désorienté (habitué du VB.NET)

      Encore merci,

      Cordialement, Romain
      0
    2. [Dal] Messages postés 6122 Date d'inscription   Statut Contributeur Dernière intervention   1 108
       
      Salut,

      Cet exemple se base sur le 2ème code MSDN sur cette page : https://docs.microsoft.com/en-us/windows/win32/procthread/changing-environment-variables?redirectedfrom=MSDN et fonctionne bien chez moi.

      #include <stdio.h>
      #include <windows.h>
      
      #define BUFSIZE 4096
      
      int main(void)
      {
        DWORD dwRet, dwErr;
        LPTSTR pszOldVal;
      
        if (!SetEnvironmentVariable("MaVariable", "MaValeur"))
        {
          printf("Error: cannot set the environment variable\n");
          exit(EXIT_FAILURE);
        }
      
        pszOldVal = (LPTSTR) malloc(BUFSIZE * sizeof(TCHAR));
        if (NULL == pszOldVal)
        {
          printf("Out of memory\n");
          exit(EXIT_FAILURE);
        }
        dwRet = GetEnvironmentVariable("MaVariable", pszOldVal, BUFSIZE);
      
        if (0 == dwRet)
        {
          dwErr = GetLastError();
          if (ERROR_ENVVAR_NOT_FOUND == dwErr)
          {
            printf("Environment variable does not exist.\n");
            exit(EXIT_FAILURE);
          }
          else if (BUFSIZE < dwRet)
          {
            pszOldVal = (LPTSTR) realloc(pszOldVal, dwRet * sizeof(TCHAR));
            if (NULL == pszOldVal)
            {
              printf("Out of memory\n");
              exit(EXIT_FAILURE);
            }
            dwRet = GetEnvironmentVariable("MaVariable", pszOldVal, dwRet);
            if (!dwRet)
            {
              printf("GetEnvironmentVariable failed (%ld)\n", GetLastError());
              exit(EXIT_FAILURE);
            }
          }
        }
        printf("found value: %s\n", pszOldVal);
        return 0;
      }
      

      Il crée une variable d'environnement "MaVariable" à laquelle il affecte "MaValeur" avec SetEnvironmentVariable, et récupère le contenu de cette variable avec GetEnvironmentVariable.

      Testé avec le compilateur MinGW.


      Dal

      Edit : contrôle d'erreur
      0
    3. Romain
       
      Merci pour cette rapidité de réponse ! J'avais essayé ce code mais j'avais l'exception. La je viens de recoller le code dans un nouveau projet et.... Ca fonctionne !

      Un grand merci à toi pour ton aide.
      Il ne me reste plus qu'a essayer de comprendre le code car ca n'a pas l'air d'être une mince affaire ...
      0
    4. [Dal] Messages postés 6122 Date d'inscription   Statut Contributeur Dernière intervention   1 108
       
      Microsoft aime bien les noms de fonctions à rallonge, les variables nommées avec leurs types (notation hongroise), qui sont, en plus des types à la sauce Microsoft.., alors, toute cela parait un peu opaque. Mais c'est du C quand même :-)

      Si tu as des questions sur ce code, n'hésites pas à les poser.


      Dal
      0
  4. kratosmindfreak Messages postés 45 Statut Membre
     
    bah tu peut utiliser ouvrir le fichier .bat on utilisant
    FILE *fichier=fopen("nomfichier.bat","r")
    puis tu peut faire ce que tu veux avec le fichier .bat
    on manipulons seulement le pointeur fichier
    0