Registry Wert auslesen und in Variable speichern

08/17/2013 18:45 thosan123#1
Hi,

Ich kenne mich leider in C++ nicht so aus, aber würde halt gerne den Standard Wert eines Schlüssels in der Registry auslesen und diesen Wert dann in einer Variable speichern.

So weit bin ich momentan.

Code:
LONG WINAPI RegGetValue(HKEY hkey, LPCTSTR lpSubKey)
{
}
Und dann unten wenn ich auf einen Button klicke das
Code:
Label1->Caption=RegGetValue(HKEY_CLASSES_ROOT, "test");
Und ich bekomme nur eine Zahl, undwzar 1635820

Jemand Rat?
08/17/2013 19:03 Dr. Coxxy#2
lern die sprache, bitte...
BIIIIIITTEEEEEEEEEEE...

hier sind alle registry winapi funktionen aufgelistet:
[Only registered and activated users can see links. Click Here To Register...]

du darfst die funktion nicht selbst definieren, warnt dich da der compiler net schon?
08/17/2013 19:04 Delinquenz#3
Quote:
du darfst die funktion nicht selbst definieren, warnt dich da der compiler net schon?
Vermutlich wurde nicht einmal die Windows.h inkludiert :D
08/17/2013 19:14 thosan123#4
1. Compiler warnt nicht, nein
2. "#include <windows.h>" ist includiert.

Wenn ich es nicht selbst compile, dann kommt folgendes "Call to undefined function 'RegGetValue'"

P.S.: Danke für den Link, habe ich aber schon, hilfe mit nur nicht sonderlich ^^
08/17/2013 19:22 Tasiro#5
Gibt es einen Grund, warum du statt C++ diese Sprache namens "C++/CLI" nutzt?
Ist kein CLI, sieht nur auf den ersten Blick so aus.

Quote:
Originally Posted by thosan123 View Post
1. Compiler warnt nicht, nein
2. "#include <windows.h>" ist includiert.

Wenn ich es nicht selbst compile, dann kommt folgendes "Call to undefined function 'RegGetValue'"
Wo hast du in welcher Datei was inkludiert, und wo deine RegGetValue deklariert?

Quote:
Originally Posted by thosan123 View Post
P.S.: Danke für den Link, habe ich aber schon, hilfe mit nur nicht sonderlich ^^
In dem Link suchst du nach einem [Only registered and activated users can see links. Click Here To Register...], dem Link folgst du und liest dir die Seite durch. Wenn sie dir nicht geholfen hat, suchst du im Internet nach einem Beispiel mit Erklärung.
08/17/2013 19:37 thosan123#6
C++/CLI?
Was ist das? Wüsste ich nicht, das ich das verwende ;)

Ich nutze Borland C++ Builder 6 und dort ist standardmäßig bereits diese Datei eingebunden:
#include <vcl.h>

Und da drunter habe ich einfach dann diese Dateien eingebunden:
#include <strsafe.h>
#include <windows.h>
#include <stdio.h>


Und ein Beispiel habe ich leider noch nicht gefunden.
08/17/2013 23:25 Tasiro#7
Bitte verzeih, ich hatte Text statt Caption gelesen.

In C++ gibt es für die Dateien der C-Standardbibliothek entsprechende C++-Dateien, für stdio.h die Datei cstdio. Damit sind die Funktionen dann statt im globalen Namensraum im Namensraum std. Aber wozu brauchst du die Datei überhaupt?
08/17/2013 23:36 thosan123#8
Das ist ja nur ein Teil des Programms ;)
Der andere funktioniert problemlos, aber das auslesen will nicht, Einer eine Idee?
08/18/2013 00:08 Tasiro#9
MSDN:
Quote:
Return value

If the function succeeds, the return value is ERROR_SUCCESS.

If the function fails, the return value is a system error code.

If the pvData buffer is too small to receive the value, the function returns ERROR_MORE_DATA.
Wie gesagt, Seite durchlesen. Und die Funktion wird bereits in windows.h deklariert, also die eigene Funktion streichen.
08/18/2013 12:12 thosan123#10
Ich habe die Funktion bereits gestrichen, es geht aber nicht, es kommt dieser Fehler
Call to undefined function 'RegGetValue'

Eine Idee, woran es liegen könnte?
08/18/2013 15:15 MrSm!th#11
Poste doch einfach mal deinen Code und die genaue Fehlermeldung.
Meine Glaskugel hab ich dem letzten Anfänger gegen den Kopf geschmissen.
08/18/2013 15:52 thosan123#12
Hier der Code:

