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

1

08.02.2011, 23:10

Listing 10.4 klappt nicht

Hallo erstmal,

habe mich gerade eben erst angemeldet;)


ich habe folgendes problem..

C-/C++-Quelltext

1
2
3
4
5
6
7
8
case ID_OKBUTTON:
                {
                    wchar_t szText[256];
                    GetWindowText(hEdit,szText,wcslen(szText));
                    SetWindowText(hText,szText);
                    return (0);

                }




die Variable szText bekommt keinen Wert habe es mit dem debugger durchlafuen lassen und es kommt die meldung bad ptr

in der Ausgabe stand folgende meldung " 0xC0000005: Zugriffsverletzung beim Schreiben an Position"

suche jetzt schon seit einigen tagen in foren und google nach einer antwort.. leider ohne erfolg

wäre froh wenn mir jemand helfen könnte

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

08.02.2011, 23:34

Das Problem ist dass wcslen(szText) wohl einen falschen Wert liefert da dein szText nicht nullterminiert ist. Die Größe des Buffers kennst du aber, die ist nämlich 256, das wcslen() ist also eh umsonst ;)

Btw: Wenn du direkt mit Unicode arbeitest würde ich empfehlen auch direkt die Unicode Funktionen der WinAPI zu verwenden, also in dem Fall GetWindowTextW() und SetWindowTextW().

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »dot« (08.02.2011, 23:40)


3

09.02.2011, 00:17

erstmal danke für die schnelle antwort :)

habe den code entsprechend abgeändert

C-/C++-Quelltext

1
2
3
4
5
6
7
8
case ID_OKBUTTON:
                {
                    wchar_t szText[256];
                    GetWindowTextW(hEdit,szText,256);
                    SetWindowTextW(hText,szText);
                    return (0);

                }


es kommt jedoch immer noch das selbe heraus

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

09.02.2011, 10:01

Bist du dir sicher dass der Fehler in dieser Zeile auftritt? Wie hast du das festgestellt?

5

09.02.2011, 12:50

Habe es mit dem debugger durchlaufen lassen und mir den wert der variable an dieser stelle angeschaut, da sie ja nur dort verändert wird.
Einmmal so (daher auch noch das wcslen():))

C-/C++-Quelltext

1
2
3
4
5
6
7
8
case ID_OKBUTTON:
                {
                    LPWSTR szText=L"";
                    GetWindowTextW(hEdit,szText,wcslen(szText));
                    SetWindowTextW(hText,szText);
                    return (0);

                }

mit diesem Ergebnis:

sz Text (Wert)0xccccccccccc<BadPtr>
CXX0030Ausdruck kann nicht ausgewertet werden

und mit dem Code:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
case ID_OKBUTTON:
                {
                    wchar_t szText[10];
                    GetWindowTextW(hEdit,szText,10);
                    SetWindowTextW(hText,szText);
                    return (0);

                }

mit diesem Ergebnis:

hEdit (Wert)0x0000000000{unused=???}
CXX0030Ausdruck kann nicht ausgewertet werden


Wenn es das nicht ist hab ich garkeine Ahnung:(






dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

6

09.02.2011, 12:59

C-/C++-Quelltext

1
LPWSTR szText=L"";

Überleg mal was das tut und warum das keine gute Idee ist diesen Pointer dann an GetWindowText() zu übergeben ;)
Aber abgesehen davon ist hEdit 0 und somit unbrauchbar...

7

09.02.2011, 13:47

Das ist ja was ich nicht verstehe ??? Warum ist hEdit 0 ?

Es steht definitiv etwas in dem Feld.
Wieso kann das nicht ausgewertet werden?

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

8

09.02.2011, 13:54

Das ist ja was ich nicht verstehe ??? Warum ist hEdit 0 ?

Das kann ich dir basierend auf dem kleinen Codeausschnitt den du da gepostet hast leider auch nicht beantworten. Fakt ist dass es 0 ist. Warum kann ich dir nur sagen wenn du mir mehr Code zeigst.

Es steht definitiv etwas in dem Feld.
Wieso kann das nicht ausgewertet werden?

Die beiden Variablen haben ungültige Werte, darum kann da auch nichts ausgewertet werden ;)

9

09.02.2011, 14:01

Hier ist der gesammte Code

Danke schon mal das du dir die Zeit nimmst das anzuschaun :) Bin echt am verzweifeln

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
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
#include<Windows.h>

#define ID_STATICTEXT 4000
#define ID_OKBUTTON   4001
#define ID_EDIT     4002

HWND hEdit;
HWND hText;
HWND hButton;
HWND hEditBox;

//Prototyp callback
//
LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
HWND CreateMainWindow (HINSTANCE hInst);
void CreateElements (HWND hWnd, HINSTANCE hInst);



int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpcmdline, int ncmdshow){
    HWND hWnd;  //Fenster-handle
    
    MSG message;//nachrichten

    hWnd = CreateMainWindow(hInst); ///Fenster
    CreateElements(hWnd, hInst);    ///und Elemente
    
    /////////////////////////
    //Nachrichten
    //
    while(GetMessage(&message,NULL,0,0)){
        TranslateMessage (&message);
        DispatchMessage (&message);
    }
    
    return (int) (message.wParam);
}

