Bonjour,

Je cherche à faire transmettre des messages entre un exécutable (qui contient une Form) et un service. Le service envoie des informations (un log de fonctionnement) dans une zone mémoire, qui est lue à une fréquence régulière par mon exécutable, et qui affiche dans une listbox de la Form, les logs envoyés par le service.

Voilà comment j'ai procédé :

En commun entre mon service et mon exécutable :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
// Log en mémoire pour affichage lorsque le Service doit envoyer à la fenêtre le log
typedef struct
{
        bool CalculEnCours;
        bool DownloadEnCours;
        char texte[100][1000];  // [100] = on conserve jusqu'à 100 lignes en mémoire tampon ; [1000] = nombre de caractères maximum d'un message
}FluxConteneur;
HANDLE FluxCommun;
Dans mon service :
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
// Ouverture de l'espace commun en mémoire entre ce service et l'IHM pour le partage du log
FluxCommun = CreateFileMapping((HANDLE)0xFFFFFFFF, NULL, PAGE_READWRITE, 0, sizeof(FluxConteneur), "MonFluxCommun");
if(FluxCommun==0)
{
        FluxConteneur *data = (FluxConteneur *)MapViewOfFile(FluxCommun, FILE_MAP_ALL_ACCESS, 0, 0, 0);
        data->CalculEnCours = false;
        data->DownloadEnCours = false;
        UnmapViewOfFile(data);
}
else if (GetLastError() == ERROR_ALREADY_EXISTS)
{
        CloseHandle(FluxCommun);
        FluxCommun = OpenFileMapping(FILE_MAP_ALL_ACCESS, false, "MonFluxCommun");
}
 
// Au moment de l'écriture d'une nouvelle ligne de log, paramètre "ligne" :
if(FluxCommun!=NULL)
{
        int i;
        FluxConteneur *data = (FluxConteneur *)MapViewOfFile(FluxCommun, FILE_MAP_ALL_ACCESS, 0, 0, 0);
 
        for(i=0;i<100;++i)
        {
                if(strcmp(data->texte[i], "")==0)
                {
                        strcpy(data->texte[i], ligne.c_str());
                        i = 99999;
                }
        }
        if(i!=100000)
                strcpy(data->texte[99], ligne.c_str());
 
        UnmapViewOfFile(data);
}
Dans mon exécutable, au démarrage, initialisation du flux commun :
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
// Ouverture de l'espace commun en mémoire entre le service et cette IHM pour le partage du log
FluxCommun = CreateFileMapping((HANDLE)0xFFFFFFFF, NULL, PAGE_READWRITE, 0, sizeof(FluxConteneur), "MonFluxCommun");
if(FluxCommun==0)
{
        FluxConteneur *data = (FluxConteneur *)MapViewOfFile(FluxCommun, FILE_MAP_ALL_ACCESS, 0, 0, 0);
        data->CalculEnCours = false;
        data->DownloadEnCours = false;
        UnmapViewOfFile(data);
}
else
        if (GetLastError() == ERROR_ALREADY_EXISTS)
        {
                CloseHandle(FluxCommun);
                FluxCommun = OpenFileMapping(FILE_MAP_ALL_ACCESS, false, "MonFluxCommun");
        }
Dans mon exécutable, pour l'actualisation de l'affichage dans une ListBox de ma Form, dans un OnTimer :
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
// Affichage du log
if(FluxCommun!=NULL)
{
        FluxConteneur *data = (FluxConteneur *)MapViewOfFile(FluxCommun, FILE_MAP_ALL_ACCESS, 0, 0, 0);
        calcul_en_cours = data->CalculEnCours;
        download_en_cours = data->DownloadEnCours;
        for(i=0;i<100;++i)
        {
                if(strcmp(data->texte[i], "")!=0)
                {
                        ListBox1->Items->Add(data->texte[i]);
                        ListBox1->ItemIndex = ListBox1->Items->Count-1;
                        Application->ProcessMessages();
                        strcpy(data->texte[i], "");
                }
        }
        UnmapViewOfFile(data);
}
Cela fonctionne parfaitement sur mon ordinateur sous Windows XP... Mais quand je bascule tout cela sur un ordinateur équipé de Windows Server 2008, cela ne fonctionne plus, plus rien n'apparaît dans ma ListBox de ma Form, même si je coche dans les options du service "autoriser à intéragir avec le bureau" ou que je le fais démarrer en tant qu'utilisateur "administrateur"...

Merci par avance pour votre aide !