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++ Discussion :

DLL partagé entre deux programme


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    111
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2008
    Messages : 111
    Points : 50
    Points
    50
    Par défaut DLL partagé entre deux programme
    Bonjour à tous,


    Je souhaite crée une DLL partagé entre un programme en C++ et un programme windev. Bon but étant d'utiliser la DLL pour faire passer des valeurs de variable à travers celle-ci. J'ai créé un OpenFileMapping dans mon C++ et un CreateFileMapping dans ma DLL. Pour mettre à jour ma variable depuis Windev j'utilise un export de fonction.
    Mon idée serait d'accéder à la DLL qui est présent dans le dossier dans mon projet Windev depuis mon programme c++. Mais je ne sais pas trop comment faire.
    J'espère avoir été clair.

    Merci, d'avance

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Par défaut, l'ordre de recherche pour une DLL est le suivant :

    - La mémoire si la DLL est déjà en cours d'utilisation.
    - Le répertoire de travail de l'application.
    - Le répertoire d'installation de Windows.
    - Le sous-répertoire SYSTEM du répertoire contenant Windows.
    - Le répertoire de l'exécutable.
    - Les répertoires du PATH.

    Copie ta DLL dans le PATH ou dans SYSTEM
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  3. #3
    Membre confirmé Avatar de themadmax
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    446
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 446
    Points : 496
    Points
    496
    Par défaut
    Je pense plutot qu'il veut parler de memoire partagé.
    Veut-tu partager des variables/instance d'objets entre tes 2 programmes ?
    ________________________________________________
    http://bliquid.fr : Blog sur Android et l'Acer Liquid

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    111
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2008
    Messages : 111
    Points : 50
    Points
    50
    Par défaut
    Bonjour à tous,

    Oui c'est ça je veux partager des variables entre mes programmes. C'est pour ça que j'ai créé un espace mémoire: CreateFileMapping() dans ma DLL.
    J'utilise cette espace mémoire dans mon application C++ qui me sert à créer un service sous windows. J'utilise également cette DLL dans un programme windev.
    Donc je voulais savoir comment faire pour que ma DLL soit la même.

    Merci d'avance.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    111
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2008
    Messages : 111
    Points : 50
    Points
    50
    Par défaut
    J'ai précisé& dans mon code Windev le chemin de la DLL:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    resultat=AppelDLL32("P:\Projets C\rad studio\SNMP\SERVICE_AgentSnmp\Debug\FonctionSNMP.dll","getMib","1.3.6.1.4.1.5.3.0")
    Mais je n'arrive pas à récupérer dans mon code la valeur passer en paramètre.
    En gros je passe un valeur dans une fonction de la DLL appeler sous Windev qui doit être récupérer dans un code c++.

    Voici ce que je fait pour récupérer la valeur:
    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
    HANDLE FileMapping;
    	LPVOID memory = NULL; // pointer to shared memory
     
    	FileMapping=OpenFileMapping(FILE_MAP_READ, //Access Mode: read
    					true,
    					TEXT("dllmemfilemap")); // name of map object
     
    	// Get a pointer to the file-mapped shared memory
    	 memory = MapViewOfFile(
    				FileMapping,     // object to map view of
    				FILE_MAP_WRITE, // read/write access
    				0,              // high offset:  map from
    				0,              // low offset:   beginning
    				0);             // default: map entire file
     
     
    	 if (memory == NULL)
    	 {
    		numberAgent = 999;
    	 }
             else
             {
                    numberAgent = (unsigned int) memory;
             }
     
    	return numberAgent;
    Memory est NULL.
    J'espère avoir été clair et que je ne fais pas n'importe quoi

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    111
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2008
    Messages : 111
    Points : 50
    Points
    50
    Par défaut
    J'ai fait un getLastError() et il me dit que l'accès à la zone mémoire est refusé.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    111
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2008
    Messages : 111
    Points : 50
    Points
    50
    Par défaut
    Après avoir réalisé quelques modifications, j'obtiens une valeur non nul mais qui n'est pas la valeur souhaité.

  8. #8
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Comment sais-tu que ce n'est pas la valeur souhaitée ? La mémoire partagée n'a pas obligatoirement la même adresse dans les deux processus...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    111
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2008
    Messages : 111
    Points : 50
    Points
    50
    Par défaut
    Je le sais car je passe une certaine valeur dans Windev qui est stocké dans la DLL. Mais quand je lis cette valeur dans mon programme en C++, la valeur est différente.

  10. #10
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     numberAgent = (unsigned int) memory;
    Ne lit pas la valeur mémorisée.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    111
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2008
    Messages : 111
    Points : 50
    Points
    50
    Par défaut
    On fait comment alors pour lire la valeurs?

  12. #12
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    unsigned int * pUInt = static_cast< unsigned int * >(memory);
    numberAgent = *pUInt;
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  13. #13
    Membre éprouvé
    Avatar de Spout
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2007
    Messages : 904
    Points : 1 067
    Points
    1 067
    Par défaut
    memory est un LPVOID, donc un pointeur sur quelque chose dont tu ne connais pas le type. Donc certes il faut caster la valeur pour la lire en unsigned int, mais en faisant ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    numberAgent = (unsigned int) memory;
    tu ne castes pas la valeur mais son adresse!
    Tu dois faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    numberAgent = static_cast<unsigned int>(*memory);
    EDIT : grillé
    EDIT2: correction d'erreur par Médinoc
    "L'ordinateur obéit à vos ordres, pas à vos intentions." [Anonyme]

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    111
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2008
    Messages : 111
    Points : 50
    Points
    50
    Par défaut
    Ok, merci je testerai.

  15. #15
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    111
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2008
    Messages : 111
    Points : 50
    Points
    50
    Par défaut
    J'ai modifier mon code source, mais il ne veut pas compiler :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    numberAgent = static_cast<unsigned int>(*memory);
    [BCC32 Erreur] RAG.cpp(93): E2109 Ce n'est pas un type autorisé

  16. #16
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    C'est parce que tu as pris la ligne erronée de Spout au lieu de la ligne correcte.
    Note la position des deux étoiles:
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    numberAgent = *static_cast< unsigned int * >(memory);
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  17. #17
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Salut,
    Qt as maintenant un class pour faire des truc comme cela :
    http://qt.developpez.com/doc/latest/...y.html#details

    comme les sources sont téléchargeable, tu pourrais peut être voire comment ils font.

  18. #18
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    111
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2008
    Messages : 111
    Points : 50
    Points
    50
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    C'est parce que tu as pris la ligne erronée de Spout au lieu de la ligne correcte.
    Note la position des deux étoiles:
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    numberAgent = *static_cast< unsigned int * >(memory);

    I'm sorry

  19. #19
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    111
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2008
    Messages : 111
    Points : 50
    Points
    50
    Par défaut
    Citation Envoyé par Mongaulois Voir le message
    Salut,
    Qt as maintenant un class pour faire des truc comme cela :
    http://qt.developpez.com/doc/latest/...y.html#details

    comme les sources sont téléchargeable, tu pourrais peut être voire comment ils font.
    je vais y jeter un coup d'oeil.

  20. #20
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    111
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2008
    Messages : 111
    Points : 50
    Points
    50
    Par défaut
    C'est génial ça fonctionne .
    Merci à tous.

    Par contre j'aimerai comprendre la ligne de code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    numberAgent = *static_cast< unsigned int * >(memory);
    <unsigned int *> je suis tenté de sire que l'on accède au contenu de memory.
    Mais je n'ai jamais vu <> entouré un type de donné. Qu'est que c'est?

    Alors après le *staic_cast, serai pour transtyper l'adresse.


+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. communication entre deux programmes
    Par Invité dans le forum C
    Réponses: 19
    Dernier message: 12/10/2008, 12h07
  2. Interférence entre deux programmes
    Par eyquem dans le forum Général Python
    Réponses: 1
    Dernier message: 01/06/2008, 15h10
  3. Débutant, Communication entre deux programmes
    Par Madalen dans le forum Langage
    Réponses: 5
    Dernier message: 23/05/2007, 22h27
  4. [TP] Echanger des données entre deux programmes
    Par ILIAS Raphaël dans le forum Turbo Pascal
    Réponses: 3
    Dernier message: 22/03/2005, 09h31
  5. TList partagée entre deux process.
    Par swirtel dans le forum C++Builder
    Réponses: 2
    Dernier message: 10/01/2005, 11h48

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