HWND CreateMainWindow (HINSTANCE hInst){
    HWND hWnd;
    WNDCLASSEX windowclass; //struktur für fenstereigenschaften

    
    wchar_t *szClassName = L"my first";///SCHREIBWEISE !!! muss wchar_t *string sein UNICODE

    ///Struktureigenschaften
    ///
    //Größe der Struktur
    windowclass.cbSize = sizeof (WNDCLASSEX);
    //Beim verschieben neu zeichnen
    windowclass.style = CS_HREDRAW | CS_VREDRAW;
    //Zeiger callbackfct
    windowclass.lpfnWndProc = WindowProc;
    //Keine Extras
    windowclass.cbClsExtra =0;
    windowclass.cbWndExtra =0;

    //instanz speichern 
    windowclass.hInstance = hInst;

    //icons und cursor
    windowclass.hIcon =   LoadIcon(NULL, IDI_QUESTION);
    windowclass.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
    windowclass.hCursor = LoadCursor(NULL, IDC_ARROW);

    //Hintergrundfarbe
    windowclass.hbrBackground=(HBRUSH)COLOR_BACKGROUND+1;

    //MENU(keins)
    windowclass.lpszMenuName = NULL;

    //KlassenName angeben
    windowclass.lpszClassName = szClassName;

    //Klasse registrieren
    if(!RegisterClassEx(&windowclass))
        return 0;
    
    //Fenster erzeugen
    //
    hWnd = CreateWindowEx   (NULL,
                            szClassName,
                            szClassName,
                            WS_OVERLAPPEDWINDOW | WS_VISIBLE,
                            CW_USEDEFAULT,CW_USEDEFAULT,
                            800,600,
                            NULL,
                            NULL,
                            hInst,
                            NULL);
            return(hWnd);
}


LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){
    switch(message)
    {
    case WM_DESTROY:
        {
            PostQuitMessage(0);
            return(0);
        }
    case WM_COMMAND:
        {
            switch(wParam)
            {
            case ID_OKBUTTON:
                {
                    wchar_t szText[10]; 
                    GetWindowTextW(hEdit,szText,10);
                    SetWindowTextW(hText,szText);
                    return (0);
                }
            }
        }
    case WM_KEYDOWN:
        {
            switch(wParam)
            {
            case VK_ESCAPE:
                {
                    if(MessageBox(hWnd,L"Wirklich verlassen",L"Wirklich",MB_YESNO | MB_ICONQUESTION)==IDYES)
                    {
                    PostQuitMessage(0);
                    return(0);
                    }
                }
            }
        }break;
    case WM_MBUTTONDOWN:
        {
            PostQuitMessage(0);
            return(0);
        
        }break;

    }

    return (DefWindowProc(hWnd, message, wParam, lParam));
}

void CreateElements (HWND hWnd, HINSTANCE hInst){
    ///Label//////////////////////////////////////////////////
    ///
    HWND hText;
    hText = CreateWindow    (L"STATIC",
                                L"Alter Text",
                                WS_VISIBLE | WS_CHILD,
                                10,10,
                                300,20,
                                hWnd,
                                (HMENU) ID_STATICTEXT,
                                hInst,
                                NULL);
                                
    ///OKButton/////////////////////////////////////////////////
    ///
    HWND hButton;
    hButton = CreateWindow  (L"BUTTON",
                                L"OK",
                                WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON,
                                200,400,
                                100,50,
                                hWnd,
                                (HMENU) ID_OKBUTTON,
                                hInst,
                                NULL);
    ///Edit//////////////////////////////////////////////////////   
    ///
    HWND hEdit;
    hEdit = CreateWindow    (L"EDIT",
                                L"Neuer Text",
                                WS_VISIBLE | WS_CHILD | WS_BORDER,
                                200,200,
                                300,190,
                                hWnd,
                                (HMENU) ID_EDIT,
                                hInst,
                                NULL);
                                
}

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

10

09.02.2011, 14:10

Dein globales hEdit bekommt nie einen Wert zugewiesen, in CreateElements() hast du eine lokale Variable die gleich heißt ;)
Die Sache mit den Unicode Funktionen gilt auch für CreateWindow, MessageBox, usw., also für alle Funktionen die irgendwelche strings nehmen. Ich würd dazu raten entweder direkt die Unicode Varianten, also z.B.:

C-/C++-Quelltext

1
2
3
4
hEdit = CreateWindowW(L"EDIT", L"Neuer Text", ...

wchar_t szText[10];
GetWindowTextW(hEdit,szText,10);

oder, wenn du es generisch halten willst, TCHAR und das TEXT() Makro zu verwenden:

C-/C++-Quelltext

1
2
3
4
hEdit = CreateWindow(TEXT("EDIT"), TEXT("Neuer Text"), ...

TCHAR szText[10];
GetWindowText(hEdit,szText,10);

Werbeanzeige