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

Visual C++ Discussion :

Erreur lier à un static std::queue


Sujet :

Visual C++

  1. #1
    Membre habitué Avatar de awesomeman
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    166
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2015
    Messages : 166
    Points : 136
    Points
    136
    Par défaut Erreur lier à un static std::queue
    Bonjour,

    Je créer une classe KeyLoger qui utilise SetWindowsHookEx, celle ci a besoin d'une fonction ou d'une méthode static pour sa callback (2ième arg), voilà ce que ca donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    KeyLoger::KeyLoger()
    {
    	HHOOK KeyBoard = SetWindowsHookEx(WH_KEYBOARD_LL, &KeyLoger::KeyboardEvent, NULL, NULL);
    	HHOOK Mouse = SetWindowsHookEx(WH_MOUSE_LL, &KeyLoger::MouseEvent, NULL, NULL);
    }
    je dois utiliser une queue à l'intérieur de cette CallBack, le problème c'est que celle ci doit être déclaré en static également ..
    et c'est la que je me prends deux belles erreurs, ce qui est normal puisqu'une méthode statique n'a pas pour but d'accéder aux attribut de la classe, voici les erreurs :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LNK2001	symbole externe non résolu "private: static class std::queue<struct s_Keys,class std::deque<struct s_Keys,class std::allocator<struct s_Keys> > > KeyLoger::Keys" (?Keys@KeyLoger@@0V?$queue@Us_Keys@@V?$deque@Us_Keys@@V?$allocator@Us_Keys@@@std@@@std@@@std@@A)
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LNK1120	1 externes non résolus
    voilà ma classe :

    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
    typedef struct s_Keys
    {
    	int		Key;
    	bool	Ctrl = FALSE;
    	bool	Alt = FALSE;
    	bool	Shift = FALSE;
    	bool	Maj = FALSE;
    	bool	Altgr = FALSE;
     
    	int		PosX;
    	int		PosY;
     
    	int		timestamp;
    }t_Keys;
     
    class KeyLoger
    {
    public:
    	KeyLoger();
    	~KeyLoger();
     
    	static LRESULT CALLBACK KeyboardEvent(int nCode, WPARAM wParam, LPARAM lParam);
    	static LRESULT CALLBACK MouseEvent(int nCode, WPARAM wParam, LPARAM lParam);
    	static std::queue<t_Keys> GetKeys();
     
    	HHOOK KeyBoard;
    	HHOOK Mouse;
     
    private:
    	static std::queue<t_Keys> Keys;
    	static bool KeyIsPut();
    };

    et voilà comment j'utilise l'une des CallBack :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    LRESULT CALLBACK KeyLoger::KeyboardEvent(int nCode, WPARAM wParam, LPARAM lParam)
    {
    	PKBDLLHOOKSTRUCT p = (PKBDLLHOOKSTRUCT)lParam;
    	std::string str;
    	t_Keys		UltiKey;
    /*...............................................*/
            Keys.push(UltiKey);
    		}
    	}
    	return CallNextHookEx(NULL, nCode, wParam, lParam);
    Vu que je suis obligé d'utiliser mes Callback en statique, comment es ce que je peux accéder à mes attributs sans casse ..?
    Je ne vois plus trop vers quoi chercher ...

    dites moi si vous voulait des infos en plus !
    Merci pour votre aide

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Février 2005
    Messages : 5 073
    Points : 12 119
    Points
    12 119
    Par défaut
    ce qui est normal puisqu'une méthode statique n'a pas pour but d'accéder aux attribut de la classe, voici les erreurs :
    Bin non, si l'attribut est static, rien n'empêche son accès par une méthode statique.

    Ne pas confondre déclaration et définition.
    https://stackoverflow.com/questions/...private-static

  3. #3
    Membre habitué Avatar de awesomeman
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    166
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2015
    Messages : 166
    Points : 136
    Points
    136
    Par défaut
    Oui, sauf que j'obtiens l'erreur quand mon attribut Queue est en static ..
    Et puis j'aimerai bien utiliser la Queue dans une instance de ma classe, pas dans ma classe elle meme, Ce qui est impossible (je crois ?) dans une méthode static puisque celle ci ne fait référence à aucun objet .

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

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

    Informations forums :
    Inscription : Février 2005
    Messages : 5 073
    Points : 12 119
    Points
    12 119
    Par défaut
    Oui, sauf que j'obtiens l'erreur quand mon attribut Queue est en static ..
    Ne pas confondre déclaration et définition.(BIS)
    https://stackoverflow.com/questions/...private-static

    Et puis j'aimerai bien utiliser la Queue dans une instance de ma classe, pas dans ma classe elle meme, Ce qui est impossible (je crois ?) dans une méthode static puisque celle ci ne fait référence à aucun objet .
    Vous ne gérez qu'un clavier et une souris, je ne vois pas l'intérêt de votre fixette sur les instances, vu que cela serait plus proche du singleton qu'autre chose.
    C++ est multi-paradigme, il n'est pas qu'objet.
    Donc pour vous enquiquiner avec des instances de classe ???

    Si vous deviez gérer des trucs comme plusieurs claviers et faire des distinctions entre eux, etc ..., il est coutume de passer dans le paramètre "UserData" de la fonction d’enregistrement de callback un pointeur sur l'objet.
    Dans la fonction libre enregistrée en tant que callback, vous récupérez ce paramètre "UserData" que vous castez dans le type que vous utilisez, et vous pourrez appeler la ou les méthodes d'instance à partir de l'objet "récupéré" après le cast.

  5. #5
    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 519
    Points
    41 519
    Par défaut
    Au passage, les keyloggers ne vont-ils pas à l'encontre de la charte du forum?
    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.

  6. #6
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 565
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 565
    Points : 7 648
    Points
    7 648
    Par défaut
    La std::queue<> est static, donc une fonction static peut tout à fait accéder.
    L'erreur ici vient du fait que la std::queue<> est déclarée mais jamais définie. Il faut mettre dans un cpp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::queue<t_Keys> KeyLoger::Keys;

  7. #7
    Membre habitué Avatar de awesomeman
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    166
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2015
    Messages : 166
    Points : 136
    Points
    136
    Par défaut
    Merci pour vos réponses et désolé de ne pas avoir répondu plus tot .
    J'ai réussi à régler mon problème il y a deux jours grace aux lien de bacelar :
    Ne pas confondre déclaration et définition.
    https://stackoverflow.com/questions/...private-static
    Merci aussi dalfab, meme si j'ai vu ta réponse un peu tard ..

    Au passage, les keyloggers ne vont-ils pas à l'encontre de la charte du forum?
    C'est un projet scolaire, rien de bien méchant, surtout si ce "Keylogger" est visible dans le task manager ..

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

Discussions similaires

  1. mutex ou ne pas mutex, doit-on protéger les std::queue
    Par bleuerouge dans le forum SL & STL
    Réponses: 3
    Dernier message: 20/07/2008, 18h28
  2. static std::<vector> c'est possible?
    Par Krishna dans le forum C++
    Réponses: 6
    Dernier message: 03/06/2008, 11h40
  3. Erreur avec Typedef et std
    Par leCcsympas dans le forum SL & STL
    Réponses: 2
    Dernier message: 16/04/2007, 20h43
  4. Erreur de compilation sur std::string avec Dev C++
    Par dada57 dans le forum Dev-C++
    Réponses: 4
    Dernier message: 20/03/2006, 18h06

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