Merci bcp!
-------------------------------
Réponse au message :
-------------------------------
> Voila un exemple complet que tu peux recompiler, 1 seul fichier cpp. Lance exe, il te fait un fichier dans lequel il enumer cles et valeurs de HKEY_CURRENT_USER Control Panel\\Desktop.
> Tu t'en inspireras, RegQueryInfoKey et RegEnumValue sont employes.
>
> #include <windows.h>
>
> HANDLE m_hFile = INVALID_HANDLE_VALUE;
>
> BOOL FileExists(const char* pFile)
> {
> WIN32_FIND_DATA fStruct;
> HANDLE hFile = FindFirstFile(pFile, &fStruct);
> if(hFile == INVALID_HANDLE_VALUE) return 0;
> FindClose(hFile); return 1;
> }
>
> void AppPathInitialize()
> {
> char szThis[300];
> char* c = szThis + GetModuleFileName(NULL, szThis, 300);
> while(*--c != '\\') *c = 0;
> SetCurrentDirectory(szThis);
> }
>
> void MsgProbemSystem(const char* pszMsg)
> {
> MessageBox(0, pszMsg, "ERREUR", MB_ICONEXCLAMATION);
> }
>
> void QueryKeyValues(HANDLE hFile, HKEY hKey)
> {
> DWORD dwSubKeysCount = 0;
> DWORD dwMaxSubKeyLen;
> DWORD dwValuesCount;
> DWORD dwMaxValueNameLen;
> DWORD dwMaxValueDataLen;
> char szValueName[MAX_PATH];
> DWORD dwValueLen = MAX_PATH;
> char szBuff[MAX_PATH + 25], szCRLF[] = "\r\n";
> DWORD dwWrite, dwType, dwDataLen;
> DWORD i, j, dwRet;
> BYTE *pbData = 0;
> if(ERROR_SUCCESS != RegQueryInfoKey(hKey, 0, 0, NULL,
> &dwSubKeysCount,
> &dwMaxSubKeyLen,
> 0,
> &dwValuesCount,
> &dwMaxValueNameLen,
> &dwMaxValueDataLen,
> 0, 0)) return;
>
> dwMaxValueDataLen++;
> if((pbData = (BYTE*)malloc(dwMaxValueDataLen)) == NULL) {
> MsgProbemSystem("Problème mémoire"); return;
> }
> if(dwSubKeysCount) {
> i = 0; strcpy(szBuff, " ");
> ultoa(dwSubKeysCount, szBuff + 5, 10); strcat(szBuff, " SubKeys:");
> strcat(szBuff, szCRLF);
> WriteFile(hFile, szBuff, strlen(szBuff), &dwWrite, NULL);
> while((i < dwSubKeysCount) && (ERROR_SUCCESS == RegEnumKey(hKey, i++, szBuff, MAX_PATH))) {
> strcat(szBuff, szCRLF);
> WriteFile(hFile, szBuff, strlen(szBuff), &dwWrite, NULL);
> }
> WriteFile(hFile, szCRLF, 2, &dwWrite, NULL);
> }
> if(dwValuesCount) {
> for(i = 0, dwRet = ERROR_SUCCESS; i < dwValuesCount; i++) {
> dwValueLen = MAX_PATH; szValueName[0] = 0;
> dwDataLen = dwMaxValueDataLen; szBuff[0] = 0;
> dwRet = RegEnumValue(hKey, i, szValueName, &dwValueLen,
> NULL, &dwType, pbData, &dwDataLen);
>
> if(!strlen(szValueName)) strcpy(szValueName, "<NO NAME>");
> wsprintf(szBuff, "%d) %s ", i, szValueName);
>
> if(dwRet == ERROR_SUCCESS) {
> WriteFile(hFile, szBuff, strlen(szBuff), &dwWrite, NULL);
> if(dwType == REG_DWORD) {
> WriteFile(hFile, "(REG_DWORD) ", 12, &dwWrite, NULL);
> dwType = MAKELONG(MAKEWORD(pbData[0], pbData[1]), MAKEWORD(pbData[2], pbData[3]));
> ultoa(dwType, szBuff, 10);
> WriteFile(hFile, szBuff, strlen(szBuff), &dwWrite, NULL);
> }
> else if(dwType == REG_BINARY) {
> WriteFile(hFile, "(REG_BINARY) ", 13, &dwWrite, NULL);
> for(j = 0; j < dwDataLen; j++) {
> wsprintf(szBuff, "%.2x ", pbData[j]);
> WriteFile(hFile, szBuff, strlen(szBuff), &dwWrite, NULL);
> }
> }
> else WriteFile(hFile, pbData, dwDataLen, &dwWrite, NULL);
> WriteFile(hFile, szCRLF, 2, &dwWrite, NULL);
> }
> else {
> strcat(szBuff, " ERREUR\r\n");
> WriteFile(hFile, "ERREUR", strlen(szBuff), &dwWrite, NULL);
> }
> }
>
> }
> if(pbData) free(pbData);
> }
>
> int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, PSTR szCmdLine, int iCmdShow)
> {
> char szFile[] = "AnalyReg.txt";
> AppPathInitialize();
> if(FileExists(szFile)) {
> if(IDOK != MessageBox(0, "Ce fichier existe déjà\nFaut-il le remplacer",
> szFile, MB_ICONQUESTION | MB_OKCANCEL)) return 0;
> }
> HANDLE hFile = CreateFile(szFile, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,
> FILE_FLAG_SEQUENTIAL_SCAN, NULL);
> if(hFile == INVALID_HANDLE_VALUE) {
> MsgProbemSystem("Problème avec le système de fichiers"); return 0;
> }
> HKEY hKey;
> if(RegOpenKeyEx(HKEY_CURRENT_USER, "Control Panel\\Desktop",
> 0, KEY_ALL_ACCESS, &hKey) == ERROR_SUCCESS) {
> QueryKeyValues(hFile, hKey);
> }
> CloseHandle(hFile);
> return 0;
> }
>
> BruNews, ciao...
>
>
> -------------------------------
> Réponse au message :
> -------------------------------
>
> > Ok, ca marche.
> > Merci pour cette reponse tres rapide!
> > par contre je viens de me rendre contre qu'il manque toujours le dernier caractere dans szListe(qui contient le nom de la cle).
> > Pour mon tableau est suffisamment grand, a quoi peut etre du ce probleme?
> >
> >
> >
> > -------------------------------
> > Réponse au message :
> > -------------------------------
> >
> > > et bien sers toi de ultoa() en base 16.
> > > Pour un REG_DWORD tu recois bien sur un nombre en binaire, faut simplement le transformer en ASCII pour affichage.
> > > BruNews, ciao...
> > >
> > >
> > > -------------------------------
> > > Réponse au message :
> > > -------------------------------
> > >
> > > > Lorsque je recupere la valeur d'une clé avec RegEnumValue,
> > > > celle-ci doit etre stockée dans un BYTE.
> > > >
> > > > Quand le type de la valeur recupérée est un REG_SZ, y'a pas de probleme,
> > > > mais si c'est un REG_DWORD alors je n'arrive a lire la valeur.
> > > >
> > > > En debuggant, et en activant l'affichage en hexadecimal(VC6), je peux lire cette valeur sous forme hexadecimale, mais si je veux copier le contenu du BYTE -disons dans un fichier ou simplement une messagebox- alors j'obtiens des carcteres speciaux comme des petits carres tout noirs.
> > > >
> > > > Bon en fait, ce que je voudrais c'est pouvoir convertir ces caracteres speciaux de BYTE en Hexadecimal (ou decimal),comme affiche VC6 en mode debug.
> > > >
> > > > Je sais c pas tres clair, mais c'est pas evident a explique

> > > >
> > > >
> > > > DWORD j=0; > > > > char szListe[255]; > > > > DWORD j=0; > > > > DWORD dwSize=sizeof(szListe); > > > > DWORD dwType; > > > > BYTE bData[255]; > > > > DWORD dwSizeData=sizeof(bData); > > > > > > > > if(!RegEnumValue(hKey,j,szListe,&dwSize,0,&dwType,bData,&dwSizeData)); > > > > //code > > > > ... > > > > |
> > >
> >
>