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

Langage C++ Discussion :

Problème de création de DLL


Sujet :

Langage C++

  1. #1
    Membre expérimenté
    Avatar de Gouyon
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    1 084
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 084
    Points : 1 525
    Points
    1 525
    Billets dans le blog
    5
    Par défaut Problème de création de DLL
    Salut à tous

    Je suis en train de développer une DLL et j'ai eu des soucis pour l'utiliser. Donc je suis revenu à quelque chose de très basic pour essayer de trouver ce qui ne va pas.

    J'ai pris l'exemple de la FAQ du Visual C++

    MaDLL.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    #ifdef _WINDLL
    #define DLLDEC __declspec(dllexport)
    #else
    #define DLLDEC __declspec(dllimport)
    #endif
    #ifdef __cplusplus
    extern "C"
    {
    #endif
    DLLDEC int TestDll();
    #ifdef __cplusplus
    }
    #endif
    MaDLL.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    #include "MaDLL.h"
     
     
    int DLLDEC TestDll()
    {
     return 2010;
    }
    Tout ce compile sans souci et la DLL est crée. Je la teste avec le programme suivant:
    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
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
     
    // TestMaDLLDlg.cpp : fichier d'implémentation
    //
     
    #include "stdafx.h"
    #include "TestMaDLL.h"
    #include "TestMaDLLDlg.h"
    #include "MaDLL.h"
     
    #ifdef _DEBUG
    #define new DEBUG_NEW
    #endif
     
     
    // boîte de dialogue CAboutDlg utilisée pour la boîte de dialogue 'À propos de' pour votre application
     
    class CAboutDlg : public CDialog
    {
    public:
    	CAboutDlg();
     
    // Données de boîte de dialogue
    	enum { IDD = IDD_ABOUTBOX };
     
    	protected:
    	virtual void DoDataExchange(CDataExchange* pDX);    // Prise en charge de DDX/DDV
     
    // Implémentation
    protected:
    	DECLARE_MESSAGE_MAP()
    };
     
    CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
    {
    }
     
    void CAboutDlg::DoDataExchange(CDataExchange* pDX)
    {
    	CDialog::DoDataExchange(pDX);
    }
     
    BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
    END_MESSAGE_MAP()
     
     
    // boîte de dialogue CTestMaDLLDlg
     
     
     
     
    CTestMaDLLDlg::CTestMaDLLDlg(CWnd* pParent /*=NULL*/)
    	: CDialog(CTestMaDLLDlg::IDD, pParent)
    {
    	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
    }
     
    void CTestMaDLLDlg::DoDataExchange(CDataExchange* pDX)
    {
    	CDialog::DoDataExchange(pDX);
    	DDX_Control(pDX, IDC_RESUTEST, m_ResuTest);
    }
     
    BEGIN_MESSAGE_MAP(CTestMaDLLDlg, CDialog)
    	ON_WM_SYSCOMMAND()
    	ON_WM_PAINT()
    	ON_WM_QUERYDRAGICON()
    	//}}AFX_MSG_MAP
    	ON_BN_CLICKED(IDC_BTNTEST, &CTestMaDLLDlg::OnBnClickedBtntest)
    END_MESSAGE_MAP()
     
     
    // gestionnaires de messages pour CTestMaDLLDlg
     
    BOOL CTestMaDLLDlg::OnInitDialog()
    {
    	CDialog::OnInitDialog();
     
    	// Ajouter l'élément de menu "À propos de..." au menu Système.
     
    	// IDM_ABOUTBOX doit se trouver dans la plage des commandes système.
    	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
    	ASSERT(IDM_ABOUTBOX < 0xF000);
     
    	CMenu* pSysMenu = GetSystemMenu(FALSE);
    	if (pSysMenu != NULL)
    	{
    		CString strAboutMenu;
    		strAboutMenu.LoadString(IDS_ABOUTBOX);
    		if (!strAboutMenu.IsEmpty())
    		{
    			pSysMenu->AppendMenu(MF_SEPARATOR);
    			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
    		}
    	}
     
    	// Définir l'icône de cette boîte de dialogue. L'infrastructure effectue cela automatiquement
    	//  lorsque la fenêtre principale de l'application n'est pas une boîte de dialogue
    	SetIcon(m_hIcon, TRUE);			// Définir une grande icône
    	SetIcon(m_hIcon, FALSE);		// Définir une petite icône
     
    	// TODO : ajoutez ici une initialisation supplémentaire
     
    	return TRUE;  // retourne TRUE, sauf si vous avez défini le focus sur un contrôle
    }
     
    void CTestMaDLLDlg::OnSysCommand(UINT nID, LPARAM lParam)
    {
    	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
    	{
    		CAboutDlg dlgAbout;
    		dlgAbout.DoModal();
    	}
    	else
    	{
    		CDialog::OnSysCommand(nID, lParam);
    	}
    }
     
    // Si vous ajoutez un bouton Réduire à votre boîte de dialogue, vous devez utiliser le code ci-dessous
    //  pour dessiner l'icône. Pour les applications MFC utilisant le modèle Document/Vue,
    //  cela est fait automatiquement par l'infrastructure.
     
    void CTestMaDLLDlg::OnPaint()
    {
    	if (IsIconic())
    	{
    		CPaintDC dc(this); // contexte de périphérique pour la peinture
     
    		SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
     
    		// Centrer l'icône dans le rectangle client
    		int cxIcon = GetSystemMetrics(SM_CXICON);
    		int cyIcon = GetSystemMetrics(SM_CYICON);
    		CRect rect;
    		GetClientRect(&rect);
    		int x = (rect.Width() - cxIcon + 1) / 2;
    		int y = (rect.Height() - cyIcon + 1) / 2;
     
    		// Dessiner l'icône
    		dc.DrawIcon(x, y, m_hIcon);
    	}
    	else
    	{
    		CDialog::OnPaint();
    	}
    }
     
    // Le système appelle cette fonction pour obtenir le curseur à afficher lorsque l'utilisateur fait glisser
    //  la fenêtre réduite.
    HCURSOR CTestMaDLLDlg::OnQueryDragIcon()
    {
    	return static_cast<HCURSOR>(m_hIcon);
    }
     
     
    void CTestMaDLLDlg::OnBnClickedBtntest()
    {
    	// TODO : ajoutez ici le code de votre gestionnaire de notification de contrôle
    	int x=TestDll();
    	//int x=fnMaDLL2();
    	if (x==2010)
    		m_ResuTest.SetWindowTextA("Tout est OK");
    	else
    		m_ResuTest.SetWindowTextA("Pas glop");
    }
    Et je me retrouve avec l'erreur suivante:

    Exception non gérée à 0x77e9bcb1 dans TestMaDLL.exe*: 0xC06D007E: Module not found.

    Je pense qu'il manque quelque chose quelque part mais je ne vois pas où

    Si quelqu'un a une idée.

    J'utilise Visual Studio 2005 SP1

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    A priori, cela à l'air bon, il doit y avoir un autre problème quelque part.

    Tu compiles bien avec un niveau d'avertissement à 4 dans les options de compilation de ton projet (pour avoir tous les warnings) ?

    Dans le menu Deboguer/Exception, il faudrait que tu coches toutes les exceptions (surtout C++ exception, Native Runtime checks et Win32 exceptions) pour s'arrêter dès qu'une exception est levée.

    Lorsque l'exception est levée, quelle est la ligne de TON code qui est exécutée.

  3. #3
    Membre expérimenté
    Avatar de Gouyon
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    1 084
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 084
    Points : 1 525
    Points
    1 525
    Billets dans le blog
    5
    Par défaut
    En fait ça bloque dès que j'appelle TestDLL. Le débugger me renvois sur delayhelp.cpp

  4. #4
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Tu peux attacher tes projets complets : la solution TestDLL et la solution DLL

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    175
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 175
    Points : 72
    Points
    72
    Par défaut
    Salut, je suis débutant en prog, mais je me demande si tu doit pas mètre ton plutôt avec des parenthese comme ca non?

  6. #6
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Citation Envoyé par bergoliv Voir le message
    non?
    Non, ce n'est pas le problème
    ou
    C'est pareil

  7. #7
    Membre expérimenté
    Avatar de Gouyon
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    1 084
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 084
    Points : 1 525
    Points
    1 525
    Billets dans le blog
    5
    Par défaut
    Je crois avoir trouvé.
    Dans les options du projet TestMaDLL j'utilise le chargement différé des DLL et j'ai omis de placer la DLL dans le répertoire de l'executable.
    Du coup au lancement de l'application je n'avais pas le message "impossible de trouver la DLL"
    Mais par contre dès que je faisais appel à la DLL ça plantait.

    Maintenant ça marche

    Merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 10
    Dernier message: 17/08/2009, 12h39
  2. Réponses: 4
    Dernier message: 16/05/2006, 23h15
  3. Problème de création d'une dll...
    Par adrien954 dans le forum C++Builder
    Réponses: 4
    Dernier message: 21/10/2005, 10h46
  4. Problème création de DLL avec CString
    Par loupdeau dans le forum MFC
    Réponses: 3
    Dernier message: 21/07/2005, 20h55
  5. Problème création de DLL
    Par monsieur.voie.lactee dans le forum C++Builder
    Réponses: 4
    Dernier message: 12/08/2003, 16h56

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