Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

stack around the variable paintstruct ps was corrupted

Frage Entwicklung C und C++

Mitglied: BernddasBrot2

BernddasBrot2 (Level 1) - Jetzt verbinden

08.05.2009, aktualisiert 18.10.2012, 5797 Aufrufe, 7 Kommentare

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
Mitglied: mrtux
08.05.2009 um 09:05 Uhr
Hi !

Zitat von BernddasBrot2:

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

guggst Du:

01.
static int cxChar, cyChar, cxCaps; 
02.
HDC hdc; 
03.
PAINTSTRUCT ps; 
04.
TCHAR szBuffer[10]; 
05.
TEXTMETRIC tm; 
06.
char buf[256]; 
07.
int i = 0; 
08.
int line = 0; 
09.
FILE *file;
mrtux
Bitte warten ..
Mitglied: 76109
08.05.2009 um 12:13 Uhr
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
Bitte warten ..
Mitglied: BernddasBrot2
08.05.2009 um 14:07 Uhr
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.
Bitte warten ..
Mitglied: 76109
08.05.2009, aktualisiert 18.10.2012
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: http://www.administrator.de/forum/fread-problem-mit-struct-und-bin%c3%a ...
Beispiel von mir: Global oder Pointer
Bitte warten ..
Mitglied: 76109
08.05.2009 um 15:12 Uhr
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.
Bitte warten ..
Mitglied: 76109
08.05.2009 um 16:12 Uhr
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
Bitte warten ..
Mitglied: BernddasBrot2
08.05.2009 um 16:34 Uhr
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
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(1)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
JavaScript
AngularJS Variable über Input in Funktion ausführen

Frage von badkilla zum Thema JavaScript ...

Batch & Shell
Batch-Variable nach Stichworten aus TXT Datei durchsuchen (3)

Frage von Markus5579 zum Thema Batch & Shell ...

Exchange Server
gelöst Kontaktliste in Userpostfach importieren via PS (17)

Frage von atk691 zum Thema Exchange Server ...

Batch & Shell
gelöst Selected Gridview Value in Variable schreiben (4)

Frage von reissaus73 zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
LAN, WAN, Wireless
gelöst Server erkennt Client nicht wenn er ausserhalb des DHCP Pools liegt (28)

Frage von Mar-west zum Thema LAN, WAN, Wireless ...

Outlook & Mail
Outlook 2010 findet ost datei nicht (18)

Frage von Floh21 zum Thema Outlook & Mail ...

Windows Server
Server 2008R2 startet nicht mehr (Bad Patch 0xa) (18)

Frage von Haures zum Thema Windows Server ...