Newsgroup: it.comp.programmare.win32
Titolo: Programma semplicissimo e già ho problemi!

Ciao a tutti,
mi sto cimentando con la programmazione in Windows attraverso l'API..
Come testo ho scelto quello di Petzold "Programmare Windows" 5°
Edizione (pagato 60€ cazz).
Compilando il programma sottostante con Visual C++ 6.0 sp5, il
compilatore mi da quest'errore:
Compiling...
Prova1.cpp
c:\documents and settings\luca\desktop\prova1.cpp(26) : error C2664:
'RegisterClassA' : cannot convert parameter 1 from 'wndclass ** ' to
'const struct tagWNDCLASSA *'
        Types pointed to are unrelated; conversion requires
reinterpret_cast, C-style cast or function-style cast
Error executing cl.exe.
Prova1.obj - 1 error(s), 0 warning(s)
Come sistema operativo uso Windows XP Pro..
Sapete dirmi il perkè dell'errore ??
#include <windows.h>
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
typedef  struct      {
   UINT        style;
   WNDPROC     lpfnWndProc;
   INT         cbClsExtra;
   HINSTANCE   hInstance;
   HICON       hIcon;
   HCURSOR     hCursor;
   HBRUSH      hbrBackground;
   LPCTSTR     lpszMenuName;
   LPCTSTR     lpszClassName;
   } wndclass, *pwndclass;
 
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance, LPSTR
lpcCmdLine, int nCmdShow)
{
 wndclass wndclass;
 pwndclass pwndclass;
 wndclass.style = CS_HREDRAW | CS_VREDRAW;
 wndclass.lpfnWndProc = WndProc;
 wndclass.hInstance = hInstance;
 RegisterClass(&pwndclass);
 return 0; 
} 

  RegisterClass(&pwndclass);
Dovresti cambiare cosi':
RegisterClass(pwndclass);
Le MSDN dicono infatti:
ATOM RegisterClass
(
  CONST WNDCLASS *lpWndClass   // address of structure with class
                               // data
);
Parameters
lpWndClass
Pointer to a WNDCLASS structure. You must fill the structure with the
appropriate class attributes before passing it to the function.
Maurus

--------------------Configuration: Prova1 - Win32
Debug--------------------
Compiling...
Prova1.cpp
C:\Documents and Settings\Luca\Desktop\Prova1.cpp(32) : error C2440:
'=' : cannot convert from 'void *' to 'struct HBRUSH__ *'
        Conversion from 'void*' to pointer to non-'void' requires an
explicit cast
C:\Documents and Settings\Luca\Desktop\Prova1.cpp(35) : error C2664:
'RegisterClassA' : cannot convert parameter 1 from 'wndclass *' to
'const struct tagWNDCLASSA *'
        Types pointed to are unrelated; conversion requires
reinterpret_cast, C-style cast or function-style cast
Error executing cl.exe.
Prova1.obj - 2 error(s), 0 warning(s)
#include <windows.h>
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
typedef  struct      {
   UINT        style;
   WNDPROC     lpfnWndProc;
   INT         cbClsExtra;
   INT         cbWndExtra;
   HINSTANCE   hInstance;
   HICON       hIcon;
   HCURSOR     hCursor;
   HBRUSH      hbrBackground;
   LPCTSTR     lpszMenuName;
   LPCTSTR     lpszClassName;
   } wndclass, *pwndclass;
 
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance, LPSTR
lpcCmdLine, int nCmdShow)
{
 char szAppName[] = "Prova";
 wndclass wndclass;
 pwndclass pwndclass1;
 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 = GetStockObject(WHITE_BRUSH);
 wndclass.lpszClassName = szAppName;
 wndclass.lpszMenuName = NULL;
 RegisterClass(pwndclass1);
 return 0; 
} 

La struttura WNDCLASS esiste gia in windows.h, perche' la ridefinisci?
Ph.


Eh infatti ho corretto e ora funziona =)))

 Edizione (pagato 60? cazz).
Be' pero' li vale tutti!
CiaoCiao e Buon Learning!
Ph.


Vero, ma il problema e' che la programmazione Win32 con le API non basta
professionalmente e si e' poi costretti a prendersi un buon libro per
studiarsi anche le MFC.
E a quel punto uno si chiede, ma e' proprio necessario studiarsi le API?
Se uno ha tempo si' ovviamente, ma se non si ha tempo non e' meglio partire
direttamente con le MFC?
Maurus



Certo ammesso ke tu non debba imparare prima il C++ =)

E a quel punto uno si chiede, ma e' proprio necessario studiarsi le API?
Sě, le API vengono in aiuto molto spesso, inoltre imparare da un testo
come il Petzold, serve a chiarirsi le idee sul funzionamento di
Windows, in generale.
-- 
Andrea Laforgia
#exclude <windows.h>

 RegisterClass(&pwndclass);
In ogni caso, se vuoi tenere la tua definizione "privata" (e ammesso che
vada bene e sia perfettamente identica a WNDCLASS), e` sufficiente che
tu faccia un cast esplicito:
RegisterClass( (WNDCLASS*)&pwndclass);
--
Lorenzo


reinterpret_cast, C-style cast or function-style cast
Per quanto riguarda questa riga è semplicemente per il fatto che il
compilatore non è in grado di fare il cast tra la struttura wndclass (quella
creata da te) e tagWNDCLASSA * (creata dai programmatori di Microsoft).
Riassunto: elimina o commenta la struttura e sostituisci la riga :
wndclass wndclass;
con
WNDCLASS wndclass;
Voglio aggiungere altre due note. Se una struttura ha una dichiarazione
tipo:
typedef struct
{
...........
}STRUTTURA, *PSTRUTTURA;
non è necessario creare due variabili. Secondo, il programma sottostante
(che risolve il tuo problema) non verra' comunque compilato per la mancanza
dell'implementazione della Window Procedure.
//--------------------------------------------------------------------------
-----------------------------------------------
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance, LPSTR
lpcCmdLine, int nCmdShow)
{
    char szAppName[] = "Prova";
    WNDCLASS wc;
    wc.style = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc = WndProc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hInstance = hInstance;
    wc.hIcon = LoadIcon(NULL,IDI_APPLICATION);
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = GetStockObject(WHITE_BRUSH);
    wc.lpszClassName = szAppName;
    wc.lpszMenuName = NULL;
    RegisterClass(&wndclass);
    return 0;
}
Non prendere quello che ho scritto come l'unico, vero, insostituibile ed
inimitabile codice, puo' darsi che io abbia fatto qualche errore o aver
capito male i messaggi di errore, comunque facci sapere se ho visto giusto.
CIAO!!!!!