IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++Builder Discussion :

Echanges de données entre une appli desktop et un service


Sujet :

C++Builder

  1. #1
    Membre régulier
    Inscrit en
    Avril 2004
    Messages
    249
    Détails du profil
    Informations personnelles :
    Âge : 53

    Informations forums :
    Inscription : Avril 2004
    Messages : 249
    Points : 112
    Points
    112
    Par défaut Echanges de données entre une appli desktop et un service
    Bonjour,

    J'ai besoin de faire dialoguer ensemble deux applications : une appli standard desktop et un service.
    Les deux sont développées en Builder.
    Mon service traite des données, les stocke dans une structure et il doit ensuite transmettre ces données à l'appli desktop.
    Je préfèrerai éviter d'utiliser la communication IP.
    J'ai donc cherché des pistes et j'ai cru comprendre que j'arriverai à mes fins grâce à l'utilisation d'un fichier mappé et d'un TEvent.
    J'ai pas mal parcouru ce forum (dont de nombreux posts de ShaiLeTroll) et celui de Delphi mais j'avoue que, étant novice en la matière, j'ai du mal à comprendre comment tout ça s'articule.
    D'ailleurs, j'en suis rendu à me demander si une classe dérivée de TEvent avec mes données en plus ajoutées comme propriétés ne suffirait pas plutot que d'utiliser le fichier mappé.
    Qui crée le TEvent ?
    Comment l'autre appli le reçoit ?
    J'ai déjà créé des composants avec des événements qui fonctionnent très bien mais là, c'est le trou noir ....
    Bref, vous voyez, je suis perdu et un peu d'aide serait la bienvenue.
    _____
    __
    _

    Engi

  2. #2
    Membre chevronné
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Mars 2002
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 044
    Points : 2 187
    Points
    2 187
    Billets dans le blog
    1
    Par défaut
    Salut
    tu peux arriver a tes fins en créant de la mémoire partagée entre process
    FileMapping et utiliser l'Event pour signaler à l'autre application qu'elle peut accéder à la mémoire
    ex:
    Premier process
    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
     
    #include <windows.h>
    #include <stdio.h>
    #include <conio.h>
     
    #define BUF_SIZE 256
    TCHAR szName[]=TEXT("MyFileMappingObject");
    TCHAR szMsg[]=TEXT("Message from first process");
     
    void main()
    {
       HANDLE hMapFile;
       LPCTSTR pBuf;
     
       hMapFile = CreateFileMapping(
                     INVALID_HANDLE_VALUE,    // use paging file
                     NULL,                    // default security 
                     PAGE_READWRITE,          // read/write access
                     0,                       // max. object size 
                     BUF_SIZE,                // buffer size  
                     szName);                 // name of mapping object
     
       if (hMapFile == NULL) 
       { 
          printf("Could not create file mapping object (%d).\n", 
                 GetLastError());
          return 1;
       }
       pBuf = (LPTSTR) MapViewOfFile(hMapFile,   // handle to map object
                            FILE_MAP_ALL_ACCESS, // read/write permission
                            0,                   
                            0,                   
                            BUF_SIZE);           
     
       if (pBuf == NULL) 
       { 
          printf("Could not map view of file (%d).\n", 
                 GetLastError()); 
          return 2;
       }
     
     
       CopyMemory((PVOID)pBuf, szMsg, strlen(szMsg));
       getch();
     
       UnmapViewOfFile(pBuf);
     
       CloseHandle(hMapFile);
     
       return 0;
    }
    Second Process
    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
     
    #include <windows.h>
    #include <stdio.h>
    #include <conio.h>
    #include <windows.h>
     
    #define BUF_SIZE 256
    TCHAR szName[]=TEXT("MyFileMappingObject");
     
    void main()
    {
       HANDLE hMapFile;
       LPCTSTR pBuf;
     
       hMapFile = OpenFileMapping(
                       FILE_MAP_ALL_ACCESS,   // read/write access
                       FALSE,                 // do not inherit the name
                       szName);               // name of mapping object 
     
       if (hMapFile == NULL) 
       { 
          printf("Could not open file mapping object (%d).\n", 
                 GetLastError());
          return 1;
       } 
     
       pBuf = (LPTSTR) MapViewOfFile(hMapFile, // handle to map object
                   FILE_MAP_ALL_ACCESS,  // read/write permission
                   0,                    
                   0,                    
                   BUF_SIZE);                   
     
       if (pBuf == NULL) 
       { 
          printf("Could not map view of file (%d).\n", 
                 GetLastError()); 
          return 2;
       }
     
       MessageBox(NULL, pBuf, TEXT("Process2"), MB_OK);
     
       UnmapViewOfFile(pBuf);
     
       CloseHandle(hMapFile);
     
       return 0;
    }
    petit exemple de HandShacking

    Process 1:
    Création d'un event
    Création d'une file Mapping
    Mapper la FileMapping
    Modifier la File Mapping
    seter l'event

    dans le process2
    ouvrir la FileMapping
    Mapper la Zone Mapping
    dans un thread séparé attendre la notification de l'event
    MOdifier la FileMapping(lire ou écrire)
    Signaler au process appellant dans un autre Event que l'opération de lecture ou d'écriture est terminée

    en espérant avoir été clair
    vous trouverez mes tutoriels à l'adresse suivante: http://djmsoftware.developpez.com/
    je vous en souhaite une excellente lecture ...

    A lire : Les règles du forum

  3. #3
    Membre régulier
    Inscrit en
    Avril 2004
    Messages
    249
    Détails du profil
    Informations personnelles :
    Âge : 53

    Informations forums :
    Inscription : Avril 2004
    Messages : 249
    Points : 112
    Points
    112
    Par défaut
    salut DjmSoftware.
    merci pour ta réponse qui est effectivement très claire.
    cependant, peux tu détailler plus précisément la création du TEvent et son envoi d'un coté et d'autre part sa "captation" dans un thread créé par la seconde appli ?
    Cela me rendrait grandement service ...
    _____
    __
    _

    Engi

  4. #4
    Membre chevronné
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Mars 2002
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 044
    Points : 2 187
    Points
    2 187
    Billets dans le blog
    1
    Par défaut
    Salut
    Ci-joint un exemple avec 2 Applications
    Sender et Receiver

    Sender envoie des données dans un File Mapping et signal par un event au récepteur l'envoi du message

    En retour le récepteur notifie à l'émetteur le traitement de l'information

    cdlt
    Fichiers attachés Fichiers attachés
    vous trouverez mes tutoriels à l'adresse suivante: http://djmsoftware.developpez.com/
    je vous en souhaite une excellente lecture ...

    A lire : Les règles du forum

  5. #5
    Membre régulier
    Inscrit en
    Avril 2004
    Messages
    249
    Détails du profil
    Informations personnelles :
    Âge : 53

    Informations forums :
    Inscription : Avril 2004
    Messages : 249
    Points : 112
    Points
    112
    Par défaut
    Je ne pouvais espérer mieux.
    Merci pour ce code qui démontre parfaitement le fonctionnement.
    _____
    __
    _

    Engi

  6. #6
    Membre régulier
    Inscrit en
    Avril 2004
    Messages
    249
    Détails du profil
    Informations personnelles :
    Âge : 53

    Informations forums :
    Inscription : Avril 2004
    Messages : 249
    Points : 112
    Points
    112
    Par défaut
    Finalement, petite question supplémentaire :
    Quand j'utilise ce code entre deux applis desktop, tout fonctionne bien.
    Par contre, entre mon service et mon appli desktop, au mieux, l'événement n'est pas détecté, au pire, j'ai un message "Accès refusé" à la création de l'evt.
    Si je lance mon exe desktop en mode admin, je n'ai plus le msg "accès refusé" mais pas d'événement non plus!
    Sachant que je démarre mon service avec le compte SYSTEME LOCAL, est-ce cela qui peut poser problème ?
    _____
    __
    _

    Engi

  7. #7
    Membre régulier
    Inscrit en
    Avril 2004
    Messages
    249
    Détails du profil
    Informations personnelles :
    Âge : 53

    Informations forums :
    Inscription : Avril 2004
    Messages : 249
    Points : 112
    Points
    112
    Par défaut
    J'ai trouvé la réponse à ma question : le service et l'application ne s'exécute pas dans la même session.
    D'autre part, j'ai créé mes events et mon fichier mappé en global.
    Dans ce cas de figure, il faut définir les droits d'accès aux objets avec le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SECURITY_ATTRIBUTES sa;
    SECURITY_DESCRIPTOR SD;
    ZeroMemory(&sa, sizeof(sa));
    sa.nLength = sizeof(sa);
    sa.bInheritHandle = false;
    InitializeSecurityDescriptor(&SD, SECURITY_DESCRIPTOR_REVISION);
    SetSecurityDescriptorDacl(&SD, true,(PACL)NULL, false);
    sa.lpSecurityDescriptor = &SD;
     
    ghLogEvent = CreateEventW(&sa, false, false, "Global\\nom_event");
    Pour mon cas, je donne tous les droits d'accès à tous les utilisateurs sur mes objets.
    On peut aussi définir des droits plus précis.
    _____
    __
    _

    Engi

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 05/05/2011, 14h20
  2. Communication entre une appli Adobe AIR et une base de données en ligne
    Par Alexter dans le forum Langages de programmation
    Réponses: 1
    Dernier message: 15/10/2009, 15h20
  3. Réponses: 2
    Dernier message: 29/09/2009, 10h33
  4. Telechargement d'internet et echange de données entre 2 pc
    Par Invité dans le forum Développement
    Réponses: 5
    Dernier message: 09/05/2004, 21h22
  5. [Kylix] Echange de données entre fiches
    Par _dack_ dans le forum EDI
    Réponses: 1
    Dernier message: 01/07/2003, 11h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo