PDA

Visualizza la versione completa : [C++] Creare GUI con Win32 API ed errore "Stack corrupted error"


EmaGuzzetti
07-08-2009, 11:47
salve a tutti... sto provando per la prima volta un programma con interfaccia grafica in c++...ho usato il c++ per poco solo con la console però un'idea del funzionamento me lo sono fatto...per creare l'interfaccia grafica sto seguendo qusta guida che mi è sembrata molto completa..
seguendo il loro esempio ottengo un programma cosi:

#define STRICT
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <string>
BOOL CALLBACK unaDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
if(uMsg==WM_CLOSE)
{
EndDialog(hwndDlg, 0);
return TRUE;
}
else if(uMsg==WM_COMMAND)
{
WORD wNotifica = HIWORD(wParam);
WORD wId = LOWORD(wParam);
if(wNotifica == STN_CLICKED && wId == 101)
{
HWND hStat = (HWND)lParam;
char buff[6];
const char* pTesto;
SendMessage(hStat, WM_GETTEXT, 6, (LPARAM)buff);
if(buff[0]=='C') pTesto = "Salve";
else pTesto = "Ciao!";
SendMessage(hStat, WM_SETTEXT, 0, (LPARAM)pTesto);
return TRUE;
}
}
return FALSE;
}
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nCmdShow) {
DialogBoxParam(0,L"MioDialogo",0,unaDlgProc,0); return 0;
}

con questo che è il file dell'interfaccia grafca (MIODIALOGO.rc)

#include <windows.h>
MioDialogo DIALOG DISCARDABLE 0, 0, 186, 92
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Un Dialogo vuoto"
FONT 8, "MS Sans Serif"
BEGIN
CONTROL "Ciao!", 101, "STATIC", SS_CENTER|WS_BORDER|SS_NOTIFY, 60, 40, 40, 10
END
però quando lo eseguo e clicco sul label con la scritta "Ciao!" ricevo questo errore:
Run-Time Check Failure #2 - Stack around the variable 'buff' was corrupted.
e la variabile ptesto contiene una serie di caratteri cinesi...
per fare il programma uso visual studio 2008 in un progetto win32..dove sbaglio? come posso risolvere?

Andrea Simonassi
07-08-2009, 12:15
Su MSDN leggo:




wParam
Specifies the maximum number of TCHARs to be copied, including the terminating null character.

Windows NT/2000/XP:ANSI applications may have the string in the buffer reduced in size (to a minimum of half that of the wParam value) due to conversion from ANSI to Unicode.


mi sa che ti conviene usare TCHAR come tipo invece di char per il tuo buffer perchè penso che per default devi usare i caratteri unicode. Di conseguenza devi racchiudere tutti i literal string con la macro _T() del tipo

TCHAR * pippo = _T("ciao")

EmaGuzzetti
07-08-2009, 13:36
adesso mi visualizza i caratteri giusti ma l'errore mi esce lo stesso!
come è possibile?

MItaly
07-08-2009, 23:12
Puoi postare il codice modificato? Nelle proprietà del progetto hai impostato l'uso di caratteri ANSI o Unicode?

EmaGuzzetti
08-08-2009, 11:25
ecco il nuovo codice:


#define STRICT
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <string>
#include <tchar.h>
BOOL CALLBACK unaDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
if(uMsg==WM_CLOSE)
{
EndDialog(hwndDlg, 0);
return TRUE;
}
else if(uMsg==WM_COMMAND)
{
WORD wNotifica = HIWORD(wParam);
WORD wId = LOWORD(wParam);
if(wNotifica == STN_CLICKED && wId == 101)
{
HWND hStat = (HWND)lParam;
char buff[6];
TCHAR * pTesto;
SendMessage(hStat, WM_GETTEXT, 6, (LPARAM)buff);
if(buff[0]=='C') pTesto = _T("Salve");
else pTesto = _T("Ciao!");
MessageBox(0, (LPCWSTR)pTesto, (LPCWSTR)buff, MB_OK);
SendMessage(hStat, WM_SETTEXT, 0, (LPARAM)pTesto);
return TRUE;
}
}
return FALSE;
}
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nCmdShow) {
DialogBoxParam(0,L"MioDialogo",0,unaDlgProc,0); return 0;
}

i caratteri non gli ho modificati quindi sono unicode...

Andrea Simonassi
10-08-2009, 07:16
char buff diventa TCHAR buff

Loading