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++

  1. #1
    Membre à l'essai
    Homme Profil pro
    Sans emplois
    Inscrit en
    Août 2014
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Sans emplois
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2014
    Messages : 19
    Points : 11
    Points
    11
    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 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
    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 à l'essai
    Homme Profil pro
    Sans emplois
    Inscrit en
    Août 2014
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Sans emplois
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2014
    Messages : 19
    Points : 11
    Points
    11
    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 é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
    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 à l'essai
    Homme Profil pro
    Sans emplois
    Inscrit en
    Août 2014
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Sans emplois
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2014
    Messages : 19
    Points : 11
    Points
    11
    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 é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
    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 à l'essai
    Homme Profil pro
    Sans emplois
    Inscrit en
    Août 2014
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Sans emplois
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2014
    Messages : 19
    Points : 11
    Points
    11
    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 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
    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.

  9. #9
    Membre à l'essai
    Homme Profil pro
    Sans emplois
    Inscrit en
    Août 2014
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Sans emplois
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2014
    Messages : 19
    Points : 11
    Points
    11
    Par défaut
    Ok, donc, je ne met pas cette fonction dans ma classe alors.

  10. #10
    Membre à l'essai
    Homme Profil pro
    Sans emplois
    Inscrit en
    Août 2014
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Sans emplois
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2014
    Messages : 19
    Points : 11
    Points
    11
    Par défaut
    Je sais, je suis un emmerdeur lol.

    Voilà, je viens de comprendre comment utiliser la fonction DLLMain(), c'est déjà un bon point. Cependant, je me retrouve avec une erreur que je ne comprend pas trop.

    Je me doute bien que la solution doit être toute bête mais j'avoue que cela me prend un peux la tête et que c'est pour cela que je viens vers vous.

    En deux mots, quand j'essaye de mettre la valeur de hModule dans ma valeur hInst, le compilateur me dit qu'il ne peut pas mettre une valeur de type HANDLE dans une valeur HINSTANCE. En relisant les réponses que vous m'avez déjà fournies, j'avais compris que je pouvais mettre cette valeur dans une variable globale afin de pouvoir l'utiliser dans la création de ma fenêtre.

    Voici le message d'erreur en question:

    Nom : err.jpg
