[C - WinAPI] RegEnumValue(A)

Fermé
Utilisateur anonyme - 30 juin 2012 à 16:57
 Utilisateur anonyme - 15 juil. 2012 à 17:44
Bonjour, ou bonsoir, :-)

J'évite d'embêter un ami alors je viens vous voir, y'a des trucs que je ne pige pas...

void reg_reader () {

	HKEY key;
	unsigned long NNom = 25, NVal = 25;
    char * Valeur = new char[25], * NomVal = new char[25];
    int Ret, i = 0;

	RegOpenKeyExA(HKEY_LOCAL_MACHINE,"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", 0, KEY_ALL_ACCESS, &key);
	
	do {
		NNom = 25;
        NVal = 25;
        Ret = RegEnumValue(key, i, NomVal, &NNom, 0, 0, Valeur, &NVal);

        if (Ret != ERROR_NO_MORE_ITEMS) {
            fprintf(rapport, "%s %s\n", Valeur, NomVal); // affichage
        }

        i++;
	} while (Ret != ERROR_NO_MORE_ITEMS);

	RegCloseKey(key);
}



1 -- char * Valeur = new char[25], * NomVal = new char[25];

Défini les pointeurs de ? :

unsigned long NNom = 25, NVal = 25;

2 -- RegOpenKeyExA(HKEY_LOCAL_MACHINE,"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", 0, KEY_ALL_ACCESS, &key);

A quoi sert le & dans &key ?

3 -- (Le plus important), sachant qu'il n'y a pas de fonction ANSI pour RegEnumValue, comment puis-je contrer cette erreur ?

error C2664: 'RegEnumValueW' : impossible de convertir le paramètre 3 de 'char *' en 'LPWSTR'
1>          Les types pointés n'ont aucun rapport entre eux ; conversion nécessitant reinterpret_cast, cast de style C ou cast de style fonction


J'avoue avoir beaucoup de mal avec ANSI, UNICODE...

Merci !


5 réponses

fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
30 juin 2012 à 20:59
Bonjour,

Ton code est du C++ et non du C...

1/
Non, Valeur ne définit pas le pointeur de NVal. Valeur est un pointeur sur une zone mémoire de NVal caractères. Pour faire simple, tu peux voir Valeur comme un tableau de NVal caractères (ou une chaîne de NVal-1 lettres : il faut compter le \0).
Pour faire propre, =new char(Nval); aurait été mieux.

2/
L'esperluette (&) indique qu'il faut envoyer l'adresse mémoire de key à la fonction et non la valeur elle-même. Cela permet de modifier la variable key depuis la fonction.

3/
Pourquoi utilises-tu des char ?
Sinon, cela dépend si l'unicode est bien définie ou pas.
Si non, LPSTR sera assimilé à du char* donc un simple sprintf peut faire l'affaire pour la conversion, sinon il faudra convertir en w_char* en passant par wcstombs()
0
Utilisateur anonyme
30 juin 2012 à 23:40
Bonsoir ;'),

Comment vois-tu que c'est du C++ ? Je prends simplement ce dont j'ai besoin et vu que le C et le C++ s'implémentent très bien... je ne fais pas attention.

Merci pour tes explications.

Pourquoi j'utilise du char ? Je ne sais pas... car c'est ce que l'on retrouve assez souvent... En fait j'ai un bouquin de programmation C sous Unix, y'a pas mal d'exemple avec char.

sprintf ne marche pas, et j'ai des erreur sur des headers que je n'inclût pas, je regarde tout ça.
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
1 juil. 2012 à 00:15
Comment je vois que c'est du C++ ? Ben tu utilises new qui n'existe pas en C.
Oui, le char est souvent utilisé en C. Mais dès lorsque t'es en C++, c'est plus simple d'utiliser des string au lieu des tableaux de char.
Et enfin sous windows, dès lors que tu utilises les API Windows, tu peux utiliser les structures adéquates comme LPSTR.
0
Utilisateur anonyme
1 juil. 2012 à 00:25
Pour être franc je commence à comprendre le C, mais le C++ c'est mega dur...

