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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    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 puis-je créer moi même un objet HINSTANCE ?
    Bonjour!

    Je voudrai qu'une fonction compilée dans une dll par gcc puisse m'ouvrir une fenêtre windows, avec des infos dedans.
    La dll qui est crée est appellée par un programme-tiers.
    Débutant avec l'API windows, je me suis inspiré du tuto http://chgi.developpez.com/windows/.
    La différence avec ce que je veuw faire est qu'il y a un main! Par conséquent je n'ai pas trop su quoi faire des arguments de la fonction WinMain() et j'ai fait ca :

    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
     
    #include "windows.h"
        HWND hwnd;
        WNDCLASS wc;
        MSG msg;
        HINSTANCE hinstance;
        int nCmdShow;
        LRESULT CALLBACK MainWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
        {
            switch (uMsg)
            {
                case WM_CREATE:
                    return 0;
                case WM_DESTROY:
                    PostQuitMessage(0);
                    return 0;
                default:
                return DefWindowProc(hwnd, uMsg, wParam, lParam);
            }
        }
    Le machin compile mais au moment du run ça plante, et je pense que ca vient de l'objet HINSTANCE...
    Qu'en pensez vous?
    Comment faire pour afficher cette satanée fenêtre ?

  2. #2
    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
    Pourriez-vous poster votre code de création de la fenêtre?

  3. #3
    Rédacteur
    Avatar de Neitsa
    Homme Profil pro
    Chercheur sécurité informatique
    Inscrit en
    Octobre 2003
    Messages
    1 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur sécurité informatique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 041
    Par défaut
    Bonjour,

    le code ci-dessus est le code de la DLL ou du programme ?

    la fonction de DialogProc (ici "MainWndProc") est, comme indiqué dans le code, une fonction de rappel (callback) il faut donc quelle soit appelée par une fenêtre (on fourni le pointeur vers la DialogProc lors de la création de la fenêtre).

    Pour que ça fonctionne il faut de toute manière créé la fenêtre (dans Winmain ou ailleurs, peu importe) quelque part.

  4. #4
    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 le code de la fonction d'où je souhaite créer la fenêtre.

    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
     
    DLL_EXPORT void Initial
    (ABCD_MODULE  *inModule,
     ANALYSISTYPE  analysis,
     double        simtime,
     double        displaystep,
     double        timestep,
     double        h_prime,
     double        omega,
     double       *vt,
     double       *vtm1,
     double       *vt_react,
     double       *vtdc,
     double      **hist,
     short        *histreq,
     double       *printtime,
     double        temperature,
     int           dnode,
     short         stvidx,
     char         *noisefilename)
    {
    /* from [INITIAL] section */
        // 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_OVERLAPPEDWINDOW,
                              CW_USEDEFAULT,
                              CW_USEDEFAULT,
                              400,
                              300,
                              NULL,
                              NULL,
                              hinstance,
                              NULL);    
     
        // ca non plus je ne voispas 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
        ShowWindow(hwnd, nCmdShow);
        // rafraichissement de la fenêtre
        UpdateWindow(hwnd);
        // test
        SMASH_Message("init ok\n");
        // la boucle qui catche les msgs -> on dirai que c'est elle qui plante le tout
        while (GetMessage(&msg, NULL, 0, 0))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
     
        // pas sur que ca soit utile, vu qu'on a pas de main
        //return msg.wParam;
     
    }
    Pour préciser un peu le problème, ce que je souhaite faire, c'est effectuer des opérations, afficher des choses à l'écran pendant qu'un simulateur (smash) effectue des calculs. Chaque modèle est codé en C pour être compilé dans une dll. La fonction d'initialisation est appelée une fois en début de simu.

    Auriez vous des pistes pour m'orienter vers une solution efficace me permettant de lancer des processus à partir du simulateur? (des mots-clés ou liens vers des tutos me seraient bien utile car je démarre ...)
    Merci à vous!

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    Pour une DLL, la méthode la plus sûre est une variable globale.
    Il faut savoir que HMODULE et HINSTANCE ont tendance à se confondre plus ou moins.
    Aussi, tu peux utiliser le HMODULE passé en paramètre à DllMain(), le mémoriser dans une variable globale de la DLL et le réutiliser pour les fonctions demandant un HINSTANCE (notamment RegisterClass() et CreateWindow()).
    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
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    Citation Envoyé par Médinoc
    Il faut savoir que HMODULE et HINSTANCE ont tendance à se confondre plus ou moins.
    Citation Envoyé par MSDN : DllMain()
    hinstDLL :
    [in] Handle to the DLL module. The value is the base address of the DLL. The HINSTANCE of a DLL is the same as the HMODULE of the DLL, so hinstDLL can be used in calls to functions that require a module handle.
    Citation Envoyé par MSDN : [URL=http://msdn2.microsoft.com/en-us/library/aa383751.aspx]Windows Data Types[/URL]
    typedef HINSTANCE HMODULE;
    Citation Envoyé par MSDN : LoadImage()
    Note that as of 32-bit Microsoft Windows, an instance handle (HINSTANCE), such as the application instance handle exposed by system function call of WinMain, and a module handle (HMODULE) are the same thing.
    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.

  7. #7
    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
    Merci , je vais matter dans cette aide... et me calmer sur les posts ! (de toute façon pour le concours du plus gros posteur, j'ai trop de retard !)

  8. #8
    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
    Neitsa, j'ai quelques questions pour vous (toi...?)
    Citation Envoyé par Neitsa
    le code ci-dessus est le code de la DLL ou du programme ?
    En fait je ne code pas de "programme" à proprement parler : TOUT appartient à la dll de mon modèle (pour autant que je sache...)
    Citation Envoyé par Neitsa
    la fonction de DialogProc (ici "MainWndProc") est, comme indiqué dans le code, une fonction de rappel (callback) il faut donc quelle soit appelée par une fenêtre (on fourni le pointeur vers la DialogProc lors de la création de la fenêtre).
    Comment fonctionne une fonction de CALLBACK? Ou est le pointeur vers dialogproc et que représente t'il ?

    Citation Envoyé par Neitsa
    Pour que ça fonctionne il faut de toute manière créé la fenêtre (dans Winmain ou ailleurs, peu importe) quelque part.
    Oui, c'est le rôle de la fonction CreateWindow() dont je viens de poster le code non?

    Merci !

  9. #9
    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
    Medinoc,

    En fait il n'y a pas de dllmain() dans le code qui est généré. Je n'ai donc accès aucun objet HINSTANCE ou HMODULE.
    Est ce bien légal de déclarer soi même un objet HINSTANCE , même en tant que variable globale?

    yop!

  10. #10
    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
    Pourquoi ne pas récupérer le HINSTANCE de l'exécutable qui utilise la DLL?

  11. #11
    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 il doit bien avoir un dllmain() quelque part non?
    mmm, je n'ai pas accès à ce code, je ne code que des blocs en C, qui sont incorporés dans les fonctions de la dll.
    Je ne trouve pas de dllmain() dans les sources générés... C'est normal ca?
    Ôtez moi un doute... si il y a des fonctions qui retournent des DLLEXPORT, ca veut bien dire que c'est compilé dabs une dll non?

  12. #12
    Rédacteur
    Avatar de Neitsa
    Homme Profil pro
    Chercheur sécurité informatique
    Inscrit en
    Octobre 2003
    Messages
    1 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur sécurité informatique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 041
    Par défaut
    Citation Envoyé par keenan
    En fait je ne code pas de "programme" à proprement parler : TOUT appartient à la dll de mon modèle (pour autant que je sache...)
    D'accord, je comprend mieux

    Comment fonctionne une fonction de CALLBACK? Ou est le pointeur vers dialogproc et que représente t'il ?
    En fait la fonction de callback est passé à la création de la fenêtre ici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
       wc.lpfnWndProc = MainWndProc;
    Donc c'est bon

    Oui, c'est le rôle de la fonction CreateWindow() dont je viens de poster le code non?
    Oui d'accord maintenant que j'ai vu le code

    Pour GCC, il ne génère pas de Dllmain (le Dllmain est optionnel dans une DLL) il faut la mettre dans le source (et indiquer que c'est le point d'entrée de la DLL).

    Ensuite, j'ai pas mieux que Médinoc et Stephl.

    Tu récupères le HINST depuis Dllmain ou tu le passes à ta fonction "Initial" en le récupérant depuis ton programme, sachant que le Hinstance est l'adresse de ton module en mémoire. Ca devrait rouler....

    Ôtez moi un doute... si il y a des fonctions qui retournent des DLLEXPORT, ca veut bien dire que c'est compilé dabs une dll non?
    Euh, non. DLL_EXPORT ça indique juste que la fonction est exportée (visible depuis l'extérieur du module), ça n'est pas une valeur de retour. Tu dois avoir un #define DLL_EXPORT quelque part dans ton source, sûrement dans un fichier d'en-tête(*.h).
    Sinon, oui ça indique bien que c'est une DLL. (les exécutables n'exportent pas de fonctions)

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    Pour créer une fenêtre donc la WindowProc se trouve dans une DLL, tu as besoin du HINSTANCE de cette DLL, et pas un autre.

    Si tu n'as pu avoir le handle au chargement de la DLL, tu peux utiliser la seconde technique, moins sûre, qui consiste à faire un GetModuleHandle() avec le nom de la DLL.
    Naturellement, si tu changes le nom de la DLL sans le changer aussi dans le code, ça foirera...
    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.

  14. #14
    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
    En effet, il y a bien un header qui me dit ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #      define DLL_EXPORT     extern "C" __declspec(dllexport)
    Mais qu'est ce que ca peut bien vouloir dire? Est surtout a quoi ca va me servir ...

    Bon, j'aimerai bien savoir ou il y a une aide sur l'API windows, qui synthétise les différentes fonctions et qui me permettrai de m'en sortir un peu plus facilement par moi même...
    Est ce qu'il y a ça dans MSDN? A quelle Section ?(c'est un peu le fouilli ce msdn je trouve).
    N'y a t'il pas autre chose que MSDN pour trouver de la doc sur les fonctions de l'API windows ?

    Apparement GetModuleHandle() me retourne un HMODULE (pas un HINSTANCE), ca ne va m'embêter ca?
    Quelle différence y a t'il entre HINSTANCE et HMODULE ?
    Est ce qu'il y a un lien avec le process ID?
    .... ca en fait des questions ...!
    PLOUF!

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