C++ DWORD na string

0
#include <iostream>
#include <Windows.h>

using namespace std;

int main()
{
    HKEY reg;
    long otworz_reg = RegOpenKeyEx(HKEY_LOCAL_MACHINE,"SOFTWARE\\Wow6432Node\\Bohemia Interactive Studio\\ArmA 2 OA",0,KEY_ALL_ACCESS,&reg);
    if(otworz_reg == ERROR_SUCCESS)
    {
        cout << "Dostep do rejestru - otrzymany!"
             << endl;
    }
    else
    {
        cout << "Dostep do rejestru - brak!"
             << endl;
    }


    DWORD key;
    DWORD dwSize = sizeof(DWORD);
    long wartosc_key = RegQueryValueEx(reg,"KEY",0,REG_NONE,(LPBYTE)key,&dwSize);
    if(wartosc_key == ERROR_SUCCESS)
    {

        cout << key
             << endl
             << endl;
    }
    else
    {
        cout << "Brak dostepu.";
    }
RegCloseKey(reg);
cin.get();
}

Problem jest taki, że wyświetla 0 - więc chyba potrzebuję konwersji DWORD na string.
Ktoś pomoże?
Lub jest inny sposób wyświetlenia wartości klucza?

0

Funkcja RegQueryValueEx oczekuje wskaźnika na bufor. Samo rzutowanie zmiennej na typ wskaźnikowy nie powoduje, że otrzymasz wskaźnik na ową zmienną. Dodaj tam &.

  1. Korzystasz z wersji ANSI API Windows? Dlaczego?
  2. Gdybyś użył porządnego kompilatora (albo porządnie go skonfigurował) to ten ostrzegłby cię przed użyciem niezainicjowanej zmiennej.
0
  1. Bo takie rozwiązanie znalazłem w przepięknym internecie.
  2. Code::Blocks + MinGW

Po dodaniu & nie otrzymuje dostępu.

0

(LPBYTE)&key
Taki kod na pewno nie działa? Jaki konkretnie błąd zwraca funkcja?

0

Nie błąd, wykonuje się funkcja else - brak dostępu.
Czyt. error_success zwraca fałsz.

0

Jakim cudem stała o jakiejś tam wartości może zwracać fałsz? Ale już nie czepiając się terminologii - jaką konkretnie wartość ma wartosc_key? Póki co, jedyny wniosek jaki możesz wyciągnąć to taki, że jakiś błąd jest, a nie, że konkretnie został zwrócony błąd braku dostępu.

Eh, to wyciąganie błędnych wniosków z niedomówień z internetowych tutoriali.

0

Chodziło mi o to, że wartosc_key nie zwraca error_success.
Jakieś pomysły co z tym zrobić?
Programik krótki, dużo nie robi.

0

Tak, możesz odpowiedzieć na moje wcześniejsze pytanie - który kod błędu zwraca funkcja RegQueryValueEx. Odpowiedź "nie ERROR_SUCCESS" jest niewystarczająca. Odpal debugger albo wyświetl wartosc_key na ekranie.

0
#include <iostream>
#include <Windows.h>


using namespace std;

int main()
{
    HKEY reg;
    long otworz_reg = RegOpenKeyEx(HKEY_LOCAL_MACHINE,"SOFTWARE\\Wow6432Node\\Bohemia Interactive Studio\\ArmA 2 OA",0,KEY_ALL_ACCESS,&reg);
    if(otworz_reg == ERROR_SUCCESS)
    {
        cout << "Dostep do rejestru - otrzymany!"
             << endl;
    }
    else
    {
        cout << "Dostep do rejestru - brak!"
             << endl;
    }


    DWORD key;
    DWORD dwSize = sizeof(DWORD);
    long wartosc_key = RegQueryValueEx(reg,"KEY",0,REG_NONE,(LPBYTE)&key,&dwSize);
    if(wartosc_key == ERROR_SUCCESS)
    {

        cout << key;

    }
    else
    {
        cout << "Brak dostepu.";
    }

    cout << endl << endl;
    cout << "wartosc_key: " << wartosc_key;

RegCloseKey(reg);
cin.get();
}

user image

0
MSDN napisał(a)

ERROR_MORE_DATA
234 (0xEA)
More data is available.

Brawo. Teraz już wiesz co to za błąd.

Jakiego typu w rejestrze jest klucz KEY?

0

REG_BINARY...

0

To dlaczego założyłeś, że wartość może się zmieścić w czterech bajtach?

Wywołaj RegQueryValueEx dwa razy. Najpierw raz, żeby uzyskać informację o wielkości potrzebnego bufora. Wartość tą otrzymasz w dwSize. Dokonaj alokacji buforu o odpowiednim rozmiarze i wywołaj funkcję drugi raz.

0
char key[20];
    DWORD dwSize = 20;
    long wartosc_key = RegQueryValueEx(reg,"KEY",0,&dwSize,(LPBYTE)&key,&dwSize);

user image

Zmieniłem swoje założenie - na 20.
Coś się da zrobić z tymi krzakami?

0

Zrób print screen tej wartości z edytora rejestru.

0

Ok, ogarnąłem i zrobiłem tak:

for (int x=0; x <20; x++)
        {
        cout << std::hex << (int)key[x] << endl;
        } 
0

No dobra, ze screena wynika, że są tam po prostu bajty, a nie jakiś konkretny napis. Chcesz wyświetlić je w postaci liczb szesnastkowych tak jak na podglądzie w edytorze rejestru? Użyj sprintf albo std::hex.

0

long otworz_reg = RegOpenKeyEx(HKEY_LOCAL_MACHINE,"SOFTWARE\Wow6432Node\Bohemia Interactive Studio\ArmA 2 OA",0,KEY_ALL_ACCESS,&reg);

Zakładasz na sztywno, że system jest 64-bitowy...

1 użytkowników online, w tym zalogowanych: 0, gości: 1