Top-Themen

Aktuelle Themen (A bis Z)

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, 5859 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 ..
Ähnliche Inhalte
Microsoft
PS: Dateien in einem Ordner Umbenennen und nummerieren mit PS
gelöst Frage von PludanMicrosoft5 Kommentare

Hallo Ich möchte in einem Ordner die Fotos mit PowerShell umbenenne. Zum Beispiel in: Test 1.arw . Die Nummerierung ...

DSL, VDSL
Dual Stack Lite Problem
gelöst Frage von NePheusDSL, VDSL3 Kommentare

Hallo zusammen, ich habe auf meinem Synology NAS die FTP Funktion aktiviert, einen neuen Benutzer mit entsprechenden Rechten angelegt ...

Assembler
EBP im Stack speichern- wofür?
gelöst Frage von StefaOnAssembler1 Kommentar

In Anlehnung zum Artikel ( ) stellt sich mir folgende Frage: Wenn ich eine neue Funktion erstelle, macht er ...

Switche und Hubs
HP 2920-48G im Stack
gelöst Frage von AmistarSwitche und Hubs7 Kommentare

Hallo Liebe Community, ich bin zurück in der Welt der Switche und versuche gerade ein paar Sachen zu verstehen ...

Neue Wissensbeiträge
Viren und Trojaner

Deaktivierter Keylogger in HP Notebooks entdeckt

Information von bitcoin vor 11 StundenViren und Trojaner1 Kommentar

Ein Grund mehr warum man Vorinstallationen der Hersteller immer blank bügeln sollte Der deaktivierte Keylogger findet sich im vorinstallierten ...

Router & Routing

Lets Encrypt kommt auf die FritzBox

Information von bitcoin vor 15 StundenRouter & Routing

In der neuesten Labor-Version der FB7490 integriert AVM unter anderem einen Let's Encrypt Client für Zugriffe auf das Webinterface ...

Internet

Was nützt HTTPS, wenn es auch von Phishing Web-Seiten genutzt wird

Information von Penny.Cilin vor 3 TagenInternet17 Kommentare

HTTPS richtig einschätzen Ob man eine Webseite via HTTPS aufruft, zeigt ein Schloss neben der Adresse im Webbrowser an. ...

Webbrowser

Bugfix für Firefox Quantum released - Installation erfolgt teilweise nicht automatisch!

Erfahrungsbericht von Volchy vor 4 TagenWebbrowser8 Kommentare

Hallo zusammen, gem. dem Artike von heise online wurde mit VersionFirefox 57.0.1 sicherheitsrelevante Bugs behoben. Entgegen der aktuellen Veröffentlichung ...

Heiß diskutierte Inhalte
Batch & Shell
Trusted Sites für alle User auf dem PC einpflegen
Frage von xXTaKuZaXxBatch & Shell12 Kommentare

Aufgabestellung: Es sollen auf 1 PC (bzw. mehreren PCs) vertrauenswürdige Sites per Powershell eingetragen werden, die für alle User ...

Vmware
DOS 6.22 in VMWare mit CD-ROM
gelöst Frage von hesperVmware10 Kommentare

Hallo zusammen! Ich hab ein saublödes Problem. Es ist eine VMWare mit DOS 6.22 zu erstellen auf dem ein ...

Voice over IP
Telefonstörung - Ortsrufnummern kein Verbindungsaufbau
Frage von Windows10GegnerVoice over IP10 Kommentare

Hallo, sowohl bei uns als auch beim Opa ist es über VoIP nicht möglich Ortsrufnummern anzurufen. Es kommt nach ...

Cloud-Dienste
PIM als SaaS Nutzungsgebühr
Frage von vanTastCloud-Dienste8 Kommentare

Moin, wir haben uns ein PIM (Product Information Management) nach unseren Ansprüchen für viel Geld als SaaS-Lösung bauen lassen. ...