stack around the variable paintstruct ps was corrupted
Hi,
ich probier grad mit der Win32-API bisschen rum, und bekomm während das Programm läuft ständig diese bescheuerte Fehlermeldung vom Vista:
Stack around the variable 'ps' was corrupted.
ps ist bei mir ein Paintstruct. Normalerweise versteh ich den Fehler so, dass das Programm mehr speicher benötigt, als in der Variable reserviert wurde,
nur versteh ich nicht ganz, wie das bei einem Paintstruct passieren kann.
Ich poste euch mal den Quelltext:
#include <windows.h>
#include <stdio.h>
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
static TCHAR szAppName = TEXT("Win32");
HWND hwnd;
MSG msg;
WNDCLASS wndclass;
wndclass.style = CS_HREDRAW | CS_VREDRAW;
wndclass.lpfnWndProc = WndProc;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hInstance = hInstance;
wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
wndclass.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);
wndclass.lpszMenuName = NULL;
wndclass.lpszClassName = szAppName;
if(!RegisterClass(&wndclass))
{
MessageBox(NULL, TEXT("Programm arbeitet mit Unicode und setzt Windows NT voraus!"), szAppName, MB_ICONERROR);
return 0;
}
hwnd = CreateWindow(szAppName, TEXT(szAppName), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL);
ShowWindow(hwnd,iCmdShow);
UpdateWindow(hwnd);
while(GetMessage(&msg, hwnd, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static int cxChar, cyChar, cxCaps;
HDC hdc;
PAINTSTRUCT ps;
TCHAR szBuffer[10];
TEXTMETRIC tm;
char buf[256];
int i = 0;
int line = 0;
FILE *file;
switch(message)
{
case WM_CREATE:
hdc = GetDC(hwnd);
GetTextMetrics(hdc, &tm);
cxChar = tm.tmAveCharWidth;
cxCaps = (tm.tmPitchAndFamily & 1 ? 3 : 2) * cxChar / 2;
cyChar = tm.tmHeight + tm.tmExternalLeading;
ReleaseDC(hwnd, hdc);
return 0;
case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);
file = fopen("dat.dat", "r");
if(file == NULL)
{
MessageBox(hwnd, "Konnte Datei nicht öffnen!", "Error", MB_ICONERROR);
return 0;
}
while(buf[i] != EOF)
{
do
{
buf[i] = fgetc(file);
i++;
}while(buf[i] != EOF && (strcmp(buf, "x0xX0X") != 0));
if(strcmp(buf, "x0xX0X") != 0)
{
TextOut(hdc, 0, line*cyChar, buf, strlen(buf));
line++;
}
i=0;
}
fclose(file);
EndPaint(hwnd, &ps);
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd, message, wParam, lParam);
}
Hoffe, ihr könnt mir helfen.
Danke schon mal
Bernd
ich probier grad mit der Win32-API bisschen rum, und bekomm während das Programm läuft ständig diese bescheuerte Fehlermeldung vom Vista:
Stack around the variable 'ps' was corrupted.
ps ist bei mir ein Paintstruct. Normalerweise versteh ich den Fehler so, dass das Programm mehr speicher benötigt, als in der Variable reserviert wurde,
nur versteh ich nicht ganz, wie das bei einem Paintstruct passieren kann.
Ich poste euch mal den Quelltext:
#include <windows.h>
#include <stdio.h>
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
static TCHAR szAppName = TEXT("Win32");
HWND hwnd;
MSG msg;
WNDCLASS wndclass;
wndclass.style = CS_HREDRAW | CS_VREDRAW;
wndclass.lpfnWndProc = WndProc;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hInstance = hInstance;
wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
wndclass.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);
wndclass.lpszMenuName = NULL;
wndclass.lpszClassName = szAppName;
if(!RegisterClass(&wndclass))
{
MessageBox(NULL, TEXT("Programm arbeitet mit Unicode und setzt Windows NT voraus!"), szAppName, MB_ICONERROR);
return 0;
}
hwnd = CreateWindow(szAppName, TEXT(szAppName), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL);
ShowWindow(hwnd,iCmdShow);
UpdateWindow(hwnd);
while(GetMessage(&msg, hwnd, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static int cxChar, cyChar, cxCaps;
HDC hdc;
PAINTSTRUCT ps;
TCHAR szBuffer[10];
TEXTMETRIC tm;
char buf[256];
int i = 0;
int line = 0;
FILE *file;
switch(message)
{
case WM_CREATE:
hdc = GetDC(hwnd);
GetTextMetrics(hdc, &tm);
cxChar = tm.tmAveCharWidth;
cxCaps = (tm.tmPitchAndFamily & 1 ? 3 : 2) * cxChar / 2;
cyChar = tm.tmHeight + tm.tmExternalLeading;
ReleaseDC(hwnd, hdc);
return 0;
case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);
file = fopen("dat.dat", "r");
if(file == NULL)
{
MessageBox(hwnd, "Konnte Datei nicht öffnen!", "Error", MB_ICONERROR);
return 0;
}
while(buf[i] != EOF)
{
do
{
buf[i] = fgetc(file);
i++;
}while(buf[i] != EOF && (strcmp(buf, "x0xX0X") != 0));
if(strcmp(buf, "x0xX0X") != 0)
{
TextOut(hdc, 0, line*cyChar, buf, strlen(buf));
line++;
}
i=0;
}
fclose(file);
EndPaint(hwnd, &ps);
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd, message, wParam, lParam);
}
Hoffe, ihr könnt mir helfen.
Danke schon mal
Bernd
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 115558
Url: https://administrator.de/forum/stack-around-the-variable-paintstruct-ps-was-corrupted-115558.html
Ausgedruckt am: 23.12.2024 um 11:12 Uhr
7 Kommentare
Neuester Kommentar
Hi !
Formatieren mit <"code"> Code </"code"> tut für Programmierer not und ist auch gut für Bernd das Brot
guggst Du:
mrtux
Formatieren mit <"code"> Code </"code"> tut für Programmierer not und ist auch gut für Bernd das Brot
guggst Du:
static int cxChar, cyChar, cxCaps;
HDC hdc;
PAINTSTRUCT ps;
TCHAR szBuffer[10];
TEXTMETRIC tm;
char buf[256];
int i = 0;
int line = 0;
FILE *file;
mrtux
Hallo Bernd das Brot (?),
vermutlich reicht das sizeof(struct) nicht für die Datenmenge aus und zerschießt daher den Stack.
Oder die Stackvariable ist wirklich zu klein gesetzt? Wie groß ist die Struct? Wie groß ist der Stack?
Gruß Dieter
vermutlich reicht das sizeof(struct) nicht für die Datenmenge aus und zerschießt daher den Stack.
Oder die Stackvariable ist wirklich zu klein gesetzt? Wie groß ist die Struct? Wie groß ist der Stack?
Gruß Dieter
Hallo Bernd das Brot,
ja doch, die Variable ist in einer *.h definiert. Standard ist glaube ich 4096 Byte. Der Grund dafür ist, dass sich der Heap-Speicher (Malloc) direkt am Stackende befindet. Im Near-Modell [Code][Datensegment][Stack][Heap].
Ich habe schon über 15 Jahre nicht mehr mit "C" oder "C++" gearbeitet und kann im Moment keine genaue Angabe machen. Aber ich schau mal auf uralten CD's nach, ob ich noch was finde und gebe Dir dann Bescheid.
Falls die Struct sehr groß ist, dann rate ich die Struct Global zu definieren oder mit einem Struct-Pointer über Malloc Speicher anfordern.
Gruß Dieter
PS Im Zweifel sieh Dir mal diesen Link an: fread problem mit struct und Binärdatei
Beispiel von mir: Global oder Pointer
ja doch, die Variable ist in einer *.h definiert. Standard ist glaube ich 4096 Byte. Der Grund dafür ist, dass sich der Heap-Speicher (Malloc) direkt am Stackende befindet. Im Near-Modell [Code][Datensegment][Stack][Heap].
Ich habe schon über 15 Jahre nicht mehr mit "C" oder "C++" gearbeitet und kann im Moment keine genaue Angabe machen. Aber ich schau mal auf uralten CD's nach, ob ich noch was finde und gebe Dir dann Bescheid.
Falls die Struct sehr groß ist, dann rate ich die Struct Global zu definieren oder mit einem Struct-Pointer über Malloc Speicher anfordern.
Gruß Dieter
PS Im Zweifel sieh Dir mal diesen Link an: fread problem mit struct und Binärdatei
Beispiel von mir: Global oder Pointer
Hallo Bernd das Brot,
also, die Stack-Variable ist z.B in "STKLEN.C" definiert.
unsigned _stklen = 0x1000; /* Default stack size in bytes */
0x1000 = 4096 Byte
Gruß Dieter
PS. Diese Variable wird im StartUp-Code verwendet, um Stack-Größe entsprechend festzulegen.
Achtung: Wenn der Wert verändert wird, muss ein neues StartUp.Obj erstellt werden. Also besser Finger weg, wenn Deine Kenntnisse noch nicht so weitreichend sind.
also, die Stack-Variable ist z.B in "STKLEN.C" definiert.
unsigned _stklen = 0x1000; /* Default stack size in bytes */
0x1000 = 4096 Byte
Gruß Dieter
PS. Diese Variable wird im StartUp-Code verwendet, um Stack-Größe entsprechend festzulegen.
Achtung: Wenn der Wert verändert wird, muss ein neues StartUp.Obj erstellt werden. Also besser Finger weg, wenn Deine Kenntnisse noch nicht so weitreichend sind.
Hallo nochmal,
ich habe mir grad Deinen Code nochmal angesehen und festgestellt, dass Du alle Variblen auf dem Stack definierst. Dafür ist der Stack nicht gedacht. Zu viel Speicherplatz für den Stack. Der Stack dient hauptsächlich der Übergabe von Argumenten bei Aufrufen von Subroutinen und kleineren Variablendefinitionen jede Menge Structs, buf[256].... alles in allem ist das zuviel des Guten. Du musst auch bedenken das Hintergrundfunktionen z.B IR's etc. den Stack teilweise mit benutzen. Entweder große Variablen Global definieren oder Speicher z.B. mit Malloc auf dem Heap belegen.
Gruß Dieter
ich habe mir grad Deinen Code nochmal angesehen und festgestellt, dass Du alle Variblen auf dem Stack definierst. Dafür ist der Stack nicht gedacht. Zu viel Speicherplatz für den Stack. Der Stack dient hauptsächlich der Übergabe von Argumenten bei Aufrufen von Subroutinen und kleineren Variablendefinitionen jede Menge Structs, buf[256].... alles in allem ist das zuviel des Guten. Du musst auch bedenken das Hintergrundfunktionen z.B IR's etc. den Stack teilweise mit benutzen. Entweder große Variablen Global definieren oder Speicher z.B. mit Malloc auf dem Heap belegen.
Gruß Dieter