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 :
Dans mon service :
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 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
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, 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 // 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"); }
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"...
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); }
Merci par avance pour votre aide !
Partager