Affichages : 401
Taille : 20,9 Ko

    Voici le message de la fenêtre de sortie à la compilation:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    1>------ Début de la génération*: Projet*: anucore, Configuration*: Debug Win32 ------
    1>  core.cpp
    1>d:\dropbox\visual_studio_2015\anucore\anucore\core.cpp(26): error C2440: '='*: impossible de convertir de 'HANDLE' en 'HINSTANCE'
    1>  d:\dropbox\visual_studio_2015\anucore\anucore\core.cpp(26): note: La conversion de 'void*' en pointeur vers non 'void' nécessite un cast explicite
    ========== Génération*: 0 a réussi, 1 a échoué, 1 mis à jour, 0 a été ignoré ==========
    Pourriez vous me dire où est ce que je me trompe. J'ajoute que j'ai mis la variable hInst en static après la capture d'écran.

    Merci d'avance.

    EDIT:

    C'est bon, j'ai résolu le problème

    Pour ceux qui aurons un jour envie de tenter la procédure voici mon core.cpp, c'est le fichier principal de ma dll.

    Je 'ai fais qu'ajouter un cast à ma variable globale pour que l'erreur de se passe plus. Je suppose qu'il doit surement encore y avoir de petite erreur mais l'affichage de la fenêtre ce fait sans soucis.
    Si vous avez des remarques, je prend bien sur ^^

    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
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
     
    /*
    Ce fichier va contenir toutes les informations utile au chargement de la DLL
     
    Auteur:			Anubisas
    Création:			27 janvier 2017
    Modification:		27 janvier 2017
     
    */
     
    #include "header\core.h"
     
    #include <stdexcept>
     
    //Variables et constantes globales
     
    static HINSTANCE hInst = NULL;
     
    using namespace std;
     
    BOOL APIENTRY DllMain(HANDLE hModule, DWORD  ul_reason_for_call, LPVOID lpReserved)
    {
    	switch (ul_reason_for_call) {
    	case DLL_PROCESS_ATTACH:
    		//Attachement d'un processuse
     
    		hInst = (HINSTANCE)hModule;
     
    		break;
    	case DLL_THREAD_ATTACH:
    		//Attachement d'un thread
    		break;
    	case DLL_THREAD_DETACH:
    		//Détachamemet d'un thread
    		break;
    	case DLL_PROCESS_DETACH:
    		//Détachamemet d'un processuse
     
    		hInst = NULL;
     
    		break;
    	}
    	return TRUE;
    }
     
    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);
    	}
    }
     
    namespace Anubisas
    {
     
    	void clsWindows::acCreateW(int nCmdShow)
    	{
     
    		MessageBox(NULL, L"Et nous voici dans la création de la fenêtre", L"Anucore.dll: init", MB_ICONINFORMATION | MB_OK);
     
    		HWND hwnd = NULL;
    		MSG msg;
    		WNDCLASS wc;
     
    		wc.style = 0;
    		wc.lpfnWndProc = MainWndProc;
    		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 ;
     
    		hwnd = CreateWindow(L"MaWinClass", L"Titre", WS_OVERLAPPEDWINDOW,	CW_USEDEFAULT, CW_USEDEFAULT, 400, 300,	NULL, NULL, hInst, NULL);
     
    		if (!hwnd) return ;
     
    		ShowWindow(hwnd, nCmdShow);
    		UpdateWindow(hwnd);
     
     
    		while (GetMessage(&msg, NULL, 0, 0))
    		{
    			TranslateMessage(&msg);
    			DispatchMessage(&msg);
    		}
     
    		return;
    	}
    }

  11. #11
    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
    Ta déclaration de DllMain() contredit celle de la doc.
    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.

  12. #12
    Membre à l'essai
    Homme Profil pro
    Sans emplois
    Inscrit en
    Août 2014
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Sans emplois
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2014
    Messages : 19
    Points : 11
    Points
    11
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Ta déclaration de DllMain() contredit celle de la doc.
    Bonsoir, désoler pour l'heure de la réponse. Je ne comprend pas ce que tu veux dire par là? J'ai fais un copier/coller de la déclaration de la fonction.

    Je n'ai fais que rajouter la ligne pour obtenir de façon global le HINSTANCE qu'il me fallait afin de pouvoir créer la fenêtre dans ma dll.

    Aurais je mal placé cette ligne?

  13. #13
    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
    Si tu compares entre la doc et ton code, tu verras que tu as mal déclaré le premier paramètre, et c'est pour ça que tu te retrouves à devoir le caster.
    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 à l'essai
    Homme Profil pro
    Sans emplois
    Inscrit en
    Août 2014
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Sans emplois
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2014
    Messages : 19
    Points : 11
    Points
    11
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Si tu compares entre la doc et ton code, tu verras que tu as mal déclaré le premier paramètre, et c'est pour ça que tu te retrouves à devoir le caster.
    Bonjour, oui effectivement. Le paramètre est comme HANDLE alors que dans la doc il est en HINSTNACE. C'est un détail que je 'avais pas vu.

    Mais pourquoi le compilateur ne ma rien dit?

  15. #15
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Parce que ce sont des typedefs de pointeurs, et qu'à tout les coups, il y en a un qui est convertible en l'autre.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  16. #16
    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
    Le compilateur ne t'a rien dit parce que c'est toi qui déclares DllMain(): S'il n'y a pas de déclaration dans les en-têtes, que veux-tu que le compilo fasse? Il ne connaît pas la doc, il sait seulement que le symbole nommé "DllMain" doit être mis dans le champ "point d'entrée" de la DLL...

    D'un autre côté, avec le name mangling C++, un compilo mieux pensé aurait quand même pu remarquer le problème.
    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.

  17. #17
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 361
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 361
    Points : 20 381
    Points
    20 381
    Par défaut
    là il y a un truc qui me chagrine énormément
    Un handle de fenêtre n'est pas une classe C++ à proprement parlé c'est une structure c'est peut-être pour cela que ça plante...
    parce que tu essaies de déclarer un constructeur sur une structure classique C de type Handle

    Ensuite avant d'engager la grosse mécanique de la programmation objet je conseille vivement de commencer ne serait-ce que par un programme en C classique car l'API win32 c'est d'abord en langage C pour que tout tourne bien..
    Quitte par la suite à encapsuler dans des classes C++

  18. #18
    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
    Cette syntaxe est valide en C++ pour tous les types, pas seulement les classes.
    Mais depuis C++11, ce n'est plus la syntaxe recommandé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