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

C++ Discussion :

DLL, segmentation fault si paramètre dans fonction


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 93
    Points : 63
    Points
    63
    Par défaut DLL, segmentation fault si paramètre dans fonction
    Bonjour,
    J'ai un petit souci avec une DLL que j'ai crée (c'est la première que je fais), jusqu'à maintenant elle fonctionnait mais depuis que j'ai voulu ajouté un paramètre à une fonction (le int addr), j'ai un problème(segmentation fault) au bout d'un certain temps...

    Voilà le code (adapté)...

    Le main :

    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
     
    #include <iostream>
    #include <sstream>
    #include <stdio.h>
    #include <stdlib.h>
    #include <windows.h>
     
    using namespace std;
     
    int main(int argc, char *argv[]) {
     
        HINSTANCE DLLHandle;
        DLLHandle = LoadLibrary("madll.dll");
     
     
        typedef const char*(*Type_Pointeur_De_Fonction1)(int addr);
        Type_Pointeur_De_Fonction1 ded;
        ded = (Type_Pointeur_De_Fonction1)GetProcAddress(DLLHandle,"derQueryDLL");
     
        string recuDed;
        int i=0;
     
        for(i=0; i<200; i++)
        {
            cout << "BOUCLE main ---->  ";
            cout << i << endl;
            cout << "----------------------------------------------------------" << endl;
            recuDed = ded(255);
            cout << "DED main ---->  ";
            cout << recuDed << endl;
            cout << "----------------------------------------------------------" << endl;
        }
     
        printf("Appuyez sur une touche pour continuer...");
        getchar();
     
        FreeLibrary(DLLHandle);
        return 0;
    }
    La 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
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
    #ifndef __MAIN_H__
    #define __MAIN_H__
     
    #include <windows.h>
    #include <iostream>
    #include <sstream>
    #include <stdio.h>
    #include <string>
    #include <iomanip>
     
    #ifdef BUILD_DLL
        #define DLL_EXPORT __declspec(dllexport) __stdcall
    #else
        #define DLL_EXPORT __declspec(dllimport) __stdcall
    #endif
     
    #ifdef __cplusplus
    extern "C"
    {
    #endif
     
    /*=============================================================================
    Fonctions exporter de la bibliothèque
    =============================================================================*/
     
    const char* DLL_EXPORT derQueryDLL(int addr);
     
     
    #ifdef __cplusplus
    }
    #endif
     
    #endif // __MAIN_H__
    La 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
     
    #include "main.h"
     
    using namespace std;
     
    BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
    {
        switch (fdwReason)
        {
            case DLL_PROCESS_ATTACH:
                // attach to process
                // return FALSE to fail DLL load
                break;
     
            case DLL_PROCESS_DETACH:
                // detach from process
                break;
     
            case DLL_THREAD_ATTACH:
                // attach to thread
                break;
     
            case DLL_THREAD_DETACH:
                // detach from thread
                break;
        }
        return TRUE; // successful
    }
     
     
    const char* derQueryDLL(int addr)
    {
        string result;
        string strAddr;
        result.assign("");
        const char* result_p = NULL;
        int address(addr);
     
        //Conversion des int en string (sur 2 caractères, représentation hexadécimal ):
        ostringstream oss;
        oss << hex << setw(2) << setfill('0') << address;
        strAddr = oss.str();
     
        Sleep(50);
        //result = bdg.derQuery(strAddr);
        result = "07";
        result_p = result.c_str();
        return result_p;
    }
    Voilà au bout de 20 tours de boucle ça crash !
    Si j'enlève le paramètre (int addr), plus de soucis...

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 93
    Points : 63
    Points
    63
    Par défaut
    Problème résolu...
    Si ça peut aider certains voilà la réponse que j'ai eu :

    La fonction dans ta dll est __stdcall, la convention par défaut sous windows est __cdecl. La différence entre les deux, porte sur la responsabilité de libération de la pile. Si l'appelant et l'appelé n'utilise pas la même convention ça fait boum!

    Ca passe quand il n'y a pas de paramètres, parce qu'il n'y a rien à libérer, sinon le comportement est indéfini, donc plantage aléatoire par corruption de la pile.

    A mon avis tu ne devrais pas déclarer la fonction de ta dll __stdcall, elle prendrait ainsi la convention __cdecl et tu n'aurais pas de problèmes. Autre solution déclarer ton pointeur de fonction __stdcall si tu ne peux pas modifier le code de la dll.

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

Discussions similaires

  1. Réponses: 34
    Dernier message: 27/08/2012, 13h01
  2. Erreur (segmentation fault) dans une fonction
    Par med1001 dans le forum C
    Réponses: 2
    Dernier message: 16/04/2012, 09h47
  3. Réponses: 8
    Dernier message: 30/04/2009, 10h39
  4. Retrouver les valeurs des paramètres des fonctions d'une DLL
    Par Bernard Martineau dans le forum Langage
    Réponses: 6
    Dernier message: 08/11/2005, 10h42
  5. Réponses: 9
    Dernier message: 13/05/2005, 03h13

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