Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

llennard

Frischling

  • »llennard« ist der Autor dieses Themas

Beiträge: 74

Wohnort: Kiel

  • Private Nachricht senden

1

26.05.2005, 20:33

In Registry mit C++ schreiben

Hallo!

Ich würde gerne wissen, wier man in einem C++-Programm in die Registry schreibt.

Ich möchte nämlich dort eine Zeichenfolge im Key
[list]HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run[/list]erstellen, so dass Programme beim Systemstart gestartet werden.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

26.05.2005, 20:36

Hoffentlich kein Virus...
Schau Dir mal die Funktionen RegOpenKey, RegCreateKey und RegSetValue an (in der MSDN oder Dokumentation des Platform-SDKs).

koschka

Community-Fossil

Beiträge: 2 862

Wohnort: Dresden

Beruf: Student

  • Private Nachricht senden

3

26.05.2005, 21:26

hier ein kleines Codesniplet von mir:

liest allerdings nur aus der Registry. Dem ganzen einen Schreibzugriff hinzuzufügen is aber nicht schwer!

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
            // In der Registry nach Sudden Strike II suchen

            //---------------------------------------------------------------

            if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\CDV Software Entertainment AG\\Sudden Strike II\\German version",
                                            0, KEY_READ, &key) == ERROR_SUCCESS)
            {
                if(RegQueryValueEx(key, "target folder", NULL, &VarType, (LPBYTE)szBuffer[0], &BuffSize[0])
                                                                == ERROR_SUCCESS)
                {
                    SetDlgItemText(hWnd, ID_SUST2, (LPCSTR)szBuffer[0]);    
                }
            }
            RegCloseKey(key);

C-/C++-Quelltext

1
SetDlgItemText(...);
Ist dabei nur die Ausgabe

llennard

Frischling

  • »llennard« ist der Autor dieses Themas

Beiträge: 74

Wohnort: Kiel

  • Private Nachricht senden

4

27.05.2005, 18:37

Also ich bin jetzt so weit gekommen:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
#include <windows.h>
#include <string.h>
#include <winreg.h>

LRESULT CALLBACK WindowProc(HWND hwnd, 
                            UINT msg, 
                            WPARAM wparam, 
                            LPARAM lparam)
{

    PAINTSTRUCT     ps;     
    HDC             hdc;    


    
    switch(msg)
    {       
        case WM_CREATE: 
        {
        } 
        break;
   
        case WM_PAINT: 
        {          
            hdc = BeginPaint(hwnd,&ps);            
            EndPaint(hwnd,&ps);          
            return(0);
        }
        break;

        case WM_DESTROY: 
        {          
            PostQuitMessage(0);          
            return(0);
        } 
        break;

        default:
        break;

    } 
    return (DefWindowProc(hwnd, msg, wparam, lparam));

} 

///////////////////////////////////////////////////////////////////////////////


int WINAPI WinMain( HINSTANCE hinstance,
                    HINSTANCE hprevinstance,
                    LPSTR lpcmdline,
                    int ncmdshow)
{

    WNDCLASSEX winclass; 
    HWND       hwnd;     
    MSG        msg; 
    

    
    winclass.cbSize         = sizeof(WNDCLASSEX);
    winclass.style          = CS_HREDRAW | CS_VREDRAW;
    winclass.lpfnWndProc    = WindowProc;
    winclass.cbClsExtra     = 0;
    winclass.cbWndExtra     = 0;
    winclass.hInstance      = hinstance;
    winclass.hIcon          = LoadIcon(NULL, IDI_APPLICATION);
    winclass.hCursor        = LoadCursor(NULL, IDC_ARROW); 
    winclass.hbrBackground  = (HBRUSH)GetStockObject(BLACK_BRUSH);
    winclass.lpszMenuName   = NULL;
    winclass.lpszClassName  = "ww";
    winclass.hIconSm        = LoadIcon(NULL, IDI_APPLICATION);
   
    if (!RegisterClassEx(&winclass))
        return(0);

   
    if (!(hwnd = CreateWindowEx(NULL,                  
                                "ww",     
                                "My Game Shell", 
                                WS_OVERLAPPEDWINDOW,
                                0,0,      
                                1024,768,  
                                NULL,     
                                NULL,     
                                hinstance,
                                NULL))) 
    return(0);

    HKEY key;

    RegCreateKeyEx(
      HKEY_LOCAL_MACHINE,
      "\\Software\\Microsoft\\Windows\\CurrentVersion\\Run\\XY",
      NULL,
      "www",
      REG_OPTION_NON_VOLATILE,
      KEY_SET_VALUE,
      NULL,
      &key,
      REG_CREATED_NEW_KEY
    );

    char *string = "C:\\Dokumente und Einstellungen\\Lennard\\Eigene Dateien\\Eigene Programme\\Selbstgemacht\\Presentation\\Presentation.exe";

    RegSetValueEx(
      key,
      NULL,
      NULL,
      REG_SZ,
      string,
      strlen("C:\\Dokumente und Einstellungen\\Lennard\\Eigene Dateien\\Eigene Programme\\Selbstgemacht\\Presentation\\Presentation.exe") + 1
    );

    RegCloseKey(key);
}


