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 :

Exporter et utiliser des fonction c à partir d'une dll


Sujet :

Windows

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Juin 2008
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 6
    Points : 1
    Points
    1
    Par défaut Exporter et utiliser des fonction c à partir d'une dll
    Bonjour à tous,
    je suis actuellement en cours de développement d'un projet en c sous VS2003 qui comporte des fonctions de communication via les sockets.

    j'ai choisi de séparer ces fonctions dans une dll, jai crée alors un projet de librairie dynamique avec VS que j'ai compilé et il m'a généré le .lib et le .dll dont j'ai besoin. jusque là tout est normal,le problème est que mon programme de test pour la dll plante au niveau du 1er appel à n'importe quelle fonction de la dll. je tiens à préciser que mes fonctions marchent correctement en temps normal.

    Code main.c du programme test : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    #include<stdio.h>
    #include"Sockets.h"
    
    char errMsg[100];
    
    void main()
    {
      SISC_ConnectAtt_st connexion;
      printf("%d\n",SISC_Init(PF_INET,"127.0.0.1",9999,0,&connexion,errMsg));
    
      printf("%s",errMsg); 
      scanf("%s",errMsg);
    
    
    }

    Code madll.h : Sélectionner tout - Visualiser dans une fenêtre à part
    __declspec(dllexport)  SISC_Init(short , char *, int ,int ,SISC_ConnectAtt_st*, char*);

    Code madll.c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    BOOL APIENTRY DllMain( HANDLE hModule,
    DWORD ul_reason_for_call,
    LPVOID lpReserved
    )
    {
       return TRUE;
    }
    
    
    __declspec(dllexport) SISC_Init(short client_sin_family, char *adresse, int port ,int ssl_server,SISC_ConnectAtt_st *SISC_Attrib, char* errMsg)

    Code message d'erreur : Sélectionner tout - Visualiser dans une fenêtre à part
    Unhandled exception at 0x7c90e8e5 in test1.exe: 0xC0000005: Access violation writing location 0x00030ff4.


    je suis vraiment bloqué sur ce point depuis quelque jours j'ai beau chercher dans les tutoriaux et su le forums je naipas trouvé de solution .
    Je compte sur vous

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    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 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Premièrement:
    Je verrai ensuite si je peux t'aider quand je saurai où commence et où fini un fichier (correctement indenté si possible)
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Nouveau Candidat au Club
    Inscrit en
    Juin 2008
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Premièrement:
    Je verrai ensuite si je peux t'aider quand je saurai où commence et où fini un fichier (correctement indenté si possible)
    main .c du programme test

    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
    main .c du programme test:
    #include<stdio.h>
    #include"Sockets.h"
    
    char errMsg[100];
    
    void main()
    {
    SISC_ConnectAtt_st connexion;
    printf("%d\n",SISC_Init(PF_INET,"127.0.0.1",9999,0,&connexion,errMsg));
    
    printf("%s",errMsg);
    scanf("%s",errMsg);
    
    
    }
    ////////////////////////////////////////////////////////////////////////
    
    
    Sockets.h
    
    __declspec(dllexport) SISC_Init(short , char *, int ,int ,SISC_ConnectAtt_st*, char*);
    
    
    //////////////////////////////////////////////////////////////////////////
    #include<Sockets.h>
    #include<stdio.h>
    madll.c
    
    
    BOOL APIENTRY DllMain( HANDLE hModule,
    DWORD ul_reason_for_call,
    LPVOID lpReserved
    )
    {
    return TRUE;
    }
    
    __declspec(dllexport) SISC_Init(short client_sin_family, char *adresse, int port ,int ssl_server,SISC_ConnectAtt_st *SISC_Attrib, char* errMsg)
    
    ///////////////////////////////////////////////////////////////////////////////
    Voilà Merci pour votre attention

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    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 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Tu as mal employé les balises CODE, heureusement que ram-0000 est passé derrière toi.

    Peux-ton avoir le code de SISC_Init?

    PS: J'ai l'impression qu'il manque de const, ce prototype.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Nouveau Candidat au Club
    Inscrit en
    Juin 2008
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Tu as mal employé les balises CODE, heureusement que ram-0000 est passé derrière toi.

    Peux-ton avoir le code de SISC_Init?

    PS: J'ai l'impression qu'il manque de const, ce prototype.
    je m'excuse pour ma mal adresse

    voici le code de SISC_Init:

    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
    
    __declspec(dllexport) SISC_Init(short client_sin_family, char *adresse, int port ,int ssl_server,SISC_ConnectAtt_st *SISC_Attrib, char* errMsg)
    {
        int    returnCode ;
    	struct hostent *adr ;
        
         #ifdef WIN32
           WSADATA wsa;
        #endif
        
        /*if ( (SISC_Attrib = malloc(sizeof(SISC_ConnectAtt_st))) == NULL )
        {
           sprintf(errMsg,"SISC_Init() Error(%d): Memory Allocation failed",MALLOC_FAILED);
           return(MALLOC_FAILED);
        }*/
        
        SISC_Attrib->local_port = 2010;
        
        #ifdef WIN32
           
           if((returnCode=WSAStartup(MAKEWORD(2,0), &wsa)) != 0)
           {
              sprintf(errMsg,"SISC_Init() Error(%d) - WSAStartup: %s",returnCode,SISC_GetSocketError(SISC_Attrib));
              return(returnCode);
           }
        #endif
    
        SISC_Attrib->fd = socket(AF_INET,SOCK_STREAM,0);
        
        if(SISC_Attrib->fd < 0){
           sprintf(errMsg,"SISC_Init() Error(%d) - Socket: %s",SISC_Attrib->fd,SISC_GetSocketError(SISC_Attrib));
           
           SISC_Close(SISC_Attrib);
                  
           return(SISC_Attrib->fd) ; 
        }
    
        adr = gethostbyname(adresse);
    
        if ((int)adr == -1){
            
            sprintf(errMsg,"SISC_Init() Error(%d)- Unknown Host(%s): %s",EXIT_FAILURE,adresse,SISC_GetSocketError(SISC_Attrib));
            exit(EXIT_FAILURE);
        }
    
        SISC_Attrib->server_addr.sin_family   = client_sin_family;
        SISC_Attrib->server_addr.sin_addr     = *(struct in_addr *) adr->h_addr;
        SISC_Attrib->server_addr.sin_port     = htons((u_short)port);
    
    
         /* Construct local address structure */
         memset(&SISC_Attrib->local_address, 0, sizeof(SISC_Attrib->local_address)); /* Zero out structure */
         SISC_Attrib->local_address.sin_family = AF_INET; /* Internet address family */
         SISC_Attrib->local_address.sin_addr.s_addr = htonl(INADDR_ANY); /* Any incoming interface */
         SISC_Attrib->local_address.sin_port = htons(SISC_Attrib->local_port); /* Local port */
         
         if ((SISC_Attrib->local_socket = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0)
         {
             sprintf(errMsg,"SISC_Init() Error(%d) - Local Socket: %s",SISC_Attrib->local_socket,SISC_GetSocketError(SISC_Attrib));
             return(SISC_Attrib->local_socket);
         }
    
        if(ssl_server){
            // TODO::verify some arguments, else where throw a init exception
            SISC_Attrib->server_ssl_state = 1;
        }
        else
            SISC_Attrib->server_ssl_state = 0;
    
        return(0);
    }
    je te signale que le problème n'est pas uniquement avec SISC_Init mais avec toutes les fonctions et que ces memes fonctions fonctionnent correctement hors de la dll

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    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 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Es-tu sûr que tu ne débordes pas du buffer pour le message d'erreur?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Nouveau Candidat au Club
    Inscrit en
    Juin 2008
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Es-tu sûr que tu ne débordes pas du buffer pour le message d'erreur?
    Oui j'en suis sur, en plus SISC_Init ne renvoie que rarement un message d'erreur dont la taille est beaucoup inférieure à 100 cratères.
    Toutefois je ne suis pas sur de l'exportation et de l'utilisation des fonctions dans la dll (c'est la 1ère fois que j'utilise les dll).

    Merci pour tes réponses Médinoc

  8. #8
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    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 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Si les deux projets ont les mêmes options sur la convention d'appel, il ne devrait pas y avoir de problème tant que le module qui alloue un truc est aussi celui qui le désalloue.

    Du moins, s'il n'y avait pas de problème avant la séparation en DLL.

    Et si tu exécutes dans le debugger, à quel endroit le programme plante-t-il?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  9. #9
    Nouveau Candidat au Club
    Inscrit en
    Juin 2008
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Si les deux projets ont les mêmes options sur la convention d'appel, il ne devrait pas y avoir de problème tant que le module qui alloue un truc est aussi celui qui le désalloue.

    Du moins, s'il n'y avait pas de problème avant la séparation en DLL.

    Et si tu exécutes dans le debugger, à quel endroit le programme plante-t-il?
    Dans ce cas le debugger me renvoie le code assembleur 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
    .
    .
    .
    7C90E8CB  push        7C90E920h 
    7C90E8D0  mov         eax,dword ptr fs:[00000000h] 
    7C90E8D6  push        eax  
    7C90E8D7  mov         eax,dword ptr [esp+10h] 
    7C90E8DB  mov         dword ptr [esp+10h],ebp 
    7C90E8DF  lea         ebp,[esp+10h] 
    7C90E8E3  sub         esp,eax 
    7C90E8E5  push        ebx   <--------- le plantage est à ce niveau!
    7C90E8E6  push        esi  
    7C90E8E7  push        edi  
    7C90E8E8  mov         eax,dword ptr [ebp-8] 
    7C90E8EB  mov         dword ptr [ebp-18h],esp 
    7C90E8EE  push        eax  
    7C90E8EF  mov         eax,dword ptr [ebp-4] 
    7C90E8F2  mov         dword ptr [ebp-4],0FFFFFFFFh 
    7C90E8F9  mov         dword ptr [ebp-8],eax 
    .
    .
    .
    je ne suis pas sur que ce soit utile mais bon
    sinon ça plante au niveau de l'appel SISC_Init

  10. #10
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    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 369
    Points : 41 519
    Points
    41 519
    Par défaut
    En effet, ça ne m'est pas utile. Je pensais à un truc qui montrerait mieux l'erreur, mais je n'ai aucune idée de pourquoi ça planterait ici.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  11. #11
    Nouveau Candidat au Club
    Inscrit en
    Juin 2008
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    En effet, ça ne m'est pas utile. Je pensais à un truc qui montrerait mieux l'erreur, mais je n'ai aucune idée de pourquoi ça planterait ici.

    Merci quand meme pour ton attention

    Pour les autres : j'ai besoin d'aide plz

Discussions similaires

  1. [WD14] Utiliser des icônes qui proviennent d'une DLL
    Par AymenMSD dans le forum WinDev
    Réponses: 0
    Dernier message: 07/10/2011, 15h33
  2. Appel d'une fonction global à partir d'une DLL
    Par JeanNoel53 dans le forum C++Builder
    Réponses: 6
    Dernier message: 10/12/2010, 14h24
  3. [hibernate] utilisation des fonctions d'aggregation
    Par osopardo dans le forum Hibernate
    Réponses: 2
    Dernier message: 29/08/2005, 09h41
  4. utilisation des fonctions d'une dll
    Par jackk dans le forum C++
    Réponses: 14
    Dernier message: 15/06/2005, 16h50
  5. Utiliser des fonctions Pascal
    Par Neilos dans le forum C++Builder
    Réponses: 2
    Dernier message: 07/03/2004, 15h43

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