mercredi 18 avril 2012

Modifier la valeur d'une variable d'envirronement en C (API Windows)

Une petite fonction, qui peut être très utile

J'ai décidé de rédiger ce petit post car j'ai récemment eu à réalisé un exécutable en ligne de commande, pour ne pas avoir à aller à chaque fois dans le répertoire contenant mon exécutable pour le lancer, j'ai du trouver un moyen de changer la valeur du path windows de façon définitive.

Voici la petite fonction que j'ai réalisé

/****    Fonction set_path.c

---------Cette fonction prends en paramètre le chemin de l'executable à rajouter dans le path
---------Toujours mettre un point virgule avant de mettre le chemin absolu ";"

****/

#include <Windows.h>
#include <stdio.h>

int set_path(char * chemin_exe)
{
  HKEY hKey;
  char *path;
  char *path_exec;
  BYTE *paths;
  int len;

  path = malloc(1024 * sizeof(*path));
  path_exec = malloc(256 * sizeof(*path_exec));
  path = getenv("Path");
  path_exec = chemin_exe;
  path = strcat(path, path_exec);
  paths = (byte *) path;

  printf("Path = %s %d\n", path, strlen(path));


  if (RegCreateKey(HKEY_LOCAL_MACHINE, "SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Environment", &hKey) != ERROR_SUCCESS)
  {
    fprintf(stderr, "RegCreateKey() a échouée : %d\n", GetLastError());
    return (EXIT_FAILURE);
  }
  else
  {   
    printf("reussi paths pret\n");
    RegSetValueEx(hKey, "Path", 0, REG_EXPAND_SZ, paths, strlen(path) + 1);
    RegCloseKey(hKey);
  }
  //getchar();
  return (EXIT_SUCCESS);
}

Voici une explication succincte de quelques fonctions clé

malloc : allocation dynamique de mémoire, prends en paramètre le type de la variable et la taille maximum possible

getenv : Permet de récupérer la valeur d'une variable d'envirronement

Strcat : concaténation de 2 chaînes

RegCreateKey : Permet de créer ou modifier une clé dans la base de registre, prend en paramètre la clé de la base la base de registre que l'on souhaite modifier,l'arborescence à créer ou celle ou se trouve la sous clé à modifier, puis une un identifiant ou handle dans lequel sera stocké la résultante de cette fonction.

RegSetValueEx : Permet de donner une valeur à la sous clé qu'on viens de créer ou modifier une existante, elle prends en paramètre l'identifiant ou handle de la clé, ensuite le nom de la variable à modifier, ne pas se soucier du 3ème argument mettre un 0, ensuite le type de la variable que vous souhaitez créer ou modifier, ensuite la valeur souhaiter pour la variable, enfin la taille de la valeur

RegCloseKey : permet de fermé la clé de registre (Tout ce qui est ouvert doit être fermé), prends en paramètre l'identifiant ou le handle qui a été passé en paramètre au RegCreateKey.