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 :

puis-je créer moi même un objet HINSTANCE ?


Sujet :

C

  1. #21
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Décembre 2006
    Messages : 29
    Par défaut
    OK, je ne connais pas le nom de la dll. J'ai essayé d'avoir ce nom mais la fonction GetModuleFileName() requiert un hinstance en paramètre ...

    J'ai lu aussi que je pouvais créer un thread et mettre la boucle d'attente de messages dans ce thread. Est ce une piste à suivre à votre avis?

    Merci encore!

  2. #22
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 408
    Par défaut
    Ah, pardon le lien que je croyais avoir vu ici, était en réalité sur les résultats de ma recherche google :
    http://www.codeguru.com/cpp/w-p/dll/...cle.php/c3635/
    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.

  3. #23
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Décembre 2006
    Messages : 29
    Par défaut
    C'est exactement mon problème! Merci.
    Le compilo gcc ne connait pas l'opérateur reinterpret_cast.
    Ca doit être du C++... Je vais voir comment le remplacer...

  4. #24
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 408
    Par défaut
    Tu le remplaces par un bète cast C : (HINSTANCE)
    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.

  5. #25
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Décembre 2006
    Messages : 29
    Par défaut
    Ca à l'air de fonctionner...
    Pour résumer, voici le code d'une fonction utile lorsqu'on veut récupérer le HINSTANCE (équivalent à HMODULE) d'une dll dont on ne connait pas le nom à priori :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        HMODULE GetCurrentModule()
        {
            MEMORY_BASIC_INFORMATION mbi;
            static int dummy;
            VirtualQuery( &dummy, &mbi, sizeof(mbi) );
            return (HMODULE)(mbi.AllocationBase);
        }
    Merci encore pour le lien!
    Bon je continue avec ma fenêtre...

  6. #26
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Décembre 2006
    Messages : 29
    Par défaut
    Je ne vois toujours pas la fenêtre.
    Je pense qu'il y a un problème avec la boucle des messages, mais je me demande si je ne devrai pas voir ma fenêtre, ne serait-ce qu'un instant avec le code suivant : ?
    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
     
        SMASH_Message(">>>       FINAL SECTION     <<<\n");
        // on récupère le HINSTANCE du module en cours
        hinstance = GetCurrentModule();
        SMASH_Message("hinstance : %d\n",(int)hinstance);
     
        //Affichage du nom du module
        LPTSTR hmodule_name[100];
        GetModuleFileName(hinstance,hmodule_name, 100);
        SMASH_Message(&hmodule_name);
        SMASH_Message("\n");
     
        // on crée puis rempli la structure de type classe 
        wc.style = 0;
        wc.lpfnWndProc = MainWndProc;
        wc.cbClsExtra = 0;
        wc.cbWndExtra = 0;
        wc.hInstance = NULL;
        wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
        wc.hCursor = LoadCursor(NULL, IDC_ARROW);
        wc.hbrBackground = (HBRUSH)(1 + COLOR_BTNFACE);
        wc.lpszMenuName =  NULL;
        wc.lpszClassName = "MaWinClass";
     
        // Enregistrement de la classe "MaWinClass"
        RegisterClass(&wc); // devrait suffire mais ...
        //if(!RegisterClass(&wc)) return FALSE; // ma fonction ne retoure rien -> je vire
     
        // on crée la fenêtre ppale
        hwnd = CreateWindow("MaWinClass",
                            "Titre",
                            WS_OVERLAPPED  ,
                            CW_USEDEFAULT,
                            CW_USEDEFAULT,
                            300,
                            300,
                            NULL,
                            NULL,
                            hinstance,
                            NULL);
     
        // ça non plus je ne vois pas bien à quoi ca sert -> un test de réussite peut-être
        //if (!hwnd) return FALSE; // ma fonction ne retoure rien -> je vire
     
        // affichage de la fenêtre
        int show;
        show=ShowWindow(hwnd, SW_SHOWNORMAL);
        SMASH_Message("win status : %d\n", (int)show);
     
        // rafraichissement de la fenêtre
        UpdateWindow(hwnd);
     
        // c'est sensé me catcher les messages (remplace la boucle avec GetMessage())
        PeekMessage(&msg, NULL, 0, 0,PM_REMOVE);
        TranslateMessage(&msg); 
        DispatchMessage(&msg);
        Sleep(3000);
     
        // boucle de traitement des messages
        //while (GetMessage(&msg, NULL, 0, 0))
        //{
        //    TranslateMessage(&msg);
        //    DispatchMessage(&msg);
        //}
    A quel moment la fenêtre est elle sensée s'afficher?
    Est ce que le problème peut encore venir du HMODULE?

    pour info, j'ai mis la fonction PeekMessage() car la boucle while avec GetMessage me bloquait la simulation.

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 408
    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.

  8. #28
    Membre émérite Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Par défaut
    Citation Envoyé par keenan
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    wc.hInstance = NULL;
    ...
    RegisterClass(&wc);
    N'est-ce pas gênant? D'après la doc, il faut:
    Citation Envoyé par Doc WNDCLASS
    hInstance: Identifies the instance that the window procedure of this class is within.
    EDIT: Grillé!

  9. #29
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Décembre 2006
    Messages : 29
    Par défaut
    Oui, ca fonctionne maintenant.
    C'est vrai que j'ai l'air ridicule, mais comme je l'ai dit plus haut, je me suis inspiré du tuto de Gci :
    http://chgi.developpez.com/windows/winmain/

    Si tu as encore un peu de temps, est ce que tu pourrais m'expliquer pourquoi dans son cas il met bien le hinstance de son objet WNDCLASS wc à NULL, et pas le hinstance du winmain() ?

    Merci pour l'aide

  10. #30
    Membre émérite Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Par défaut
    Citation Envoyé par keenan
    Si tu as encore un peu de temps, est ce que tu pourrais m'expliquer pourquoi dans son cas il met bien le hinstance de son objet WNDCLASS wc à NULL, et pas le hinstance du winmain() ?
    Je pense que c'est une erreur. D'ailleurs, l'erreur est juste commise dans le code complet; plus haut (dans la partie "Création de la fenêtre"), c'est correct.

  11. #31
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Décembre 2006
    Messages : 29
    Par défaut
    OK mais le code compile, alors pourquoi? POURQUOIIIIIIII ?!!!

  12. #32
    Membre émérite Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Par défaut
    Citation Envoyé par keenan
    OK mais le code compile, alors pourquoi? POURQUOIIIIIIII ?!!!
    Le compilateur n'a pas à détecter ce genre d'erreurs (une variable de type HINSTANCE peut valoir NULL). En revanche, ça ne marchera peut-être pas à l'exécution.

  13. #33
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Décembre 2006
    Messages : 29
    Par défaut
    SISI, je l'ai compilé tel quel dans devC+, et il tourne...
    J'ai contacté CGi, pour en savoir plus...

Discussions similaires

  1. Réponses: 2
    Dernier message: 03/07/2006, 20h14
  2. [Reflect] Créer un array d'objets avec le nom de leur classe
    Par Onarap dans le forum API standards et tierces
    Réponses: 18
    Dernier message: 12/06/2006, 12h24
  3. Créer une liste d'objets statiques dans une classe
    Par crossbowman dans le forum C++
    Réponses: 3
    Dernier message: 13/03/2006, 09h11
  4. comment puis-je créer un BDD en fichier texte
    Par slyder dans le forum Bases de données
    Réponses: 2
    Dernier message: 19/01/2005, 10h05

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