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

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  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 504
    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 504
    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 504
    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 504
    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