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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Inscrit en
    Juin 2008
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 6
    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
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    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
    Membre à l'essai
    Inscrit en
    Juin 2008
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 6
    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
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    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
    Membre à l'essai
    Inscrit en
    Juin 2008
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 6
    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
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    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.

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