J'essaye d'assimiler mais pas facile...

Et enfin sous windows, dès lors que tu utilises les API Windows, tu peux utiliser les structures adéquates comme LPSTR.


Càd ?
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
1 juil. 2012 à 00:32
RegEnumValue est une API Windows. D'ailleurs tu as inclu Winreg.h ou Windows.h pour pouvoir l'utiliser.
Son prototype est :
LONG WINAPI RegEnumValue(
__in HKEY hKey,
__in DWORD dwIndex,
__out LPTSTR lpValueName,
__inout LPDWORD lpcchValueName,
__reserved LPDWORD lpReserved,
__out_opt LPDWORD lpType,
__out_opt LPBYTE lpData,
__inout_opt LPDWORD lpcbData
);

Tu retrouves ton HKEY. En revanche au lieu des LPSTR tu as utilisé des char*. C'est pas faux en soit puisque cela représente soit un char* soit un wchar* en unicode.
0
Utilisateur anonyme
1 juil. 2012 à 12:10
J'ai vraiment beaucoup de mal avec ça... le Unicode etc ce ne sont pas des notions faciles :-\

Je regarde tout ça plus en détail.

Merci !
0
Utilisateur anonyme
1 juil. 2012 à 13:23
Mais c'est incompréhensible ! Regarde :

ça ça marche nickel.

int _tmain(int argc, TCHAR *argv[])
{
    HANDLE hFile;
    TCHAR szBuf[MAX_PATH];

    hFile = CreateFile(argv[1], GENERIC_READ, FILE_SHARE_READ, NULL,
        OPEN_EXISTING, 0, NULL);

    if(hFile == INVALID_HANDLE_VALUE)
    {
        printf("CreateFile failed with %d\n", GetLastError());
    }
	if(GetCreateTime( hFile, szBuf, MAX_PATH ))
        _tprintf(TEXT("Create time is: %s\n"), szBuf);

	getch();
        
    CloseHandle(hFile);    
}


et ça non, alors que je ne change rien !

int _tmain(int argc, TCHAR *argv[])
{
    HANDLE hFile;
    TCHAR szBuf[MAX_PATH];
	TCHAR *directory = "C:\rapport.txt";

    hFile = CreateFile(directory, GENERIC_READ, FILE_SHARE_READ, NULL,
        OPEN_EXISTING, 0, NULL);

    if(hFile == INVALID_HANDLE_VALUE)
    {
        printf("CreateFile failed with %d\n", GetLastError());
    }
	if(GetCreateTime( hFile, szBuf, MAX_PATH ))
        _tprintf(TEXT("Create time is: %s\n"), szBuf);

	getch();
        
    CloseHandle(hFile);    
}


C'est abusé, tout deux sont du TCHAR ???

Merci :-)
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
1 juil. 2012 à 13:49
Eh si tu as changé des choses ^^.
TCHAR *directory = "C:\rapport.txt";
\r est une séquence d'échappement (retour chariot).
Essaie plutôt TCHAR * directory = "C:\\rapport.txt"

Mais encore mieux : LPTSTR directory = TEXT("C:\\rapport.txt");
0
Utilisateur anonyme
1 juil. 2012 à 14:34
Oui oui pour l'échappement, j'ai encore du mal vu que je change de langage :-)

Essaie plutôt TCHAR * directory = "C:\\rapport.txt"


--> error Cc2440: 'initialisation' : impossible de convertir de 'const char [15]' en 'TCHAR *' (ça change ^^)


LPTSTR directory = TEXT("C:\\rapport.txt");


Fonctionne du tonnerre mais sans le TEXT non... à quoi sert dont ce TEXT ?

