Registry mit Visual Studio 2005 auslesen. Aber wie?

Fat-Z

Mitglied
Hey Leute, nach langer Zeit bin ich mal wieder im Forum unterwegs und zögere nicht daran, gleich wieder einmal eine dumme Frage zu stellen. ;-]

Ich möchte gerne einen Schlüssel in den Registry´s auslesen. Das einzige Problem ist dass ich nämlich den Code schon hier im Forum gefunden habe, aber er funktioniert nicht unter Visual Studio 2005 / C++. Viellecht kann ihn jemand umschreiben?!

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

int main(int argc, char **argv)
{
	unsigned char temp[99] = {""};	
	unsigned long size = sizeof(temp);
	HKEY hKey;
	
	RegOpenKey(HKEY_CURRENT_USER, "Software\\Microsoft\\MediaPlayer\\Setup\\CreatedLinks", &hKey);
	RegQueryValueEx(hKey, "AppName", NULL, NULL, temp, &size);
	RegCloseKey(hKey);
	printf("Value: %s (Size: %lu)\n", temp, size);
	return 0;
}

Wäre echt nett, wenn mir jemand helfen könnte! Danke im Voraus!

Gruss Fat-Z
 
Du schreibst leider nicht, was das Problem ist.

Entweder die Zugriffsrechte oder eher die Unicode-Einstellung. Stelle mal in deinen Projekt-Eigenschaften den Zeichensatz auf Multi-Byte Char Set statt Unicode.
 
Hey Endurion, das Problem ist dass ich nicht in Visual Studio 6 programmiere sondern in Visual Studio 2005. Irgendwie interpretiert er den Code in VS 2005 anders als in VS 6.
Der Code funktioniert ja auch in VS 6 aber warum funktioniert er nicht in VS 2005?

Ich hoffe dass ich das Problem jetzt so gut wie möglich beschrieben habe. ;)
 
Hallo,
ich hoffe doch schwer, dass du kein Windows-Projekt öffnest, sondern ein Konsolen-Projekt.
Denn solltest du ein Windows-Projekt öffnen, so wie ich es gemacht habe, bekommst du
einen Fehler:
Code:
unresolved external symbol _WinMain@16 referenced in function ___tmainCRTStartup
Das Problem ist ganz leicht gelöst:
Code:
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int iCmdShow);

Sollte es dann immer noch nicht gehen, würde ich mir gedanken über mein SDK machen, oder ob ich auch alle libraries mit "gelinkt" habe.
Eine library kann man mit den MS Visual Studio(s) so einbinden:
Code:
#pragma comment(lib,"library.lib")

Gruß Hallasas
 
Hey Hallasas,
danke für die Antwort. Selbstverständlich habe ich es als Konsolen-Projekt gemacht. Jedoch kommt dieser Fehler bein Kompilieren:

Code:
------ Build started: Project: RegKey, Configuration: Debug Win32 ------
Compiling...
RegKey.cpp
c:\*\visual studio 2005\projects\regkey\regkey\regkey.cpp(14) : error C2664: 'RegOpenKeyW' : cannot convert parameter 2 from 'const char [50]' to 'LPCWSTR'
        Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
c:\*\visual studio 2005\projects\regkey\regkey\regkey.cpp(15) : error C2664: 'RegQueryValueExW' : cannot convert parameter 2 from 'const char [8]' to 'LPCWSTR'
        Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
Build log was saved at "file://c:\*\Visual Studio 2005\Projects\RegKey\RegKey\Debug\BuildLog.htm"
RegKey - 2 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

Was mache ich falsch bzw. was müsste man ändern?!

Gruss Fat-Z
 
Du liest nicht richtig: Dein Projekt ist per Default Unicode, und ruft auch die Unicode-Versionen der Funktionen auf. Du mußt deine Klartexte dann auch als Unicode kennzeichnen:

Code:
RegOpenKey(HKEY_CURRENT_USER, L"Software\\Microsoft\\MediaPlayer\\Setup\\CreatedLinks", &hKey);    
RegQueryValueEx(hKey, L"AppName", NULL, NULL, temp, &size);

Oder eben in den Projekteigenschaften Unicode deaktiveren.
 
Ich möchte mich noch mal vielmals für euere Hilfe bedanken! :)
Nun habe ich endlich das erwünschte Resultat!

Für Leute die vllt. auch noch das Script bzw Scripte brauchen könnten.


Windows XP - CD-Key auslesen: (Visual Studio 2005)
C++:
#include "stdafx.h"
#include <windows.h>
#include <stdio.h>
#include <iostream> 

int main () { 
    //Zeichenvorrat Buchstaben,Ziffern ohne AEIOU01 (24) 
    UCHAR digits[] = {'B','C','D','F','G','H','J','K','M','P','Q','R','T','V','W','X','Y','2','3','4','6','7','8','9'}; 
    PUCHAR strresult = new UCHAR[26]; 
    PUCHAR buf = new UCHAR[200]; 
    
    HKEY key = NULL; 
    DWORD datasize = 200; 
    DWORD dwRet = 0; 

    ZeroMemory((PVOID)strresult,26); 

    dwRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion", 0, KEY_READ, &key);                       
    dwRet = RegQueryValueEx(key, L"DigitalProductID", NULL, NULL, (LPBYTE)buf, &datasize); 
    
    if (dwRet != ERROR_SUCCESS) { 
        return -1; 
    } 
    
    RegCloseKey(key); 

    for (int i=24;i>=0;i--) { 
        int x=0; 

        for (int j=14;j>=0;j--) { 
            x = (x<<8) + (buf+0x34)[j]; 
            (buf+0x34)[j] = x / 24; 
            x = x % 24; 
        } 
        strresult[i]=digits[x]; 
    } 
    
    std::cout << strresult; 
    
    std::cin.get();  
    return 0; 
}


Größe von Registryeinträgen anzeigen:
C++:
#include "stdafx.h"
#include <windows.h>
#include <stdio.h>
#include <iostream> 

int main(int argc, char **argv)
{
	unsigned char temp[99] = {""};	
	unsigned long size = sizeof(temp);
	HKEY hKey;
	
	RegOpenKey(HKEY_CURRENT_USER, L"Software\\Microsoft\\MediaPlayer\\Setup\\CreatedLinks", &hKey);
	RegQueryValueEx(hKey, L"AppName", NULL, NULL, temp, &size);
	RegCloseKey(hKey);
	printf("Value: %s (Size: %lu)\n", temp, size);
	return 0;
}


Mit freundlichen Grüssen
Fat-Z

.:: CLOSED ::.
 
Zuletzt bearbeitet von einem Moderator:
Zurück