bernddasbrot2
Goto Top

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

Content-Key: 115558

Url: https://administrator.de/contentid/115558

Printed on: April 25, 2024 at 11:04 o'clock

Member: mrtux
mrtux May 08, 2009 at 07:05:02 (UTC)
Goto Top
Hi !

Zitat von @BernddasBrot2:

Formatieren mit <"code"> Code </"code"> tut für Programmierer not und ist auch gut für Bernd das Brot face-smile

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
Mitglied: 76109
76109 May 08, 2009 at 10:13:55 (UTC)
Goto Top
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
Member: BernddasBrot2
BernddasBrot2 May 08, 2009 at 12:07:18 (UTC)
Goto Top
Ich weiss nicht, wie groß die ist. Ich denke mal, dass die noch den Standardwert hat. Ich wusste gar nicht, dass man der eine bestimmte Größe zuweisen kann.
Mitglied: 76109
76109 May 08, 2009, updated at Oct 18, 2012 at 16:38:09 (UTC)
Goto Top
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
Mitglied: 76109
76109 May 08, 2009 at 13:12:11 (UTC)
Goto Top
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.
Mitglied: 76109
76109 May 08, 2009 at 14:12:22 (UTC)
Goto Top
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
Member: BernddasBrot2
BernddasBrot2 May 08, 2009 at 14:34:18 (UTC)
Goto Top
Danke, ich hab jetzt den buf auf den Heap gelegt und das Paintstruct global deklariert. Jetzt funktioniert, ausser dass das Programm jetzt ständig ohne Angabe von Fehlern abstürzt.
Trotzdem danke, zu meiner Frage hast du mir ja gut geholfen face-smile