Code:
//---------------------------------------------------------------------------

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

#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
BOOL RegDelnodeRecurse (HKEY hKeyRoot, LPTSTR lpSubKey)
{
    LPTSTR lpEnd;
    LONG lResult;
    DWORD dwSize;
    TCHAR szName[MAX_PATH];
    HKEY hKey;
    FILETIME ftWrite;

    // First, see if we can delete the key without having
    // to recurse.

    lResult = RegDeleteKey(hKeyRoot, lpSubKey);

    if (lResult == ERROR_SUCCESS) 
        return TRUE;

    lResult = RegOpenKeyEx (hKeyRoot, lpSubKey, 0, KEY_READ, &hKey);

    if (lResult != ERROR_SUCCESS) 
    {
        if (lResult == ERROR_FILE_NOT_FOUND) {
            printf("Key not found.\n");
            return TRUE;
        } 
        else {
            printf("Error opening key.\n");
            return FALSE;
        }
    }

    // Check for an ending slash and add one if it is missing.

    lpEnd = lpSubKey + lstrlen(lpSubKey);

    if (*(lpEnd - 1) != TEXT('\\')) 
    {
        *lpEnd =  TEXT('\\');
        lpEnd++;
        *lpEnd =  TEXT('\0');
    }

    // Enumerate the keys

    dwSize = MAX_PATH;
    lResult = RegEnumKeyEx(hKey, 0, szName, &dwSize, NULL,
                           NULL, NULL, &ftWrite);

    if (lResult == ERROR_SUCCESS) 
    {
        do {

            StringCchCopy (lpEnd, MAX_PATH*2, szName);

            if (!RegDelnodeRecurse(hKeyRoot, lpSubKey)) {
                break;
            }

            dwSize = MAX_PATH;

            lResult = RegEnumKeyEx(hKey, 0, szName, &dwSize, NULL,
                                   NULL, NULL, &ftWrite);

        } while (lResult == ERROR_SUCCESS);
    }

    lpEnd--;
    *lpEnd = TEXT('\0');

    RegCloseKey (hKey);

    // Try again to delete the key.

    lResult = RegDeleteKey(hKeyRoot, lpSubKey);

    if (lResult == ERROR_SUCCESS) 
        return TRUE;

    return FALSE;
}

BOOL RegDelnode (HKEY hKeyRoot, LPTSTR lpSubKey)
{
    TCHAR szDelKey[MAX_PATH*2];

    StringCchCopy (szDelKey, MAX_PATH*2, lpSubKey);
    return RegDelnodeRecurse(hKeyRoot, szDelKey);

}

void __cdecl main()
{
   BOOL bSuccess;

   bSuccess = RegDelnode(HKEY_CURRENT_USER, TEXT("Software\\TestDir"));

   if(bSuccess)
      printf("Success!\n");
   else printf("Failure.\n");
}
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
RegDelnodeRecurse(HKEY_CLASSES_ROOT, ".test");
RegDelnodeRecurse(HKEY_CLASSES_ROOT, "test_auto_file");
RegDelnodeRecurse(HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\FileExts\\.test");
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button2Click(TObject *Sender)
{
Close();
}
//---------------------------------------------------------------------------


void __fastcall TForm1::Button3Click(TObject *Sender)
{
Label1->Caption=RegGetValue(HKEY_CLASSES_ROOT, "test");
}
//---------------------------------------------------------------------------
Und hier die Fehlermeldung:
Code:
[C++ Error] Unit1.cpp(138): E2268 Call to undefined function 'RegGetValue'
08/18/2013 19:05 Tasiro#13
Wie viel davon hast du selbst geschrieben? Moment, kommt mir das nur so vor, oder ist die RegDelnodeRecurse aus [Only registered and activated users can see links. Click Here To Register...] der deinen nur erstaunlich ähnlich? Jene main-Funktion ist auch interessant...

Davon abgesehen nutzt du die Funktion falsch. Du könntest nach einem Beispiel für die Verwendung von RegGetValue suchen und dann hier schreiben, ob sich damit Probleme ergeben (oder nicht) und wenn ja, welche. Dazu erstellst du am besten ein neues (Konsolen-)Projekt. Ich hoffe, damit verlange ich nicht zu viel...