Fonction en C RegQueryValueEx

Résolu
Bonjour,
j'ai besoin de récupérer la valeur d'une certaine clés dans la base de registre pour la comparer avec une autre et ainsi si les valeurs ne sont pas les même alors celle de la base de registre est mise à jour. Le truc c'est que je ne parviens pas à utiliser correctement la fonction RegQueryValueEx().

Voici la partie de mon code qui l'utilise :
char datatest[24], data[24]; (data contient la valeur désirée pour la clés)
HKEY valeur;
LPCTSTR subkey, valuename; (subkey et valuename sont renseignés dans une autre partie de code)

RegOpenKeyEx (HKEY_LOCAL_MACHINE, TEXT(subkey), 0, KEY_SET_VALUE, &valeur);
RegQueryValueEx (valeur, TEXT(valuename), 0, 0, datatest, strlen(datatest) + 1);
strcmp(datatest, data);

A la compilation, DevCPP 5 me dit :
[Warning] passing arg 6 of `RegQueryValueExA' makes pointer from integer without a cast

Je comprends pas...

Voici ce que dit MSDN sur la fonction utilisé :

RegQueryValueEx Function

Retrieves the type and data for the specified value name associated with an open registry key.

To ensure that any string values (REG_SZ, REG_MULTI_SZ, and REG_EXPAND_SZ) returned are null-terminated, use the RegGetValue function.
Syntax

LONG WINAPI RegQueryValueEx(
__in HKEY hKey,
__in_opt LPCTSTR lpValueName,
__reserved LPDWORD lpReserved,
__out_opt LPDWORD lpType,
__out_opt LPBYTE lpData,
__inout_opt LPDWORD lpcbData
);

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

Pouvez vous m'aider?

4 réponses

  • Votes
  • Date
  • Date décroissante
  1. remplace ton char data[24] par DWORD data=strlen(datatest); et dans la focntion tu mets :

    RegQueryValueEx (valeur, TEXT(valuename), 0, 0, datatest, &data);

    essaie voir et pense a tester la valeur de retour

    tchû
    1. Je ne veux pas toucher à data car cette variable ne me pose pas de problème.

      C'est datatest qui me gêne car. Cette variable me sert de buffer pour stocker la valeur de la clés ouverte par RegOpenKeyEx afin de la comparer à data qui est la valeur voulu (que je renseigne à la main).

      Le truc c'est que je ne comprends rien à la manière dont lpData et lpcbData fonctionne (précisons que lpData correspond à datatest et lpcbData à datatestsize dans mon prog)
      lpData :
      A pointer to a buffer that receives the value's data. This parameter can be NULL if the data is not required.
      lpcbData :
      A pointer to a variable that specifies the size of the buffer pointed to by the lpData parameter, in bytes. When the function returns, this variable contains the size of the data copied to lpData.

      Pour moi qui suis noob en C je comprends pas cette utilisation de pointeur.

      J'SUIS PERDU!!
      Helppp!
  2. Warning] passing arg 6 of `RegQueryValueExA' makes pointer from integer without a cast

    ceci signifie que le 6ieme argument qui chie, dans le sens où il attend un pointeur et pas une valeur (without a cast)

    LONG WINAPI RegQueryValueEx(
    __in HKEY hKey,
    __in_opt LPCTSTR lpValueName,
    __reserved LPDWORD lpReserved,
    __out_opt LPDWORD lpType,
    __out_opt LPBYTE lpData,
    __inout_opt LPDWORD lpcbData
    );

    on voit bien que le sixieme ici est lpcbData et donc le dernier parametre, et toi tu lui file une longueur alors qu'il attend un pointeur sur une variable de type DWORD ou int si tu preferes.

    donc ...

    ce DWORD correspond effectivement à la longueur de ton champ datatest comme je te l'ai indiqué

    voilà en espérant t'avoir aider

    tchû

    NB: si tu suit (ou suis je ne sais plus) le raisonnement qui suit dans le lien que tu as mis tout a l'heure, il ne devrait pas y avoir de pb...
    1. Je viens de créer les pointeurs vers les variables. Mais je rencontre les erreurs suivantes :
      [Warning] assignment from incompatible pointer type
      sur les lignes suivantes :

      char name[64], hostname[64], domainname[64], ipv4[16], data[64], datatest[MAX_PATH] = "", *ptr_datatest;
      ptr_datatest = &datatest;
      int res, my_socket, envoie, hostname_flag = 0, flag = 0, c = 0, i, *ptr_datatestsize;
      ptr_datatestsize = &datatestsize;

      et aussi cette erreur:
      [Warning] cast to pointer from integer of different size
      sur cette ligne:
      resultatquery = RegQueryValueEx (valeur, TEXT(valuename), 0, 0, (LPBYTE)*ptr_datatest, (LPDWORD)ptr_datatestsize);

      Je commence tout juste le C et les pointeurs j'y comprends pas grand chose malgré ma bonne volonté....
  3. ce qu'il serait bien c'est d'avoir ton code car là tu le balance par petit morceau et bon je dois dire que je fais comme le compilo, je m'y perd ...

    ne mets que les parties concernées si tu penses que ton code est confidentiel, sinon mets tout. après je regarde

    merci

    NB: pour ton code, selectionne le et clique sur le bouton "conserver la mise en forme du texte selectionné" ou alors utilise les mots clé "code" et "/code" entre chevron <> et sans les guillemets, en mettant avant ton code "code" et à la fin "/code" comme un balisage xml.
    1. bonsoir

      pour (LPBYTE)*ptr_datatest
      il faut (LPBYTE)ptr_datatest
      mais datatest etant déja un pointeur sur char (LPBYTE)datatest suffirait

      pour ptr_datatestsize = &datatestsize;
      je ne vois pas la declaration datatestsize

      de toute facon avec un type different de dword tu n'en feras pas grand chose
      comme dit daronmaster le mieux est
      DWORD datatestsize;
      puis &datatestsize en 6e argument
      1. Bon j'ai finis par y arriver, MSDN disait d'utiliser des pointeurs mais cela fonctionne aussi sans donc j'ai mis des variables directement et hop magie! Ca fonctionne!