Newsgroup: it.comp.programmare.win32
Titolo: [VC++, Win32 API] Errore in fase di creazione della finestra principale.

Salve a tutti,
non capisco che succede ma dopo qualche tentativo in cui mi appariva una
finestra, la mia applicazione ora fallisce sistematicamente sulla
createwindowex con il codice d'errore ERROR_ALREADY_EXISTS (183).
Ecco il codice del file principale:
INIZIO CODICE------------------------------------------------------------
// MisurePlus.cpp : Defines the entry point for the application.
//
#include "stdafx.h"
#include "resource.h"
#include <stdio.h>
#include <stdlib.h>
#include "DlgSetParams.h"
HINSTANCE global_hInstance; //Handle globale per l'istanza dell'applicazione
/*----------------------------------------------------------------*\
 Prototipi di Funzione
\*----------------------------------------------------------------*/
LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM
lParam);
BOOL CALLBACK AboutProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM
lParam);
BOOL enableSalvaMenuItemAndButton(HWND hWndOwner, UINT flag);
const char g_szClassName[] = "myWindowClass";
/*
* MAIN
*/
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
    LPSTR lpCmdLine, int nCmdShow)
{
 WNDCLASSEX wc;
    HWND hwnd;
    MSG Msg;
    global_hInstance=hInstance;
    //Step 1: Registering the Window Class
    wc.cbSize        = sizeof(WNDCLASSEX);
    wc.style         = 0;
    wc.lpfnWndProc   = WindowProc;
    wc.cbClsExtra    = 0;
    wc.cbWndExtra    = 0;
    wc.hInstance     = hInstance;
    wc.hIcon         = LoadIcon(NULL, MAKEINTRESOURCE(IDI_ICON1));
    wc.hCursor       = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
    wc.lpszMenuName  = NULL;
    wc.lpszClassName = g_szClassName;
    wc.hIconSm       = LoadIcon(NULL, MAKEINTRESOURCE(IDI_ICON1));
    if(!RegisterClassEx(&wc))
    {
  char message[MAX_PATH];
  DWORD err=GetLastError();
  sprintf(message, "Window Registration Failed!\nErrore %d", err);
        MessageBox(NULL,message , "ERRORE",
            MB_ICONEXCLAMATION | MB_OK);
        return 0;
    }
    // Step 2: Creating the Window
    hwnd = CreateWindowEx(
        WS_EX_CLIENTEDGE,
        g_szClassName,
        "Misure++",
        WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT, CW_USEDEFAULT, 240, 120,
        NULL, NULL, hInstance, NULL);
    if(hwnd == NULL)
    {
  char message[MAX_PATH];
  DWORD err=GetLastError();
  sprintf(message, "Window Creation Failed!\nErrore %d", err);
        MessageBox(NULL, message, "Error!",
            MB_ICONEXCLAMATION | MB_OK);
        return 0;
    }
    ShowWindow(hwnd, nCmdShow);
    UpdateWindow(hwnd);
    // Step 3: The Message Loop
    while(GetMessage(&Msg, NULL, 0, 0) > 0)
    {
        TranslateMessage(&Msg);
        DispatchMessage(&Msg);
    }
    return Msg.wParam;
}
/*----------------------------------------------------------------*\
 Finestra About
\*----------------------------------------------------------------*/
void OnAbout(HWND hwndDlg, UINT uMsg,LPARAM lParam)
{
[CUT]
}
/*----------------------------------------------------------------*\
 Esecuzione Procedura principale
\*----------------------------------------------------------------*/
void OnMisura(HWND hWndOwner, UINT uMsg,LPARAM lParam)
{
[CUT]
}
/*----------------------------------------------------------------*\
 Procedura per la gestione dei messaggi del Dialog About
\*----------------------------------------------------------------*/
BOOL CALLBACK AboutProc(HWND hWndDlg, UINT uMsg, WPARAM wParam, LPARAM
lParam)
{
 switch (uMsg)
 {
[CUT]
  case WM_INITDIALOG:
   return TRUE;
  break;
  default:
   return FALSE;
 }
 return TRUE;
}
/*---------------------------------------------------------------------*\
 Procedura per la gestione dei messaggi della finestra principale
\*---------------------------------------------------------------------*/
LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM
lParam)
{
 int res;
 switch (uMsg)
 {
  case WM_COMMAND:
  {
   WORD wNotifyCode = HIWORD(wParam); // notification code
   WORD wID = LOWORD(wParam);         // item, control, or accelerator
identifier
   switch (wID)
   {
    case ID_AZIONE_MODIFICA:
      res=DialogBoxParam(global_hInstance, MAKEINTRESOURCE(IDD_SETPARAMS),
0, DialogProc, 0);
    break;
    /*
    *Pulsante per il dialog about
    */
    case ID__ABOUT:
     OnAbout(hWnd, uMsg,lParam);
    break;
    /*
    *Pulsante che esegue la procedura di misurazione
    */
    case ID_AZIONE_MISURA:
    case IDC_B_MISURA:
     OnMisura(hWnd, uMsg, lParam);
    break;
   }
  }
  case WM_CLOSE:
            DestroyWindow(hWnd);
        break;
        case WM_DESTROY:
            PostQuitMessage(0);
        break;
  default:
   DefWindowProc(hWnd, uMsg, wParam, lParam);
 }
 return 0;
}
/*----------------------------------------------------------------*\
 Procedura per abilitare/disabilitare il menu e il pulsante
 "Salva"
\*----------------------------------------------------------------*/
BOOL enableSalvaMenuItemAndButton(HWND hWndOwner, UINT flag)
{
[CUT]
}
FINE
CODICE------------------------------------------------------------------
Aiuto! ;-)
--
Bye
Johnny
http://digilander.libero.it/Superpork/

 createwindowex con il codice d'errore ERROR_ALREADY_EXISTS (183).
Non so. A me (con qualche modifica al sorgente per evitare #include spuri e
per semplificare) va benissimo (win2k, msvc6)
Ciao,
--
zello

 per semplificare) va benissimo (win2k, msvc6)
Infatti il problema secondo me è proprio in una direttiva di inclusione.
Molto probabilmente c'è una #include che richiama due volte la stessa
definizione.
Es.
// File "a.h"
#include "c.h"
// File "b.h"
#include "a.h"
// File "c.h"
#include "a.h"
#include "b.h" -> "b.h" è già incluso da "a.h"

 definizione.
Penso anch'io, infatti le modifiche che avevo fatto erano proprio quelle di
spezzare in due files separati le procedure riguardanti la finestra
principale e quella di dialogo ma evidentemente cosě facendo avevo duplicato
qualche include....
ho rifatto il progetto da capo evitando anche l'uso degli headers
precompilati e tutto funziona ora.
A proposito, ma lo scopo degli headers precompilati č solo quello di ridurre
i tempi di compilazione e linkaggio o hanno qualche altro vantaggio?
Bye
Johnny
--
------
Per rispondermi scrivete all'indirizzo
jonquerido sul provider tin punto it

 i tempi di compilazione e linkaggio o hanno qualche altro vantaggio?
Credo (e ripeto credo!) che il compito principale degli headers sia solo
quello di facilitare la vita al lettore del programma (hai gią tutte le
funzioni davanti gli occhi e sai quale puoi utilizzare, senza dover girare
per il codice a cercare come č stata chiamata una certa funzione e quali
parametri si aspetta: tipo Java). I vantaggi dal punto di vista di riduzione
dei tempi di linkaggio e di compilazione sono minimi, soprattutto se si
tratta, come spesso accade per il VC++, di file lunghi ed articolati.
Ciao.