En fait, au final je veux tout écrire dans un fichier texte pour info, là je voulais me débarrasser de l'argv[1] ;-)
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
1 juil. 2012 à 21:42
Essaie : TCHAR directory[] = "C:\\rapport.txt"
Ca devrait être mieux.
Le TEXT est une macro à utiliser pour avoir plus de portabilité : que unicode soit activé ou non, cela fonctionnera. Si cela fonctionne sans, il est probable que tu sois en ansi et non unicode.
0
Utilisateur anonyme
1 juil. 2012 à 21:45
oui je suis en ANSI, et d'habitude j'essaye de caser un A devant mes ... appels de fonction ? Quoiqu'il en soit je vais devoir me familiariser avec l'engin, je ne vais pas utiliser de sparadra toute ma vie ;-)

j'essayerai merci ;-)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Utilisateur anonyme
15 juil. 2012 à 17:44
Bonjour,

J'avais un soucis avec mon pc, je n'ai donc pas pu programmer dans ce langage...

Est-ce possible d'avoir des erreurs dans les headers ?

J'ai ça :-\

1>c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winbase.h(6132): warning C4229: anachronisme utilisé : modificateurs de données ignorés
1>c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winbase.h(6133): error C2226: erreur de syntaxe : type inattendu 'LPSTR'
1>c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winbase.h(6140): warning C4229: anachronisme utilisé : modificateurs de données ignorés
1>c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winbase.h(6141): error C2226: erreur de syntaxe : type inattendu 'LPWSTR'
1>c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winbase.h(6145): warning C4005: 'lstrcpy' : redéfinition de macro
1>          c:\program files (x86)\microsoft sdks\windows\v7.0a\include\strsafe.h(9748) : voir la définition précédente de 'lstrcpy'
1>c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winbase.h(6154): warning C4229: anachronisme utilisé : modificateurs de données ignorés
1>c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winbase.h(6155): error C2226: erreur de syntaxe : type inattendu 'LPSTR'
1>c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winbase.h(6162): warning C4229: anachronisme utilisé : modificateurs de données ignorés
1>c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winbase.h(6163): error C2226: erreur de syntaxe : type inattendu 'LPWSTR'
1>c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winbase.h(6167): warning C4005: 'lstrcat' : redéfinition de macro
1>          c:\program files (x86)\microsoft sdks\windows\v7.0a\include\strsafe.h(9772) : voir la définition précédente de 'lstrcat'
1>c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winuser.h(221): warning C4229: anachronisme utilisé : modificateurs de données ignorés
1>c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winuser.h(222): error C2226: erreur de syntaxe : type inattendu 'LPSTR'
1>c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winuser.h(228): warning C4229: anachronisme utilisé : modificateurs de données ignorés
1>c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winuser.h(229): error C2226: erreur de syntaxe : type inattendu 'LPWSTR'
1>c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winuser.h(233): warning C4005: 'wvsprintf' : redéfinition de macro
1>          c:\program files (x86)\microsoft sdks\windows\v7.0a\include\strsafe.h(9823) : voir la définition précédente de 'wvsprintf'
1>c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winuser.h(241): warning C4229: anachronisme utilisé : modificateurs de données ignorés
1>c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winuser.h(242): error C2226: erreur de syntaxe : type inattendu 'LPSTR'
1>c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winuser.h(248): warning C4229: anachronisme utilisé : modificateurs de données ignorés
1>c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winuser.h(249): error C2226: erreur de syntaxe : type inattendu 'LPWSTR'
1>c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winuser.h(253): warning C4005: 'wsprintf' : redéfinition de macro
1>          c:\program files (x86)\microsoft sdks\windows\v7.0a\include\strsafe.h(9814) : voir la définition précédente de 'wsprintf'
1>c:\program files (x86)\microsoft sdks\windows\v7.0a\include\stralign.h(113): error C2065: 'wcscpy_instead_use_StringCchCopyW_or_StringCbCopyW' : identificateur non déclaré
========== Génération : 0 a réussi, 1 a échoué, 0 mis à jour, 0 a été ignoré ==========


Moi je veux bien mais ça concerne pas mon code...
0