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

MFC Discussion :

ASSERT(afxCurrentResourceHandle != NULL)


Sujet :

MFC

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 60
    Par défaut ASSERT(afxCurrentResourceHandle != NULL)
    Bonjour,

    j'ai créé un projet dll depuis lequel j'aimerais ouvrir des dialogs-boxs.
    Mais je butte sur l'erreur suivante losque je crée ma fenetre (avec Create ou DoModal):
    afxCurrentResourceHandle = NULL

    J'ai l'impression que c'est du au fait que, vu que mon projet est un projet dll, du coup je n'ai pas de fenetre principale.

    Auriez vous une idée ?
    Merci,
    Yéyé

  2. #2
    Membre chevronné Avatar de themadmax
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    446
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 446
    Par défaut
    Attention avec les DLL et les MFC.
    Voir cet article
    Suivant aussi comment tu te link avec les MFC, tu peut ou pas faire des new d'un coté et des delete de l'autre.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 60
    Par défaut
    Argl, c'est bien plus compliqué que ce que je pensais !

    Bon, merci pour le lien, en tout cas.
    J'ai réussi à récupérer un ressource handle pour ma dll, mais je ne peux rendre la main à l'appli client puisque je ne connais pas sa resourceHandle.

    Hum, un peu de code très simplifié, çà devrait être plus clair

    DLL (.h) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    [...]
    class AFX_EXT_CLASS CMyTDUInterface
    {
    public:
    	CMyTDUInterface();
    	virtual ~CMyTDUInterface();
     
    	void ShowVisual();
    }
    DLL (.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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
     
    static AFX_EXTENSION_MODULE TDUDLL = { NULL, NULL };
     
    extern "C" int APIENTRY
    DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
    {
    	// Remove this if you use lpReserved
    	UNREFERENCED_PARAMETER(lpReserved);
     
    	if (dwReason == DLL_PROCESS_ATTACH)
    	{
    		TRACE0("TDU.DLL Initializing!\n");
     
    		// Extension DLL one-time initialization
    		if (!AfxInitExtensionModule(TDUDLL, hInstance))
    			return 0;
     
    		new CDynLinkLibrary(TDUDLL);
    	}
    	else if (dwReason == DLL_PROCESS_DETACH)
    	{
    		TRACE0("TDU.DLL Terminating!\n");
    		// Terminate the library before destructors are called
    		AfxTermExtensionModule(TDUDLL);
    	}
    	return 1;   // ok
    }
     
    // implémentation de la classe interface
     
    CMyTDUInterface::CMyTDUInterface()
    {
    ...
    }
     
    void CMyTDUInterface::ShowVisual()
    {
    	CDialogVisualTDU *dvt = new CDialogVisualTDU(); // CDialogVisualTDU hérite de CDialog.
    	if(dvt != NULL)
    	{
    		//AFX_MANAGE_STATE(AfxGetStaticModuleState()); //ceci plante a la compile
                    //HINSTANCE hInstOld = AfxGetResourceHandle(); //ceci plante car currentResourceHandle = NULL
    		AfxSetResourceHandle(TDUDLL.hModule);
    		BOOL ret = dvt->Create(IDD_DIALOG_VISUAL_TDU);
    		if(!ret)   //Create failed.
    			AfxMessageBox("Error creating Dialog");
    		dvt->ShowWindow(SW_SHOW);
    //		AfxSetResourceHandle(hInstOld); // restore the old resource chain
    	}
    	else
    		AfxMessageBox("Error Creating Dialog Object");
    }
    Et, enfin, l'appli client:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    [...]
    CMyTDUInterface monTDU;
    [...]
    monTDU.ShowVisual();
    [...]
    Voilà ... en gros.
    Tout le problème est dans ShowVisual() : currentResourceHandle est NULL, donc je fais un SetResourceHandle() ... çà marche mais après l'appli client n'a apparement plus accès à ses propres ressources ... je commence à sécher là !!!

    Une idée, pls ?

  4. #4
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    salut,
    essaye de rajouter ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    AFX_MANAGE_STATE(AfxGetStaticModuleState( ));
    à chaque fonction de ta DLL qui manipule les ressources.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 60
    Par défaut
    Salut,

    En fait, j'avais déja essayé de le rajouter (commenté dans ma fonction ShowVisual()), mais çà plante au link de ma compile :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    mfcs42d.lib(dllmodul.obj) : error LNK2005: __pRawDllMain already defined in TDU.obj
    mfcs42d.lib(dllmodul.obj) : error LNK2005: _DllMain@12 already defined in TDU.obj
    mfcs42d.lib(dllmodul.obj) : error LNK2005: __pRawDllMain already defined in TDU.obj
    mfcs42d.lib(dllmodul.obj) : warning LNK4006: _DllMain@12 already defined in TDU.obj; second definition ignored
    mfcs42d.lib(dllmodul.obj) : warning LNK4006: __pRawDllMain already defined in TDU.obj; second definition ignored

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 18
    Par défaut
    Oui, j'ai le même problème de link, donc j'up ce post.

    Quelqu'un aurait une idée ?

  7. #7
    Membre émérite
    Avatar de Gabrielly
    Inscrit en
    Juin 2004
    Messages
    722
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 722
    Par défaut
    Je voie qu'il s'agit d'une DLL d'extension MFC.

    1. Enlève ton new CDynLinkLibrary(TDUDLL); dans la DllMain()

    2. Ajoute une méthode d'exportation comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    // à mettre après ta DLLMain()
    extern "C" BOOL WINAPI InitializeTDUDLL()
    {
    	new CDynLinkLibrary(TDUDLL);
    	return TRUE;
    }
    3. Ajoute un fichier header comme TDU.h dans ton projet TDU ensuite
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    #pragam once
     
    extern "C" BOOL WINAPI InitializeTDUDLL();

    4. Ouvre ton fichier TDU.def et écris :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    ; TDU.def : Declares the module parameters for the DLL.
     
    LIBRARY      "TDU.dll"
     
    EXPORTS
        ; Explicit exports can go here
    	InitializeTDUDLL		@1
    5. Dans le code client rassure toi que la librairie TDU.lib est bien référencé dans le projet de ton exe

    6. Dans le InitInstance() tu ajoutes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    BOOL CTonApp::InitInstance()
    {
    //...
    InitializeTDUDLL();  // afin qu'il soit lié avec les ressources de ta DLL.
    return TRUE;
    }
    7. Et quelque part dans ton fichier cpp de ton exe tu inserts le fichier header #include "..\TDU\TDU.h" et puis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
    [...]
    CMyTDUInterface monTDU;
    [...]
    monTDU.ShowVisual();  // ça doit marcher !!!
    [...]


  8. #8
    Membre émérite
    Avatar de Gabrielly
    Inscrit en
    Juin 2004
    Messages
    722
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 722
    Par défaut
    Et puis le code de ShowVisual() n'est pas très propre

    J'espère que tu as
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    class AFX_EXT_CLASS CDialogVisualTDU : public CDialog
    Pour une boite amodale
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    void CMyTDUInterface::ShowVisual()
    {
    	CDialogVisualTDU *dvt = new CDialogVisualTDU(); 
    	if(dvt != NULL)
    	{
    		BOOL ret = dvt->Create(IDD_DIALOG_VISUAL_TDU);
    		if(ret)
    		     dvt->ShowWindow(SW_SHOW);	
                  }
    }
    Pour une boite modale
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    void CMyTDUInterface::ShowVisual()
    {
    	CDialogVisualTDU dvt;
    	dvt.DoModal();
    }
    Pour un meilleur code la classe CDialogVisualTDU est directement exportable
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    void MethodeDeMonExe()
    {
         CDialogVisualTDU dvt;
         dvt.DoModal();
    }

Discussions similaires

  1. Réponses: 7
    Dernier message: 02/09/2013, 17h18
  2. assertion 'child->parent == NULL' failed
    Par Al_th dans le forum GTK+
    Réponses: 4
    Dernier message: 05/10/2010, 11h52
  3. Réponses: 2
    Dernier message: 30/05/2006, 09h02
  4. [VB6] [BDD] Recordset et champ égal à Null
    Par Gr|ppen dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 07/03/2003, 10h00
  5. "ALTERER" une col. NULL en NOT NULL - Int
    Par Gandalf24 dans le forum SQL
    Réponses: 2
    Dernier message: 28/12/2002, 00h07

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