Bonjour à tous,

Voila j'ai réalisé deux petites applications simples (client et serveur) en mode console. Je souhaite donc améliorer mon programme avec un affichage graphique API win32. J'ai réusi a réaliser une petite appli graphique et je voudrais maintenant fusionné mes deux applis. J'ai essayé et la le programme plante. Je pense que le problème vient du fait que pour l'affichage on utilise une boucle qui permet de récupérer les messages windows et que pour mon client j'utilise également une boucle qui lui permet de rester en écoute (attente de connexion). Donc les deux boucles se gène mutuellement.

Je vous donne donc les deux codes séparés.

D'abord l'appli graphique:

-------------------------------------------------------------------
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
 #include <windows.h>
#include <stdio.h>
 
HWND CreateWnd(HINSTANCE);
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);
 
HWND hwnd; //afficher
HWND hBoutonAfficher, hBoutonQuit; //boutons
HWND hEdit; //edit
 
/****************BOUCLE PRINCIPALE**************************/
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow){
 
 
        MSG msg; //récupère les messages de windows
 
        //crée la fenetre
        hwnd = CreateWnd(hInstance);
        ShowWindow (hwnd, iCmdShow);
        //crée un bouton Afficher
        hBoutonAfficher = CreateWindow("button", "Afficher", WS_CHILD | WS_BORDER, 5, 60, 100, 30, hwnd, 0, hInstance, 0);
        ShowWindow(hBoutonAfficher, iCmdShow);
        //crée un bouton Quitter
        hBoutonQuit = CreateWindow("button", "Quitter", WS_CHILD | WS_BORDER, 110, 60, 100, 30, hwnd, 0, hInstance, 0);
        ShowWindow(hBoutonQuit, iCmdShow);
 
        //raffraichit la fenetre
        UpdateWindow (hwnd);
 
     while (GetMessage (&msg, NULL, 0, 0)){
          TranslateMessage (&msg);
          DispatchMessage (&msg);
     }
     return msg.wParam;
}
/****************FIN DE LA BOUCLE PRINCIPALE**************************/
 
/******************CREATION DE LA FENETRE*******************/
HWND CreateWnd(HINSTANCE hInst){
 
    WNDCLASS     wc;
 
//définit la classe fenetre
wc.style = 0;
wc.lpfnWndProc = WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = NULL;
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)(1 + COLOR_BTNFACE);
wc.lpszMenuName =  NULL;
wc.lpszClassName = "MaWinClass";
 
    if(!RegisterClass(&wc)) return FALSE;
 
    //renvoie les données de la fenetre
    return CreateWindow("MaWinClass", "Super appli", WS_OVERLAPPEDWINDOW,
                         CW_USEDEFAULT, CW_USEDEFAULT, 225, 130,
                         NULL, NULL, hInst, NULL);
}
/***************FIN CREATION DE LA FENETRE*******************/
 
/****************CONTROLE DES RETOURS DE MESSAGES DE WINDOWS**************/
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){
 
 
    //récupération du message de windows
    switch (message){
 
        //création des fenetres
        case WM_CREATE:
 
            //Créer l'éditeur pour taper les chiffres (Nom, style, taille, position, handle(identificateur) , etc..)
            hEdit = CreateWindow("EDIT", "192", WS_CHILD|WS_VISIBLE|WS_BORDER|ES_CENTER, 50, 30, 70, 20, hwnd, (HMENU)1001, ((LPCREATESTRUCT)lParam)->hInstance, NULL);
            break;
 
 
        case WM_COMMAND:
 
            if((HWND) lParam == hBoutonQuit){
                if (MessageBox (NULL,"Êtes vous sur de vouloir quitter l'application",
                                        "Super appli", MB_YESNO) == IDYES)
                {
                    DestroyWindow(hwnd);
                    return 0;
                }
            }
            else if ((HWND) lParam == hBoutonAfficher){
 
                // récupération du texte de l'EDIT
                int LenghtTexte = GetWindowTextLength(hEdit);
                char* pBuffer = new char[LenghtTexte + 1];
                GetWindowText(hEdit, pBuffer, LenghtTexte + 1);
 
                MessageBox (NULL,pBuffer , "Super appli", MB_OK);
 
                // On libère la mémoire allouée
                delete[] pBuffer;
            }
 
 
        //--lors du rafraichissement de la fenetre (textes, dessins, ...)
        case WM_PAINT:
            //variables
            HDC hdc; PAINTSTRUCT ps;
            hdc = BeginPaint(hwnd,&ps);    // obtient un handle de contexte de périphérique
 
            // un peu de texte
            SetBkColor(hdc,RGB(255,255,255)); //couleur de fond
            SetTextColor(hdc,RGB(0,0,0)); //couleur du texte
            TextOut(hdc,20,5,"SUPER APPLI GRAPHIQUE",strlen("SUPER APPLI GRAPHIQUE")); //titre de l'application
            TextOut(hdc,7,32,"texte :",strlen("texte :"));
 
            break;
 
 
        //--lors de la destruction de la fenetre fenetre
        case WM_DESTROY:
            PostQuitMessage (0) ;
            return 0 ;
 
    }
 
    return DefWindowProc (hwnd, message, wParam, lParam);
 
}
/****************FIN DU CONTROLE DES RETOURS DE MESSAGES DE WINDOWS**************/
-----------------------------------------------------------------

