Avatar billede bif_pin Nybegynder
30. juli 2003 - 17:13 Der er 6 kommentarer og
2 løsninger

winreg.h

Jeg skal arbejde med winreg.h heather filen med c++.

Jeg skal åbne en nøgle og aflæse resultater fra den. Jeg har søgt på nettet men de kodeeksempler er meget uoverskuelige.

Derfor søger jeg et simpelt lille kode program i c++ som VHA winreg.h, åbner en nøgle og henter dens værdi fra registreringsdatabasen.

På forhånd tak.

MVH Tom.
Avatar billede soreno Praktikant
30. juli 2003 - 17:25 #1
Følgende virker:

#include <windows.h>
#include <stdio.h>

void getInstalledSoftware(char *info)
{
  HKEY hKey_root;
  long hKey_root_result;

  hKey_root_result = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall", 0, KEY_ENUMERATE_SUB_KEYS, &hKey_root);

  if(hKey_root_result == ERROR_SUCCESS)
  {
      int counter = 0;
      char buffer[1024] = "";

      while(RegEnumKey(hKey_root, counter, buffer, sizeof(buffer)) == ERROR_SUCCESS)
      {
        HKEY hKey_query;
        long hKey_query_result;
        char hKey_query_buffer[1024];
        DWORD hKey_query_buffer_size = sizeof(hKey_query_buffer);
        hKey_query_result = RegOpenKeyEx(hKey_root, buffer, 0, KEY_QUERY_VALUE, &hKey_query);
        if(hKey_query_result == ERROR_SUCCESS)
        {
            long DisplayName_result;
            long UninstallString_result;
            DisplayName_result = RegQueryValueEx(hKey_query, "DisplayName", 0, 0, (LPBYTE)&hKey_query_buffer, &hKey_query_buffer_size);
            UninstallString_result = RegQueryValueEx(hKey_query, "UninstallString", 0, 0, 0, 0);
            if((DisplayName_result == ERROR_SUCCESS) && (UninstallString_result == ERROR_SUCCESS))
            {
              strcat(info, "\r\n<name>");
              strcat(info, hKey_query_buffer);
              strcat(info, "</name>");
            }
        }
        counter++;
        RegCloseKey(hKey_query);
      }
  }
  RegCloseKey(hKey_root);
}


int main(int argc, char **argv)
{
    char buffer[12345];
    getInstalledSoftware(buffer);
    printf("%s\n", buffer);
    return 0;
}


windows.h includer winreg.h
:-)
Avatar billede driis Nybegynder
30. juli 2003 - 17:40 #2
#include <windows.h>
#include <iostream>

using namespace std ;

int main()
{
    HKEY key ;
    long ans ;
    DWORD i = 0,
        type = 0,
        bcVal = 1024,
        bcName = 1024 ;
    char valName[1024] = {0} ;
    char value[1024] ={0}    ;

    // Åben HKLM\Software\Microsoft\Windows\CurrentVersion\Run nøglen
    ans = RegOpenKeyEx(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\Run",
        0,KEY_READ | KEY_QUERY_VALUE,&key) ;

    if ( ans == ERROR_SUCCESS )
    {
        while ( ans == ERROR_SUCCESS )
        {
            ans = RegEnumValue(key,i,valName,&bcName,0,&type,(BYTE *)value,&bcVal) ;
            if ( type == REG_SZ && ans == ERROR_SUCCESS )
                cout << i+1 << "  " << valName << " = " << value << endl ;
            bcVal = bcName = 1024 ;
            i++ ;
        }
        RegCloseKey(key) ;
    }else
    {
        cout << "Der opstod en fejl!\n" ;
    }

    return 0 ;
}
Avatar billede driis Nybegynder
30. juli 2003 - 17:43 #3
Ups, undskyld soreno, havde ikke set at du allerede have postet et eksempel.

bif_pin >> Sig til hvis du skal have dyberegående forklaring til koden. Men fremgangsmåden i min kode er flg.:
1) Åben en nøgle med RegOpenKeyEx
2) Enumerer alle værdier i nøglen
3) Alle værdier der har typen REG_SZ (dvs. nul-termineret tekststreng) udskrives med navn og værdi
4) Husk at lukke nøglen med RegCloseKey

Syntaks til funktionerne kan findes på MSDN Library
http://msdn.microsoft.com/library
Avatar billede bif_pin Nybegynder
30. juli 2003 - 21:09 #4
I skal have mange tak for jeres eksempler begge to og i skal begge to få points for det.

Men "driis" jeg vil meget gerne have uddybet det lidt.
Jeg har arbejdet lidt med "registry.hpp" fra borland og det var meget mere simpelt. Men den findes ikke i VST.NET. I dit eksempel bruges nogle datatyper som jeg ikke forstår og så sættes der en række parametre i funktionerne som også meget gerne må uddybes lidt hvis du har tid.

Jeg skal netop bruge en REG_MULTI_SZ værdi så jeg var glad for du valgte denne type i dit eksempel.

Måske en af jer også ved hvordan jeg får udskrevet alle undernøgler under en bestemt nøgle?

Ved i om der findes en bog hvor man kan læse mere om programmering i registreeingsdatabasen i c++?
Eller måske noget litartur på nettet.

MVH Tom
Avatar billede driis Nybegynder
30. juli 2003 - 21:43 #5
RegOpenKeyEx åbner en nøgle. Første parameter er en handle til en allerede åben nøgle, eller en af de forud definerede hovednøgler, HKEY_LOCAL_MACHINE, HKEY_CURRENT_USER, osv. 2. parameter er stien til nøglen der skal åbnes. 3. parameter er reserveret og skal være 0, 4 parameter angiver hvilken adgang der opnås til nøglen, mens 5. parameter er en pointer til en HKEY ( handle til en nøgle ), som udfyldes med et handle til den åbnede nøgle.

RegEnumValue enumererer værdier. Første parameter er en handle til en i forvejen åbnet nøgle, 2. parameter er indekset (dvs. vi læser værdi nummer i), valName og value er pointere til strenge hvor vi lægger henholdsvis navnet på værdien og selve værdien ned. bcName og bcVal skal indeholde størrelsen i bytes af hhv. valName og value. 0'et i funktionskaldet er igen en reserveret værdi. &type bliver udfyldt med den type værdi, du har læst.

For at læse undernøgler, skal du bruge RegEnumKeyEx

Du bør læse : (Hvis du tager dig tid til at læse hele beskrivelsen er det ikke så forvirrende og besværligt som det ser ud. Her kan du også klikke dig videre og se datatypernes definition, etc.)
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/sysinfo/base/registry_functions.asp
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/sysinfo/base/regenumkeyex.asp
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/sysinfo/base/regopenkeyex.asp
Avatar billede driis Nybegynder
06. august 2003 - 16:44 #6
bif_pin >> Har du brug for mere hjælp ? Ellers synes jeg du skulle lukke spørgsmålet.
Avatar billede bif_pin Nybegynder
20. august 2003 - 07:54 #7
Jeg b
Avatar billede bif_pin Nybegynder
20. august 2003 - 07:55 #8
jeg beklager ventetiden men her får i jeres velfortjente points.

Mange tak for jeres hjælp og en speciel tak til dig driis.

MVH Tom
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester