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

Bibliothèques C++ Discussion :

Créer une fenêtre principale depuis une DLL


Sujet :

Bibliothèques C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Sans emplois
    Inscrit en
    Août 2014
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Sans emplois
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2014
    Messages : 19
    Par défaut Créer une fenêtre principale depuis une DLL
    Bonjour/Bonsoir;

    Voilà, je viens vers vous car je ne trouve aucune solution.

    Voici mon "petit" problème: j'essaye de créer une fenêtre principale depuis une DLL. J'ai construis la DLL d'après un tuto que j'ai trouvé sur Internet (source MSDN: https://msdn.microsoft.com/fr-fr/library/ms235636.aspx). Elle fonctionne super bien. J'ai fais quelques modifications et tout ce passe toujours très bien.

    Je vous poste les codes complet des deux fichiers de la DLL:

    Le fichier header:

    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
    // anuCore.h
     
    #ifdef ANUCORE_EXPORTS
    #define ANUCORE_API __declspec(dllexport) 
    #else
    #define ANUCORE_API __declspec(dllimport) 
    #endif
     
    //Liste des fichiers inclu
     
    #include <Windows.h>
     
    //La class de base
     
    namespace Anubisas
    {
    	// This class is exported from the MathFuncsDll.dll
    	class clsWindows
    	{
    	public:
     
    		static ANUCORE_API HWND acCreateW(HINSTANCE hInst);
    	};
    }
    Et le fichier cpp:

    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
    // anuCore.cpp: Code de toutes les focntions de la DLL
     
    #include "stdafx.h"
    #include "anuCore.h"
    #include <stdexcept>
     
    using namespace std;
     
    namespace Anubisas
    {
     
    	HWND clsWindows::acCreateW(HINSTANCE hInst)
    	{
    		HWND hWnd(NULL);
    		WNDCLASS wc;
     
    		wc.style = 0;
    		wc.lpfnWndProc = NULL;
    		wc.cbClsExtra = 0;
    		wc.cbWndExtra = 0;
    		wc.hInstance = hInst;
    		wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    		wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    		wc.hbrBackground = (HBRUSH)(COLOR_3DFACE + 1);
    		wc.lpszMenuName = NULL;
    		wc.lpszClassName = L"MaWinClass";
     
    		if (!RegisterClass(&wc)) return FALSE;
     
    		hWnd = CreateWindow(L"MaWinClass", L"Titre", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 400, 300, NULL, NULL, hInst, NULL);
     
    		return hWnd;
    	}
    }
    Tout compile très bien sans même le moindre warning...

    Mais, avec l'aide des points d'arrêt, quand j'arrive à l’instruction CreateWindow, j'ai une violation d'acccès mémoir. mon IDE, VS 2015, me dit que la variable hWnd est toujours à NULL. Donc, le code plante au niveau de l'appel de CreateWindow.

    Je vous place également le code de mes deux fichier de l'application de test.

    Le fichier header:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    #pragma once
     
    #include <Windows.h>
     
    #include "anuCore.h"
    Et le fichier cpp:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    #include "main.h"
     
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nCmdShow)
    {
     
    	//Point d'entré de l'application
     
    	HWND hWnd(NULL);
     
    	hWnd = Anubisas::clsWindows::acCreateW(hInstance);
     
    	return 0;
    }
    Voilà, j'espère que la description de l'erreur vous permettra de m'aider car là, je ne comprend vraiment pas. Est ce un problème d'instance d'application?

    Merci d'avoir prit le temps de lire ce post, et merci pour vos futures réponses.

    Bien à vous, Anubisas.

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    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 395
    Par défaut
    Ta classe de fenêtre n'a pas de WindowProc...
    De plus, le HINSTANCE ne devrait pas être passé par l'appelant, mais mémorisé en variable globale lors du DllMain() (il faut que ce soit le HMODULE de la DLL).
    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. #3
    Membre averti
    Homme Profil pro
    Sans emplois
    Inscrit en
    Août 2014
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Sans emplois
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2014
    Messages : 19
    Par défaut
    Bonjour,

    Avant toutes chose, merci de ta réponse Médinoc. Je me doutais bien que passer l'instance du projet de test n'était pas une bonne idée.

    Oui, je sais qu'il n'y à pas la MainProc, je fais toujours quelques test avant d'avoir trop de code à vérifier.

    Comment je puis récupérer le HMODULE? Je ne pense pas avoir de DLLMain(). Je lie ma DLL en référence dans mon application de test.

    Je sais pas si c'est la meilleur méthode, mais c'est la seul que je connaisse.

    Aurais tu des tutos plus évoluer à me proposer afin de mieux développer mes connaissances?

    Merci d'avance

  4. #4
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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 599
    Par défaut
    Citation Envoyé par Anubisas Voir le message
    Oui, je sais qu'il n'y à pas la MainProc, je fais toujours quelques test avant d'avoir trop de code à vérifier.
    La création plantera tant qu'il n'y a pas de MainProc.
    Citation Envoyé par Anubisas Voir le message
    Comment je puis récupérer le HMODULE? Je ne pense pas avoir de DLLMain(). Je lie ma DLL en référence dans mon application de test.

    Je sais pas si c'est la meilleur méthode, mais c'est la seul que je connaisse.
    Normalement, il suffit de créer la fonction DLLMain() dans ta DLL, elle sera automatiquement appelée au chargement de la DLL. Tu recevras le HMODULE sous la forme d'un HINSTANCE.

    Il faudra aussi écrire la "pump message loop" dans le WinMain sinon ta fenêtre ne sera pas vivante.

  5. #5
    Membre averti
    Homme Profil pro
    Sans emplois
    Inscrit en
    Août 2014
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Sans emplois
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2014
    Messages : 19
    Par défaut
    Merci de vos réponses, cela m'aide beaucoup quand même.

    Merci pour le HMODULE, je vais voir cela. La "pump message loop", c'est la boucle de message? Si oui, l'écrire dans la WinMain de l'application "cliente"?

    J'oubliais presque. La "pump message loop" écrite dans la WinMain, il faut que je la spécifie dans le descripteur de la class, dans WNDCLASS, non?

  6. #6
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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 599
    Par défaut
    Citation Envoyé par Anubisas Voir le message
    La "pump message loop", c'est la boucle de message? Si oui, l'écrire dans la WinMain de l'application "cliente"?

    J'oubliais presque. La "pump message loop" écrite dans la WinMain, il faut que je la spécifie dans le descripteur de la class, dans WNDCLASS, non?
    Le thread principal, s'il n'a rien de spécial à faire doit faire vivre les fenêtres.
    Il n'y a rien de à faire dans la class à ma connaissance
    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
        MSG msg;
        BOOL bRet;
        while( (bRet = GetMessage( &msg, NULL, 0, 0 )) != 0) // prendre le message en attente pour toute fenêtre  
        // avec un PeekMessage() on peut mettre en place p.e. une tache effectuée en fond
        {
            if ( bRet == -1 )
            {
                // message d'anomalie, quitter l'appli ou le traiter
                break;
            }
            else
            {
                // ici on peut traiter des actions qui dépendent de la fenêtre
                // puis toujours faire :
                TranslateMessage( &msg );  // gérer les messages spéciaux (p.e. touche clavier => caractères reçu par fenêtres)
                DispatchMessage( &msg );   // envoyer à la fenêtre destinataire, le message
            }
        } 
        // On a reçu un WM_EXIT, quitter l'application 
        return msg.wParam;

  7. #7
    Membre averti
    Homme Profil pro
    Sans emplois
    Inscrit en
    Août 2014
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Sans emplois
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2014
    Messages : 19
    Par défaut
    Citation Envoyé par dalfab Voir le message
    La création plantera tant qu'il n'y a pas de MainProc.
    Normalement, il suffit de créer la fonction DLLMain() dans ta DLL, elle sera automatiquement appelée au chargement de la DLL. Tu recevras le HMODULE sous la forme d'un HINSTANCE.

    Il faudra aussi écrire la "pump message loop" dans le WinMain sinon ta fenêtre ne sera pas vivante.
    Bonjour/bonsoir;

    Petite question: ma fonction DLLMain() doit elle se trouver dans un fichier à part où je peux la définir directement dans ma classe en membre privé afin que l'utilisateur ne puisse pas y accéder sauf en lecture grâce à une fonction GetModInst()?

    GetModInst() serra bien sur une fonction que j'écrirai moi même dans la classe, cela va sans dire ^^

    Merci d'avance.

  8. #8
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    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 395
    Par défaut
    DllMain() doit être une fonction libre globale à la DLL, mais non-exportée.
    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.

Discussions similaires

  1. Créer une fenêtre Windows depuis une application console
    Par khayyam90 dans le forum Contribuez
    Réponses: 0
    Dernier message: 28/12/2010, 23h56
  2. Réponses: 0
    Dernier message: 28/12/2010, 19h36
  3. Fermer fenêtre appelante depuis une fenêtre modale
    Par bobic dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 22/06/2009, 11h56
  4. Réponses: 6
    Dernier message: 12/08/2007, 11h10
  5. [SWT] Lancer une fenêtre SWT depuis une autre
    Par sunvialley dans le forum SWT/JFace
    Réponses: 12
    Dernier message: 21/04/2006, 17h22

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