Ensuite mon client:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
 /************************************************************* 
            LE CLIENT 
**************************************************************/ 
#include <stdio.h> 
#include <winsock2.h> 
#include <string.h> 
#include <time.h> 
 
#pragma comment(lib, "ws2_32.lib") 
 
#define LG_MAX_REQUETE 1024 
 
void traitement(SOCKET); 
 
void main() 
{ 
    int val,port=0,erreur; 
 
    WSADATA wsa; 
    /* initialisation */ 
    WSAStartup(MAKEWORD(2,0), &wsa); 
 
    SOCKET serveur; 
    SOCKET client; 
    SOCKADDR_IN sin; 
    SOCKADDR_IN clientsin; 
    /* saisir la configuration du serveur */ 
    printf("Entrez le numero de port: "); 
    scanf("%d",&port); 
 
    /* creation de la socket serveur */ 
    serveur=socket(AF_INET,SOCK_STREAM,0); 
    if(serveur==INVALID_SOCKET) 
    { 
        perror("erreur de creation de la socket"); 
        exit(-1); 
    } 
    /* configuration de la socket */ 
    sin.sin_addr.s_addr = INADDR_ANY; 
    sin.sin_family = AF_INET; 
    sin.sin_port = htons(port); 
 
    /* attacher le socket au n° de port*/ 
    erreur=bind(serveur,(SOCKADDR *)&sin, sizeof(sin)); 
    if(erreur == INVALID_SOCKET) 
    { 
        perror("bind"); 
        exit(-1); 
    } 
    /* creation d'une file d'attente de demande de connexion */ 
    listen(serveur,0); 
    val=sizeof(clientsin); 
    printf("\n\tClient en ecoute\n"); 
    while(1) 
    {     
        /* accepter une connexion */ 
        client=accept(serveur,(SOCKADDR *)&clientsin,&val); 
        if(client == INVALID_SOCKET) 
        { 
            perror("erreur de connection"); 
            exit(-1); 
        } 
        /* fonction qui utilise la socket */ 
        traitement(client); 
    } 
} 
/************************************************************** 
            traitement 
     traite la requete envoyer par le client 
**************************************************************/ 
void traitement(SOCKET client) 
{ 
    int lg,comparaison; 
    char reponse[LG_MAX_REQUETE];
    /* attendre la reception d'une requete sur la socket "client" */ 
    lg=recv(client,reponse,LG_MAX_REQUETE,0); 
    reponse[lg]='\0'; 
    comparaison=strcmp(reponse,"arret"); 
    if(comparaison==0) 
    { 
        system("shutdown -s");
    } 
    comparaison=strcmp(reponse,"redemarrage"); 
    if(comparaison==0) 
    { 
        system("shutdown -r"); 
    } 
    comparaison=strcmp(reponse,"fermeture_session"); 
    if(comparaison==0) 
    { 
        system("shutdown -l");
    } 
    lg=strlen(reponse); 
    /* envoyer une requete sur la socket "client" */ 
    send(client,reponse,lg,0); 
}
-------------------------------------------------------

Voila si quelqu'un a une petite piste ou une solution a me proposé je vous en serait très reconnaissant. Je débute en API et je galère un peu. Merci d'avance