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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 ?

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