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

Windows Discussion :

recuperer une fonction avec arguments dans une dll


Sujet :

Windows

  1. #1
    Membre du Club
    Inscrit en
    Mai 2009
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 66
    Points : 46
    Points
    46
    Par défaut recuperer une fonction avec arguments dans une dll
    bonsoir,

    Il se trouve que j'ai une fct dans une dll qu'il faut que je retrouve... jusque la pas de probleme mais si celle ci comporte des arguments et je me retrouve avec une erreur "Run type Failure#0"

    mon dll.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #ifdef _WINDLL
    #define DLLDEC __declspec(dllexport)
    #endif
    
    extern "C"
    {
    	
    class DLLDEC test { public:
    test(); ~test(); int lol;
    }; DLLDEC test* TestDll(int nb);
    }
    mon 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
    #include <iostream>
    #include "test.h"
    
    test::test() : lol(12)
    {
    }
    
    DLLDEC test*  TestDll(int nb) 
    {
    	
    std::cout << "allloooo : " << nb << std::endl; test* tmp = new test; std::cout << tmp->lol << std::endl; return (tmp);
    }
    et mon programme principal:
    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
    include <windows.h>
    
    class test
    {
    public:
    	int lol;
    };
    
    typedef test* (WINAPI* RVALUE)(UINT);
    static RVALUE g_RValue = NULL;
    
    int main()
    {
       
    HMODULE hmodUser32 = LoadLibrary(TEXT("test.dll")); if (hmodUser32 != NULL) { g_RValue = (RVALUE) GetProcAddress(hmodUser32, "TestDll"); }
    if (g_RValue == NULL) std::cout << "erreur load class" << std::endl; else { test* tmp = g_RValue(2); std::cout << tmp->lol << std::endl; }
    if (hmodUser32 != NULL) FreeLibrary(hmodUser32); system("PAUSE"); return 0;
    }
    J'ai essayer de glisser des __stdcall un peu de partout mais rien a faire...
    On peu d'aide serait cool ^^
    bonne nuit

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    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 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Tu déclares ton pointeur de fonction comme __stdcall (WINAPI), mais la fonction elle-même est toujours en __cdecl...

    Quant au dllexport, regarde plutôt ceci:
    http://www.developpez.net/forums/m1641642-6/

  3. #3
    Membre du Club
    Inscrit en
    Mai 2009
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 66
    Points : 46
    Points
    46
    Par défaut
    Merci beaucoup pour ta reponse et ton lien ... cela m'a bien aide!

    Mais j'ai du mal a l'appliquer...
    j'ai fais ma dll comme tu le montre dans le lien mais dans mon programme principal je n'arrive pas a recuperer ma fct de la dll...

    Maintenant que j'utilise __stdcall je pensais fair mon typedef de la sorte:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef test* (WINAPI* RVALUE)(UINT);
    Juste avec WINAPI mais il me retourne nul... alors que ma fct est definit de la sorte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #include "NomDeLaDll.h"
    
    EXTERN_C NOMDELADLL_API test* __stdcall TestDll(int);
    Je pensais reutiliser la macro NOMDELADLL_API mais je ne sais pas ou la mettre ...
    Bref un ptit coup de pouce serait le bienvenue.. Mici

  4. #4
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Les entêtes doivent être fournis "à part" de la DLL, mais un seul entête peut parfaitement importer une DLL complète, une partie seulement ou plusieurs DLL séparées, elles aussi en totalité ou en partie.

Discussions similaires

  1. Value d'une option en argument dans une fonction
    Par coincoin22 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 14/02/2014, 17h21
  2. Mettre une variable comme argument dans une fonction
    Par djun1 dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 04/09/2012, 10h44
  3. Création fonction avec argument dans une classe
    Par Général03 dans le forum Windows Forms
    Réponses: 8
    Dernier message: 30/06/2009, 09h57
  4. [Langage] une fonction comme argument d'une fonction?
    Par Krishna dans le forum Langage
    Réponses: 9
    Dernier message: 15/10/2008, 20h31
  5. Réponses: 1
    Dernier message: 15/09/2008, 14h38

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