Aber es gibt folgenden Fehler:


error C2664: 'RegCreateKeyExA' : Konvertierung des Parameters 9 von 'const long' in 'unsigned long *' nicht moeglich
Die Konvertierung eines ganzzahligen Typs in einen Zeigertyp erfordert ein reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat
error C2664: 'RegSetValueExA' : Konvertierung des Parameters 5 von 'char *' in 'const unsigned char *' nicht moeglich
Die Typen, auf die verwiesen wird, sind nicht verwandt; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat
Fehler beim Ausführen von cl.exe.

RegistryCreateKey.exe - 2 Fehler, 0 Warnung(en)



Was habe ich falsch gemacht?
Danke im Vorraus!

koschka

Community-Fossil

Beiträge: 2 862

Wohnort: Dresden

Beruf: Student

  • Private Nachricht senden

5

27.05.2005, 20:34

hier ist der richtige Code

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
    HKEY    key;
    DWORD   dwDisposition;

    RegCreateKeyEx(
      HKEY_LOCAL_MACHINE,
      "\\Software\\Microsoft\\Windows\\CurrentVersion\\Run\\XY",
      NULL,
      "www",
      REG_OPTION_NON_VOLATILE,
      KEY_SET_VALUE,
      NULL,
      &key,
      &dwDisposition
    );

    char *string = "C:\\Dokumente und Einstellungen\\Lennard\\Eigene Dateien\\Eigene Programme\\Selbstgemacht\\Presentation\\Presentation.exe";

    RegSetValueEx(
      key,
      NULL,
      NULL,
      REG_SZ,
      (LPBYTE)(LPTSTR)string,
      strlen("C:\\Dokumente und Einstellungen\\Lennard\\Eigene Dateien\\Eigene Programme\\Selbstgemacht\\Presentation\\Presentation.exe") + 1
    );


So gehts auf jedenfall zu kompilieren, ich weiss aber nichts obs auch klappt

Anonymous

unregistriert

6

29.05.2005, 13:15

In Registry schreiben ist das lameste was es gibt! Schäm dich!

Wer was von sich hält macht das nicht

koschka

Community-Fossil

Beiträge: 2 862

Wohnort: Dresden

Beruf: Student

  • Private Nachricht senden

7

29.05.2005, 15:11

würd ich nicht sagen.. z.B. Installer / Desinstaller führen Buch über die installierte Software. Sonst wäre ein Update ja auch nicht mgl. Sondern man müsste sich ständig das gesammte Packet runterladen etc.

Anonymous

unregistriert

8

29.05.2005, 15:34

Zitat von »"koschka"«

würd ich nicht sagen.. z.B. Installer / Desinstaller führen Buch über die installierte Software. Sonst wäre ein Update ja auch nicht mgl. Sondern man müsste sich ständig das gesammte Packet runterladen etc.
Quatsch! Denk doch mal nach!

Schonmal an ein Index-File gedacht?

Installer und Deinstaller, das ist immer noch die Beste Ausrede für die Benutzung der Registry. Seien wir mal ehrlich: Muss jedes grottige Spiel oder highend-spiel einen Registry eintrag haben? Nein. Muss jedes Game ein Installer haben? Nein. Muss man Updates haben? Eigentlich nicht, wenn die Coder mal anständig gearbeitet haben und WENN: Dann sicherlich nicht über die Registry!

Die ist nur für Windows und MS Programme da sowie für programme wo es unausweichlich ist! Aber NICHT für Spiele oder sonstigem Popelskram.

llennard

Frischling

  • »llennard« ist der Autor dieses Themas

Beiträge: 74

Wohnort: Kiel

  • Private Nachricht senden

9

29.05.2005, 20:32

Keine Beleidigungen!

Zitat von »"dedalus"«

In Registry schreiben ist das lameste was es gibt! Schäm dich!

Wer was von sich hält macht das nicht


Einen Virus schreiben will ich nicht.
Ich möchte nur in die Registry schreiben können, um solchen Programme machen zu können wie koschka schon beschrieben hat.

Und ganz so unnütz ist die Registry ja wohl nicht, sonst gäbe es sie nicht! ;)

llennard

Frischling

  • »llennard« ist der Autor dieses Themas

Beiträge: 74

Wohnort: Kiel

  • Private Nachricht senden

10

29.05.2005, 20:37

Funktioniert nicht!

Also um zum eigentlichen Thema zurückzukommen:

ich habe koschkas Änderungen eingebaut.
Der Schlüssel müsste doch jetzt XY heißen oder?

Aber wenn ich die EXE-Datei ausführe, passiert nichts in der Registry ...

Werbeanzeige