GESTION BASE DE REGISTRE (LOCAL OU DISTANTE)AVEC DES FONCTIONS API
cs_jean84
Messages postés449Date d'inscriptionjeudi 26 août 2004StatutMembreDernière intervention 5 mars 2009
-
30 mai 2006 à 17:59
ymca2003
Messages postés2070Date d'inscriptionmardi 22 avril 2003StatutMembreDernière intervention 3 juillet 2006
-
31 mai 2006 à 12:32
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.
ymca2003
Messages postés2070Date d'inscriptionmardi 22 avril 2003StatutMembreDernière intervention 3 juillet 20067 31 mai 2006 à 12:32
strBuf = malloc(sizeof(lpcbData));
vue que lpcbData est un DWORD ça av allouer 4 octets seulement
strBuf = malloc(lpcbData); est la bonne allocation
char *rtn; rtn est pas initialisé dans pas mal de cas
genre ici ltoa(*intBuf,rtn,10);
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 30 mai 2006 à 21:55
excrt a fait une analyse détaillée de ton code (merci pour lui).
Il faudra upgrader ta source en rapport à ce qu'il a mis, des points très importants ont été relevés (gestion mémoire en 1er) et elle ne pourra donc pas rester longtemps dans cet état.
Bonne continuation.
excrt
Messages postés75Date d'inscriptionmercredi 5 avril 2006StatutMembreDernière intervention 3 juillet 2006 30 mai 2006 à 20:09
LPCTSTR
L = Long
P = Pointeur
C = Constante
T = Text
STR = STRing
les TCHAR peuvent être soient « char » ou « wchar_t », toi tu mélange les deux
tu les utilise à la « random », des char/TCHAR/LPCTSTR/etc...
utilise les char OU les TCHAR mais pas les deux, surtout que tu ne n'utilise même pas l'UNICODE
les « long pointer » ne sont plus utiles, far/near c'est out
ton « LPCTSTR Node; //contient le nom du pc », change le pour « [L]PSTR Node; » ou encore
« char* Node; » !
apparemment, tu ne connais pas la notation hongroise, celle utilisé par Microsoft
lp == long pointer >> TCHAR lpData[255]; << outch!
sz == string zero terminated
w == word
dw == double word
etc...
// je vois bien un LONG moi? et toi tu vois un « BOOL » hummm ...
LONG RegOpenKeyEx(
HKEY hKey, // handle to open key
LPCTSTR lpSubKey, // subkey name
DWORD ulOptions, // reserved
REGSAM samDesired, // security access mask
PHKEY phkResult // handle to open key
);
...
Return Values
If the function succeeds, the return value is ERROR_SUCCESS.
If the function fails, the return value is a nonzero error code defined in Winerror.h. You can use the FormatMessage function with the FORMAT_MESSAGE_FROM_SYSTEM flag to get a generic description of the error.
...
ce n'est pas compréhensible ...
ca va de gauche à droite, de droite à gauche, de haut en bas et de bas en haut, etc ...
de travers quoi!
LPTSTR QueryKey( ... )
{
// ...
return ("Err"); // == LPSTR et non LPTSTR
}
!?!?!?!?
si tu tiens absolument a retourne une chaine brute, LÀ tu peux utiliser « const »
int CreateKey( ... )
{
// ...
long rtn = 0;
// ...
return rtn; // pourquoi long->int !?!?!? c'est vraiment très dur a suivre ton code ...
// OUI, int et long sont souvent de même taille, mais PAS toujours
}
//-------- dans ton QueryKey()
strBuf = malloc(sizeof(lpcbData));
//retrouve la valeur de la cle
Res = RegQueryValueEx(result,lpSubKey,NULL,NULL,strBuf,&lpcbData);
if (Res == 0)
rtn = strBuf;
else
rtn = "Err";
return rtn;
HELLO!!!! tu as un malloc() juste au dessus!!! et tu fais un « return strBuf; » OU un « return "Err"; », dans la fonction appelante(celle qui appel QueryKey), comment fais-tu pour savoir si tu dois libérer la mémoire ou non!?!?!?!?!
cs_jean84
Messages postés449Date d'inscriptionjeudi 26 août 2004StatutMembreDernière intervention 5 mars 2009 30 mai 2006 à 17:59
Salut !
J'ai pas eu le temps de tout analyser comme il le fallait mais sa ma l'air bon dans son ensemble. C'est relativement clair, bien commente, je dirais que rien dans la presentation je trouve sa plutot cool... Ensuite je te cache pas que la chose qui m'a le plus intrigue est dans la gestion de la regedit a distance... que faut-il comme param pour pouvoir y acceder ?? J'imagine qu'il faut un nom d'util egalement non ??
31 mai 2006 à 12:32
vue que lpcbData est un DWORD ça av allouer 4 octets seulement
strBuf = malloc(lpcbData); est la bonne allocation
char *rtn; rtn est pas initialisé dans pas mal de cas
genre ici ltoa(*intBuf,rtn,10);
30 mai 2006 à 21:55
Il faudra upgrader ta source en rapport à ce qu'il a mis, des points très importants ont été relevés (gestion mémoire en 1er) et elle ne pourra donc pas rester longtemps dans cet état.
Bonne continuation.
30 mai 2006 à 20:09
L = Long
P = Pointeur
C = Constante
T = Text
STR = STRing
les TCHAR peuvent être soient « char » ou « wchar_t », toi tu mélange les deux
tu les utilise à la « random », des char/TCHAR/LPCTSTR/etc...
utilise les char OU les TCHAR mais pas les deux, surtout que tu ne n'utilise même pas l'UNICODE
les « long pointer » ne sont plus utiles, far/near c'est out
ton « LPCTSTR Node; //contient le nom du pc », change le pour « [L]PSTR Node; » ou encore
« char* Node; » !
PSTR LPSTR char*
PWSTR LPWSTR wchar_t*
PCSTR LPCSTR const char*
PCWSTR LPCWSTR const wchar_t*
#ifdef UNICODE
typedef WCHAR TCHAR;
typedef PWSTR PTSTR;
typedef LPWSTR LPTSTR;
typedef PCWSTR PCTSTR;
typedef LPCWSTR LPCTSTR;
#else
typedef CHAR TCHAR;
typedef PSTR PTSTR;
typedef LPSTR LPTSTR;
typedef PCSTR PCTSTR;
typedef LPCSTR LPCTSTR;
#endif
apparemment, tu ne connais pas la notation hongroise, celle utilisé par Microsoft
lp == long pointer >> TCHAR lpData[255]; << outch!
sz == string zero terminated
w == word
dw == double word
etc...
// je vois bien un LONG moi? et toi tu vois un « BOOL » hummm ...
LONG RegOpenKeyEx(
HKEY hKey, // handle to open key
LPCTSTR lpSubKey, // subkey name
DWORD ulOptions, // reserved
REGSAM samDesired, // security access mask
PHKEY phkResult // handle to open key
);
...
Return Values
If the function succeeds, the return value is ERROR_SUCCESS.
If the function fails, the return value is a nonzero error code defined in Winerror.h. You can use the FormatMessage function with the FORMAT_MESSAGE_FROM_SYSTEM flag to get a generic description of the error.
...
ce n'est pas compréhensible ...
ca va de gauche à droite, de droite à gauche, de haut en bas et de bas en haut, etc ...
de travers quoi!
LPTSTR QueryKey( ... )
{
// ...
return ("Err"); // == LPSTR et non LPTSTR
}
!?!?!?!?
si tu tiens absolument a retourne une chaine brute, LÀ tu peux utiliser « const »
LPCSTR QueryKey( ... )
//OU const char* QueryKey( ... )
{
// ...
return ("Err");
}
int CreateKey( ... )
{
// ...
long rtn = 0;
// ...
return rtn; // pourquoi long->int !?!?!? c'est vraiment très dur a suivre ton code ...
// OUI, int et long sont souvent de même taille, mais PAS toujours
}
//-------- dans ton QueryKey()
strBuf = malloc(sizeof(lpcbData));
//retrouve la valeur de la cle
Res = RegQueryValueEx(result,lpSubKey,NULL,NULL,strBuf,&lpcbData);
if (Res == 0)
rtn = strBuf;
else
rtn = "Err";
return rtn;
HELLO!!!! tu as un malloc() juste au dessus!!! et tu fais un « return strBuf; » OU un « return "Err"; », dans la fonction appelante(celle qui appel QueryKey), comment fais-tu pour savoir si tu dois libérer la mémoire ou non!?!?!?!?!
char* retval = QueryKey( ... );
if ( je_dois_libérer_la_mémoire ) {
free(retval);
}
else {
// rien
}
c'est pas fonctionnel ton truc ...
30 mai 2006 à 17:59
J'ai pas eu le temps de tout analyser comme il le fallait mais sa ma l'air bon dans son ensemble. C'est relativement clair, bien commente, je dirais que rien dans la presentation je trouve sa plutot cool... Ensuite je te cache pas que la chose qui m'a le plus intrigue est dans la gestion de la regedit a distance... que faut-il comme param pour pouvoir y acceder ?? J'imagine qu'il faut un nom d'util egalement non ??
Merci pour ta reponse
@++