Changes between Version 5 and Version 6 of TP1


Ignore:
Timestamp:
Jul 2, 2006, 8:27:51 PM (14 years ago)
Author:
Vincent Caron
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • TP1

    v5 v6  
    1 = TP1: Programmation et tests win32 sous GNU/Linux =
    2 
    3 == Hello world pour Win32 ==
    4 
    5 Comparez ce programme avec le classique "Hello world" en C sous Unix:
    6 
    7 source:/tp1/hello/hello32.c
    8 {{{
    9 #include <windows.h>
    10 
    11 int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
    12 {
    13   MessageBox(NULL, "Hello world !", "hello32 example", MB_OK);
    14   return 0;
    15 }
    16 }}}
    17 
    18 Pour compiler ce programme, on utilise pratiquement la même recette:
    19 
    20 source:/tp1/hello/Makefile
    21 {{{
    22 # Avec Debian, utiliser "apt-get mingw32" pour obtenir le cross-compilateur
    23 WINCC=i586-mingw32msvc-gcc
    24 CC=gcc
    25 
    26 hello32.exe: hello32.c
    27         $(WINCC) -o $@ $<
    28 
    29 hello: hello.c
    30         $(CC) -o $@ $<
    31 
    32 clean:
    33         rm hello hello32.exe
    34 }}}
    35 
    36 On peut alors tester ce programme à l'aide de Wine:
    37 
    38 {{{
    39 $ wine ./hello32.exe
    40 }}}
    41 
    42 [[Image(source:/tp1/hello/hello32.png)]]
    43 
    44 
    45 = Abstraction et portage =
    46 
    47 On commence par identifier les services "haut niveau" requis par le programme. Considérons par exemple le programme "Hello world" expurgé des fonctions trop ''Unixiennes'' ou ''Windosiennes'' :
    48 
    49 source:/tp1/hello-all/hello.c
    50 {{{
    51 #include "libhello.h"
    52 
    53 void start()
    54 {
    55   hello("Hello world!");
    56 }
    57 }}}
    58 
    59 On demande implcitement deux choses: un "guichet unique" comme point d'entrée (`start()`), et une fonction qui affiche un message (`hello()`) - que ce soit via une console ou une fenêtre de dialogue. En C, l'interface représentant ces besoins s'écrit ainsi:
    60 
    61 source:/tp1/hello-all/libhello.h
    62 {{{
    63 #ifndef _libhello_h_
    64 #define _libhello_h_
    65 
    66 /* Cette fonction est a definir et sera le point de depart du programme
    67  */
    68 extern void start();
    69 
    70 
    71 /* Affiche un message court a l'utilisateur
    72  */
    73 void hello(const char* message);
    74 
    75 #endif /* _libhello_h_ */
    76 }}}
    77 
    78 Il nous suffit alors d'implémenter cette interface pour chaque plateforme: voir source:/tp1/hello-all/libhello-unix.c et source:/tp1/hello-all/libhello-win32.c
    79 
    80 On constate en pratique que la partie spécifique aux plateformes d'un logiciel portable représente une faible partie (ex: moins de 10% chez Apache, Mozilla ou OpenOffice.org). Ceci permet de séparer les problèmes (programmer l'application d'un côté, la rendre portable de l'autre).
     1Page dépréciée en faveur de [wiki:EnstaTP1].