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

MFC Discussion :

lecture à l'init / redemarrer application


Sujet :

MFC

  1. #1
    Membre averti
    Inscrit en
    Octobre 2007
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 37
    Par défaut lecture à l'init / redemarrer application
    bonjour a tous,

    j'ai une application basée sur une CDialog. J'utilise une dll qui utilise une valeur de la base de registre. je n'ai aucun accès à la lecture de cette valeur par la dll. je pense qu'elle est lue à l'init du programme.

    j'ai écrit une code qui change la valeur de la base de registre et il n'y a pas de problème à ce niveau.

    Le problème, c'est que la dll utilise toujours la valeur de démarrage dans la base de registre. J'ai beau la changer, elle prend toujours la première valeur. Par contre, si je change la valeur, que je ferme mon appli et que je la relance, elle prend bien la nouvelle valeur...

    du coup, j'aimerai faire un code qui me permette de relancer mon appli pour lire directement la nouvelle valeur mais je ne sais pas comment faire. Et je n'ai rien vu dans la faq a ce sujet.

    si vous pensez qu'il y a une meilleure solution, je suis aussi preneur, mais pour le moment, je ne vois pas...

    merci

  2. #2
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    salut ce n'est pas très clair,
    le programme doit bien communiquer la valeur a la dll,
    lors de l'écriture de la nouvelle valeur dans la base de registres, la transmission de cette nouvelle valeur (par une méthode ?) vers la dll n'est pas effectuée.

  3. #3
    Membre averti
    Inscrit en
    Octobre 2007
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 37
    Par défaut
    la dll permet de vérifier les ports série disponibles sur les cartes d'acquisition d'image présentes sur le pc.

    j'ai mis en pièce jointe les fichiers :
    - clallserial.h
    - clallserial.lib à ajouter dans le projet.

    le fichier clallserial.dll est installé dans C:\windows\system32\ et est la dll générale pour toutes les cartes d'acquisition.
    le fichier clsernat.dll est normalement situé dans C:\CameraLink\Serial\ et est la dll associé à une carte spécifique

    la clé dans la base de registre dans HKEY_LOCAL_MACHINE\SOFTWARE\CameraLink\
    nom : CLSERIALPATH
    type : REG_SZ
    valeur : C:\CameraLink\Serial ou C:\Program Files\CameraLink\Serial ou C:\Windows\System32


    voila ma classe qui verifie les port disponibles :

    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
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    struct ClSerialPortInfo
    {
    	unsigned int SerialIndex;
    	char ManufacturerName[MAX_PATH];
    	unsigned int NameBytes;
    	char port_ID[MAX_PATH];
    	unsigned int IDBytes;
    	unsigned int Version;
    	unsigned int PortState;
    };
     
     
    class __declspec(dllexport) ClSerialPorts  
    {
    private:
     
    	void Init();
    	int	ClGetNumPorts(unsigned int *NbPort);
    	int ClGetPortInfo(unsigned int SerialIndex,ClSerialPortInfo *SerialPortInfo);
    	unsigned int m_SerialPortNumber;		//Max number of serial port
    	ClSerialPortInfo *m_pSerialPortInfo;
     
    public :
     
    	unsigned int GetSerialPortNumber();
    	ClSerialPortInfo* GetClSerialPortInfo();
     
    	ClSerialPorts();
    	virtual ~ClSerialPorts();
    };
     
     
     
    ClSerialPorts::ClSerialPorts()
    {
    	Init();
    }
     
    void ClSerialPorts::Init()
    {
    	void *SerialRefPtr;
    	ClGetNumPorts(&m_SerialPortNumber);                          //je pense que c'est ici où on utilise la première fois la dll.
    	m_pSerialPortInfo = new ClSerialPortInfo[m_SerialPortNumber];
    	for (unsigned int i = 0; i < m_SerialPortNumber; i++)
    	{
    		ClGetPortInfo(i,&m_pSerialPortInfo[i]);
    		m_pSerialPortInfo[i].PortState = clSerialInit (m_pSerialPortInfo[i].SerialIndex,&SerialRefPtr);
    		clSerialClose(SerialRefPtr);
    	}
    }
     
    int	ClSerialPorts::ClGetNumPorts(unsigned int *NbPort)
    {
    	int i;
    	i = clGetNumPorts(NbPort);
    	return i;
    }
     
    int ClSerialPorts::ClGetPortInfo(unsigned int SerialIndex,ClSerialPortInfo *SerialPortInfo)
    {
    	int i;
    	SerialPortInfo->SerialIndex = SerialIndex;
    	i = clGetPortInfo(SerialPortInfo->SerialIndex,SerialPortInfo->ManufacturerName,&SerialPortInfo->NameBytes,SerialPortInfo->port_ID,&SerialPortInfo->IDBytes,&SerialPortInfo->Version);
    	return i;
    }
     
    ClSerialPorts::~ClSerialPorts()
    {
    	delete m_pSerialPortInfo;
    }
     
    unsigned int ClSerialPorts::GetSerialPortNumber()
    {
    	return m_SerialPortNumber;
    }
     
    ClSerialPortInfo* ClSerialPorts::GetClSerialPortInfo()
    {
    	return m_pSerialPortInfo;
    }
    quand je crée un objet ClSerialports, j'obtiens immédiatement la liste de tous les ports disponibles avec leurs status. Suivant la valeur de CLSERIALPATH dans la base de registre, "ClGetNumPorts(&m_SerialPortNumber);" donne zéro ou non zéro.

    Exemple :

    j'ai 2 cartes d'acquisition dans mon pc, carte A et carte B. sur A, il y a 1 port série, sur B il y en a 2.
    à l'install de la carte A, CLSERIALPATH devient "C:\Program Files\CameraLink\Serial" par exemple pour pointer le fichier "C:\Program Files\CameraLink\Serial\ClSerA.dll"
    Si je lance mon appli, j'ai bien 1 port série.

    maintenant, j'installe B. CLSERIALPATH peut devenir "C:\CameraLink\Serial"pour pointer le fichier "C:\CameraLink\Serial\ClSerB.dll", ça dépend des constructeur de carte qui respectent la norme ou pas...
    Si je lance mon appli, j'ai 2 port série, les 2 de B mais pas celui de A.

    maintenant, je mets "C:\windows\system32\" dans CLSERIALPATH.
    quand je lance mon appli, j'ai bien les 3 ports, celui de A et les 2 de B.

    enfin, je lance mon appli avec "C:\windows\system32\" au démarrage, j'ai bien mes 3 ports. je change la valeur de CLSERIALPATH puis je recrée un objet ClSerialPorts. J'ai toujours les 3 meme ports, même en mettant une valeur qui n'a rien a voir comme un string vide...

    dans tous les cas, il faut que je redémarre mon programme au moins une fois pour changer la valeur. et puis dans le cas ou la bonne dll n'est pas trouvé avec C:\windows\system32\, je veux pouvoir définir le chemin à la main de la dll utilisée.

    Maintenant, je ne vois pas exactement quand la valeur est envoyée a la dll, mais j'ai mis tous les outils à ma disposition dans ce post.


    [edit] je viens de m'apercevoir que les dll A et B sont aussi présentes dans "C:\windows\system32\"
    Fichiers attachés Fichiers attachés

  4. #4
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 449
    Par défaut
    Moi, je pense que la clé de registre est lu au moment du chargement de dll dans l'espace mémoire de l'exécutable.
    C'est facile à vérifier.
    Il suffit de RegMonitor (www.sysinternals.com) pour monitorer les accès à la base de registre et de charger et décharger dynamiquement la dll (via fonction Win32 loadlibrary et freelibrary) plusieurs fois dans un exécutable.
    Si la lecture de la clé de registre correspond au chargement de la dll via loadlibrary, mon hypothèse sera vérifiée.

    Dans se cas là, il sera plus simple et plus fiable de décharger puis recharger la dll dans votre exécutable plutôt que d'arrêter et redémarrer votre programme.

  5. #5
    Membre averti
    Inscrit en
    Octobre 2007
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 37
    Par défaut
    alors, je viens de regarder avec RegMonitor et il s'avère que la valeur de la base de registre est lue à la création du premier objet "ClSerialPorts", au premier appel de "ClGetNumPorts(&m_SerialPortNumber);"

    Après, quand je recrée un autre objet, la valeur n'est pas relue. Comment je peux faire pour "forcer" la relecture de la valeur?

    merci pour votre aide

  6. #6
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 449
    Par défaut
    Avez-vous essayé de déchargé les dll puis de la recharger ?

    Vue votre code "ClGetNumPorts(&m_SerialPortNumber);", l'API de votre dll est en C++ et pas en C ?
    Ca risque d'être coton de la charger et de la décharger avec LoadLibrary et FreeLibrary.

Discussions similaires

  1. Réponses: 4
    Dernier message: 23/10/2006, 16h17
  2. Redemarrer l'application en cours
    Par jagboys dans le forum MFC
    Réponses: 1
    Dernier message: 28/05/2006, 17h27
  3. Redemarrer l'application, possible ?
    Par Baptiste Wicht dans le forum Général Java
    Réponses: 6
    Dernier message: 17/10/2005, 22h07
  4. Réponses: 8
    Dernier message: 18/08/2005, 18h42
  5. [Exécution] Redémarrer mon application
    Par Samanta dans le forum Général Java
    Réponses: 3
    Dernier message: 11/07/2005, 16h38

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