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 :

Problème d'utilisation de Dll faite maison. . .


Sujet :

Windows

  1. #1
    Membre averti Avatar de _SamSoft_
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    798
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 798
    Points : 345
    Points
    345
    Par défaut Problème d'utilisation de Dll faite maison. . .
    Bonjour, j'ai un petit problème, voilà ce que contient ma Dll :

    Main.c
    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
    #include "dll.h"
    
    BOOL APIENTRY DllMain( HMODULE hModule,
                           DWORD  ul_reason_for_call,
                           LPVOID lpReserved
    					 )
    {
        return TRUE;
    }
    
    DLLIMPORT double aucarre(double a)
    {
        return a*a;
    }
    
    BOOL APIENTRY DllMain (HINSTANCE hInst     /* Library instance handle. */ ,
                           DWORD reason        /* Reason this function is being called. */ ,
                           LPVOID reserved     /* Not used. */ )
    {
        switch (reason)
        {
          case DLL_PROCESS_ATTACH:
            break;
    
          case DLL_PROCESS_DETACH:
            break;
    
          case DLL_THREAD_ATTACH:
            break;
    
          case DLL_THREAD_DETACH:
            break;
        }
    
        /* Returns TRUE on success, FALSE on failure */
        return TRUE;
    }
    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
    #ifndef _DLL_H_
    #define _DLL_H_
    
    #if BUILDING_DLL
    # define DLLIMPORT __declspec (dllexport)
    #else /* Not BUILDING_DLL */
    # define DLLIMPORT __declspec (dllimport)
    #endif /* Not BUILDING_DLL */
    
    
    DLLIMPORT double aucarre(double x)
    
    
    #endif /* _DLL_H_ */
    Et mon programme (.exe):

    Main.c:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #include <stdio.h>
    #include <stdlib.h>
    #include <windows.h>
    #include "dll.h"
    
    int main(int argc, char *argv[])
    {
      double x;
      double r;
    
      printf("%d", aucarre(2));
      system("PAUSE");
      return 0;
    }
    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
    #ifndef _DLL_H_
    #define _DLL_H_
    
    #if BUILDING_DLL
    # define DLLIMPORT __declspec (dllexport)
    #else /* Not BUILDING_DLL */
    # define DLLIMPORT __declspec (dllimport)
    #endif /* Not BUILDING_DLL */
    
    
    DLLIMPORT double aucarre(double x)
    
    
    #endif /* _DLL_H_ */
    Voici ce que me met mon compilateur (DevCpp, version 4.9.9.2)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     C:\Documents and Settings\Samy\Mes documents\Programmation\C\SamSoft_DLL\dll_1\main.c In function `aucarre':
    de mon programme du fichier main.c, je ne sais pas comment donner une variable x (définit plus haut par l'utilisateur) et prendre la valeur retournée par la fonction de la dll, nommée "aucarre".

    Pouvez-vous me venir en aide ?

    Merci,

  2. #2
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Salut,

    D'abord, tu créer un projet DLL dans Dev-cpp avec les fichiers suivants:
    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
    /* mathdll.h */
    
    #ifndef H_TC_MATHDLL_20070214181222
    #define H_TC_MATHDLL_20070214181222
    
    #ifdef MATHDLL_BUILD
    #define MATHDLL_API __declspec(dllexport)
    #else
    #define MATHDLL_API __declspec(dllimport)
    #endif
    
    double MATHDLL_API aucarre(double a);
    double MATHDLL_API aucube(double a);
    
    #endif /* guard H_TC_MATHDLL_20070214181222 */
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    /* mathdll.c */
    
    #include "mathdll.h"
    
    double MATHDLL_API aucarre(double a)
    {
        return a*a;
    }
     
    double MATHDLL_API aucube(double a)
    {
        return a*a*a;
    }
    Tu compiles ensuite ta DLL avec l'option -DMATHDLL_BUILD. Ensuite tu peux créer ton programme client comme avec n'importe quelle autre DLL en incluant simplement le fichier mathdll.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
    #include <stdio.h>
    #include <stdlib.h>
    #include "mathdll.h"
     
    int main(void)
    {
        double x;
        double r;
    
        printf("SamSoft_Dll | Veuillez entrer un nombre: ");
        fflush(stdout);
    
        /* -TC- Bien entendu, il convient de sécuriser cette saisie en testant la 
            valeur de retour de scanf() */
        scanf("%lf", &x);
        r = aucarre(x);
        printf("%f au carré vaut %f", x, r);
        return EXIT_SUCCESS;
    }
    Il faut naturellement ajouter la bibliothèque mathdll au projet en vue de l'édition des liens.

    EDIT: Le post d'origine a été totalement modifié lors de la réadaction de ce message. Je ne comprends pas où est ton problème. N.B. Le spécificateur de format pour un double dans printf(), c'est %f et non %d.

    Thierry

  3. #3
    Membre averti Avatar de _SamSoft_
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    798
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 798
    Points : 345
    Points
    345
    Par défaut
    Merci, mais il reste quelque problème :

    mathdll.h:12: error: syntax error before "aucube"
    mathdll.h:12: warning: data definition has no type or storage class
    mathdll.c:3: error: syntax error before "aucarre"
    mathdll.c:8: error: syntax error before "aucube"
    Process terminated with status 1 (0 minutes, 0 seconds)
    4 errors, 2 warnings

    Voilà mon fichier 1)mathdll.h et 2)mathdll.c

    1)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    /* mathdll.h */
    #ifndef H_TC_MATHDLL_20070214181222
    #define H_TC_MATHDLL_20070214181222
    
    #ifdef MATHDLL_BUILD
    #define MATHDLL_API __spec(dllexport)
    #else
    #define MATHDLL_API __spec(dllimport)
    #endif
    
    double MATHDLL_API aucarre(double a);
    double MATHDLL_API aucube(double a);
    
    #endif /* guard H_TC_MATHDLL_20070214181222 */
    2)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #include "mathdll.h"
    
    double MATHDLL_API aucarre(double a)
    {
        return a*a;
    }
    
    double MATHDLL_API aucube(double a)
    {
        return a*a*a;
    }

  4. #4
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Mea culpa, c'est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define MATHDLL_API __declspec(dllexport) /* et non __spec(...) : faute de copie */
    Thierry

  5. #5
    Membre averti Avatar de _SamSoft_
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    798
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 798
    Points : 345
    Points
    345
    Par défaut
    Merci beaucoup, depuis 1H30 de l'après midi je travail sur "comment créer et utiliser une dll", enfin la solution est là, je compile, tout fonctionne, merci encore.

    par contre vous avez oubliez de me dire que juste en dessous de :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define MATHDLL_API __declspec(dllexport)
    il y avait l'autre fonction celle qui permet d'importer qui était un correct heuresement que je suis un ammateur et pas debuttant j'ai tout de suite vue (lol)

    Merci...

    Voilà le code complet :

    mathdll.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
    /* mathdll.h */
    #ifndef H_TC_MATHDLL_20070214181222
    #define H_TC_MATHDLL_20070214181222
    
    #ifdef MATHDLL_BUILD
    #define MATHDLL_API __declspec(dllexport)
    #else
    #define MATHDLL_API __declspec(dllimport)
    #endif
    
    double MATHDLL_API aucarre(double a);
    double MATHDLL_API aucube(double a);
    
    #endif /* guard H_TC_MATHDLL_20070214181222 */
    mathdll.c

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #include "mathdll.h"
    
    double MATHDLL_API aucarre(double a)
    {
        return a*a;
    }
    
    double MATHDLL_API aucube(double a)
    {
        return a*a*a;
    }
    main.c

    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
    #include <stdio.h>
    #include <stdlib.h>
    #include "mathdll.h"
    
    int main(int argc, char *argv[])
    {
        double x; double r;
        printf("SamSoft_Dll | Veuillez entrer un nombre: ");
        fflush(stdout);   /* -TC- Bien entendu, il convient de sécuriser cette saisie en testant la valeur de retour de scanf() */
        scanf("%lf", &x);
        r = aucarre(x);
        printf("%f au carré vaut %f", x, r);
        system("PAUSE");
        return EXIT_SUCCESS;
    }
    Cooool....

  6. #6
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2003
    Messages
    878
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 878
    Points : 1 067
    Points
    1 067
    Par défaut
    Citation Envoyé par mujigka
    [...]
    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
    /* mathdll.h */
    
    #ifndef H_TC_MATHDLL_20070214181222
    #define H_TC_MATHDLL_20070214181222
    
    #ifdef MATHDLL_BUILD
    #define MATHDLL_API __declspec(dllexport)
    #else
    #define MATHDLL_API __declspec(dllimport)
    #endif
    
    double MATHDLL_API aucarre(double a);
    double MATHDLL_API aucube(double a);
    
    #endif /* guard H_TC_MATHDLL_20070214181222 */
    [...]
    Il faut naturellement ajouter la bibliothèque mathdll au projet en vue de l'édition des liens.
    [...]
    Dans ce cas, à quoi sert "__declspec(dllimport)" ?

  7. #7
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Citation Envoyé par David.Schris
    Dans ce cas, à quoi sert "__declspec(dllimport)" ?
    Voilà comment je ferais pour compiler cela à la main avec MinGW (je ne programme que raraement sous Windows). Soit un fichier mathdll.c, mathdll.h et client.c:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    gcc -Wall -Wextra -Werror -ansi -O2 -DMATHDLL_BUILD -o mathdll.o mathdll.c
    gcc -shared -o mmathl.dll mathdll.o -Wl,--out-implib,libmmath.a
    Puis, pour compiler le programme client:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    gcc -Wall -Wextra -Werror -ansi -O2 -o client client.c -L. -lmmath
    ou
    gcc -Wall -Wextra -Werror -ansi -O2 -o client client.c mmath.dll
    Dans ce cas "__declspec(dllimport)" n'est-il pas nécessaire? Dans quel cas cette déclaration est-elle nécessaire alors?

    Thierry

  8. #8
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    On peut aussi faire, pour charger la dll dynamiquement, sans avoir besoin de l'inclure à l'édition des liens:
    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
    /* client.c */
    #include <windows.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include "mathdll.h"
    
    typedef double (*p_fct)(double);
    
    int main(void)
    {
        double x;
        double r;
        p_fct aucarre;
        HANDLE hdll;
    
        hdll = LoadLibrary("mmath.dll");
        aucarre = (p_fct) GetProcAddress(hdll, "aucarre");
     
        printf("SamSoft_Dll | Veuillez entrer un nombre: ");
        fflush(stdout);
     
        /* -TC- Bien entendu, il convient de sécuriser cette saisie en testant la 
            valeur de retour de scanf() */
        scanf("%lf", &x);
        r = aucarre(x);
        printf("%f au carré vaut %f", x, r);
    
        FreeLibrary(hdll);
    
        return EXIT_SUCCESS;
    }
    Pour la compilation:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gcc -Wall -Wextra -O2 -o client client.c
    Il suffit à mmath.dll d'être dans le %PATH% pour être chargée.

    Thierry

  9. #9
    Membre averti Avatar de _SamSoft_
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    798
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 798
    Points : 345
    Points
    345
    Par défaut Réponse
    C'est une bonne idée, mais je pense que cela convient mieux à ceux qui ne programme pas sous un compilateur , le plus simple et d'ajouter dans l'éditeur de lien : libnomdelalib.a

  10. #10
    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
    __declspec(dllimport) est nécessaire pour les programmes qui lient à la bibliothèque statique d'importation, mais pas nécessaire pour les programmes qui chargent dynamiquemenr (LoadLibrary() etc.) car eux n'utilisent pas du tout la déclaration de la fonction.

  11. #11
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2003
    Messages
    878
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 878
    Points : 1 067
    Points
    1 067
    Par défaut
    Citation Envoyé par mujigka
    Citation Envoyé par David.Schris
    Citation Envoyé par mujigka
    Il faut naturellement ajouter la bibliothèque mathdll au projet en vue de l'édition des liens.
    Dans ce cas, à quoi sert "__declspec(dllimport)" ?
    Voilà comment je ferais pour compiler cela à la main avec MinGW (je ne programme que raraement sous Windows). Soit un fichier mathdll.c, mathdll.h et client.c:
    Code X : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    gcc -Wall -Wextra -Werror -ansi -O2 -DMATHDLL_BUILD -o mathdll.o mathdll.c
    gcc -shared -o mmathl.dll mathdll.o -Wl,--out-implib,libmmath.a
    Puis, pour compiler le programme client:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    [...]
    gcc -Wall -Wextra -Werror -ansi -O2 -o client client.c mmath.dll
    [...]
    Juste pour expliquer ce que j'avais en tête en posant ma question (qui n'était que ce qu'elle était : une question)...
    Sous Code::Blocks (devrait fonctionner similairement sous Dev-C++) [1], créer un projet composé des deux fichiers suivants :
    "user32.h":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #ifndef __USER32_H__
    #define __USER32_H__
    
    __stdcall int MessageBoxA( void *hWnd, char *lpText, char *lpCaption, unsigned int uType );
    
    #endif /* __USER32_H__ */
    "main.c":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #include <stdio.h> /* pour NULL */
    #include "user32.h"
    
    int main( void ) {
        return MessageBoxA( NULL, "Hello World", "Test", 0 );
    }
    Note : pas de #include <windows.h> ni de "__declspec(dllimport)" dans aucun des fichiers.
    Cliquer (dans C::B) sur le bouton "Build" : cela échoue avec l'erreur "undefined reference to `MessageBoxA'". C'est normal. C'était juste pour (que tu puisses) vérifier que l'exécutable n'était pas magiquement lié à une bibliothèque, que windows.h n'était pas magiquement inclu, etc...
    Maintenant, dans (toujours sous C::B) "Project/Build options/Linker", cliquer sur "Add" et sélectionner le fichier "%WinRoot%\system32\user32.dll", répondre "Oui" ou "Non" à la question "Keep this as a relative path ?", valider en cliquant sur "OK" (la DLL doit aparaître dans la liste "Link libraries"), valider en cliquant sur OK puis, enfin, cliquer sur le bouton "Build and run" : tu devrais être gratifié d'un "Hello World".

    Voilà à quoi je pensais quand j'ai posé ma question...

    [1] - En utilisant MinGW comme compilateur.

  12. #12
    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
    À mon avis, tu t'exposes plutôt à un plantage, car tu n'as pas déclarer MessageBoxA() en __stdcall...

    De plus, utilise plutôt un size_t qu'un int pour le premier paramètre, car un HWND est un pointeur (question de taille, même si ça ne fait pas différence en 32 bits).

    PS: On peut déclarer directement la liaison avec une DLL pour dans code::blocks ?
    Sans utiliser la bibliothèque statique d'importation, ça m'étonne. D'un autre coté, ça ne repose pas sur Visual mais sur GCC, donc...

  13. #13
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2003
    Messages
    878
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 878
    Points : 1 067
    Points
    1 067
    Par défaut
    Citation Envoyé par Médinoc
    À mon avis, tu t'exposes plutôt à un plantage, car tu n'as pas déclarer MessageBoxA() en __stdcall...

    De plus, utilise plutôt un size_t qu'un int pour le premier paramètre, car un HWND est un pointeur (question de taille, même si ça ne fait pas différence en 32 bits).
    Pas dormi, désolé. Corrigé.

    Citation Envoyé par Médinoc
    PS: On peut déclarer directement la liaison avec une DLL pour dans code::blocks ?
    Sans utiliser la bibliothèque statique d'importation, ça m'étonne. D'un autre coté, ça ne repose pas sur Visual mais sur GCC, donc...
    Citation Envoyé par [url]http://www.mingw.org/MinGWiki/index.php/CreateImportLibraries[/url]
    Usually (read: for all DLLs created with MinGW and also a few others) MinGW links fine against a DLL.

  14. #14
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Citation Envoyé par Médinoc
    PS: On peut déclarer directement la liaison avec une DLL pour dans code::blocks ?
    Sans utiliser la bibliothèque statique d'importation, ça m'étonne. D'un autre coté, ça ne repose pas sur Visual mais sur GCC, donc...
    Oui. Il faudra tout de même que je regarde une fois comment tout cela se passe avec Visual C++, au moins pour ma culture générale...

    Donc si je comprends bien les exemples présentés, __declspec(dllimport) n'est jamais nécessaire lorsqu'on utilise une DLL avec Mingw (en ligne de commande comme avec Code::Blocks)?

    Dans tous les exemples que j'ai rencontré où des DLL étaient utilisées avec Mingw, __declspec(dllimport) était présent. Ma compréhension du mécanisme de chargement des DLL sous windows est très sommaire. A quoi sert exactement cette instruction? (Cette discussion est en train de dévier vers un sujet Döveloppement Windows... Mille excuses)

    Thierry

  15. #15
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2003
    Messages
    878
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 878
    Points : 1 067
    Points
    1 067
    Par défaut
    Citation Envoyé par mujigka
    [...]
    Donc si je comprends bien les exemples présentés, __declspec(dllimport) n'est jamais nécessaire lorsqu'on utilise une DLL avec Mingw (en ligne de commande comme avec Code::Blocks)?
    Et bien...depuis que tu as écrit "Il faut naturellement ajouter la bibliothèque", je me pose la question...(comme toi). Fallait pas dire que c'était "naturel" alors que je passais par là

    Citation Envoyé par mujigka
    Dans tous les exemples que j'ai rencontré où des DLL étaient utilisées avec Mingw, __declspec(dllimport) était présent.
    Je l'ai toujours utilisé...et je me rends compte que je n'étais pas très au point quant au "pourquoi" de la chose (par contre, pour l'export, je comprends très bien).

    Citation Envoyé par mujigka
    [...] (Cette discussion est en train de dévier vers un sujet Döveloppement Windows... Mille excuses)
    On pourrait créer un thread pour ça, non ?

  16. #16
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Citation Envoyé par David.Schris
    On pourrait créer un thread pour ça, non ?
    C'est une bonne idée. Qui se lance comme PO?

    Thierry

  17. #17
    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
    Pas moi, puisque c'est sûrement moi qui vais répondre...

  18. #18
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2003
    Messages
    878
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 878
    Points : 1 067
    Points
    1 067
    Par défaut
    Citation Envoyé par Médinoc
    Pas moi, puisque c'est sûrement moi qui vais répondre...

    Ben...on pourrait aussi gagner du temps, si tu vois ce que je veux dire

  19. #19
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    J'ai repris les fichiers mathdll.c, mathdll.h et main.c de __Samsoft__ et j'ai modifié mathdll.h comme suit:
    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
    /* mathdll.h */
    #ifndef H_TC_MATHDLL_20070214181222
    #define H_TC_MATHDLL_20070214181222
     
    #ifdef MATHDLL_BUILD
    #define MATHDLL_API __declspec(dllexport)
    #else
    /*ATTENTION: modification ici, plus de __declspec(dllimport)*/
    #define MATHDLL_API
    #endif
     
    double MATHDLL_API aucarre(double a);
    double MATHDLL_API aucube(double a);
     
    #endif /* guard H_TC_MATHDLL_20070214181222 */
    Donc, plus de __declspec(dllimport). Puis j'ai compiler avec cl (le compilateur C de microsoft) en ligne de commande (avec scons):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    cl /DMATHDLL_BUILD /I. /c mathdll.c /Fomathdll.obj
    link /nologo /dll /out:athdll.dll /implib:mathdll.lib mathdll.obj
    cl /nologo /I. /c /main.c /Fomain.obj
    link /nologo /OUT:test.exe /LIBPATH:. mathdll.lib test.obj
    Et ça fonctionne parfaitement. Là je ne comprends pas... Dans quel cas déclarer une fonction avec __declspec(dllimport) est-il nécessaire?

    Thierry

  20. #20
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2003
    Messages
    878
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 878
    Points : 1 067
    Points
    1 067
    Par défaut
    Citation Envoyé par mujigka
    [...]
    Et ça fonctionne parfaitement. Là je ne comprends pas... Dans quel cas déclarer une fonction avec __declspec(dllimport) est-il nécessaire?
    Ou comment semer le trouble...

    J'avoue ne pas avoir fait de recherches complémentaires sur le sujet mai je me demande si cela ne serait pas lié à une histoire de priorité lors de l'édition de liens... Je vais essayer de penser à faire un petit test.

Discussions similaires

  1. Problème de Cache d'image (fait maison)
    Par LoKiDemon dans le forum Langages serveur
    Réponses: 0
    Dernier message: 09/12/2010, 14h32
  2. Réponses: 10
    Dernier message: 14/06/2008, 20h16
  3. utiliser une DLL faite en vb6 avec VB.net
    Par j.sineau dans le forum VB.NET
    Réponses: 6
    Dernier message: 10/12/2007, 10h33
  4. [VB.Net] Comment utiliser une dll faite en VB6 ?
    Par hassanovich dans le forum VB.NET
    Réponses: 1
    Dernier message: 06/06/2006, 13h25

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