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 :

Débutante, Comment utiliser une dll dans un programme C++ ?


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 73
    Points : 49
    Points
    49
    Par défaut Débutante, Comment utiliser une dll dans un programme C++ ?
    Je débute le C++ j'ai les bases mais un problème me tracasse je ne sais pas comment on utilise une dll dans un programme , mon bouquin de C++ n'en parle pas et j'ai du mal a trouver de la documentation sur le net , ou c'est peut être moi qui cherche mal .

    Donc si quelqu'un a un petit tuto la dessus sa serais sympa

    @++

  2. #2
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2007
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2007
    Messages : 71
    Points : 61
    Points
    61
    Par défaut
    Salut,
    j'ai utilisé ca pour programmer ma propre dll et l'utiliser. je suppose que c'est un truc pour débutant mais ca peut ptètre t'aider

  3. #3
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    Bonjour,

    tu ne nous donnes pas assez de détails pour que l'on puisse t'aider. D'où viens cette dll?
    Il faut savoir qu'une dll telle quelle, tu ne pourras pas l'utiliser (à moins d'utiliser un hack quelconque dont j'ignore l'existence mais qui serait, de toutes façons, plus que fortement déconseillée). Il te faut soit un .def, soit une lib d'import.
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 73
    Points : 49
    Points
    49
    Par défaut
    Heu il s'agit de la dll de berkeleydb, il ya effectivement .def que voila


    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
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    EXPORTS
    	db_create	@1
    	db_env_create	@2
    	db_sequence_create	@3
    	db_strerror	@4
    	db_version	@5
    	db_xa_switch	@6
    	log_compare	@7
    	__db_add_recovery	@8
    	__db_dbm_close	@9
    	__db_dbm_delete	@10
    	__db_dbm_fetch	@11
    	__db_dbm_firstkey	@12
    	__db_dbm_init	@13
    	__db_dbm_nextkey	@14
    	__db_dbm_store	@15
    	__db_get_flags_fn	@16
    	__db_get_seq_flags_fn	@17
    	__db_hcreate	@18
    	__db_hdestroy	@19
    	__db_hsearch	@20
    	__db_loadme	@21
    	__db_ndbm_clearerr	@22
    	__db_ndbm_close	@23
    	__db_ndbm_delete	@24
    	__db_ndbm_dirfno	@25
    	__db_ndbm_error	@26
    	__db_ndbm_fetch	@27
    	__db_ndbm_firstkey	@28
    	__db_ndbm_nextkey	@29
    	__db_ndbm_open	@30
    	__db_ndbm_pagfno	@31
    	__db_ndbm_rdonly	@32
    	__db_ndbm_store	@33
    	__db_panic	@34
    	__db_r_attach	@35
    	__db_r_detach	@36
    	__ham_func2	@37
    	__ham_func3	@38
    	__ham_func4	@39
    	__ham_func5	@40
    	__ham_test	@41
    	__lock_id_set	@42
    	__os_calloc	@43
    	__os_closehandle	@44
    	__os_dirfree	@45
    	__os_dirlist	@46
    	__os_free	@47
    	__os_get_syserr	@48
    	__os_getenv	@49
    	__os_ioinfo	@50
    	__os_malloc	@51
    	__os_mkdir	@52
    	__os_open	@53
    	__os_openhandle	@54
    	__os_posix_err	@55
    	__os_read	@56
    	__os_realloc	@57
    	__os_strdup	@58
    	__os_umalloc	@59
    	__os_unlink	@60
    	__os_write	@61
    	__txn_id_set	@62
    	__bam_adj_read	@63
    	__bam_cadjust_read	@64
    	__bam_cdel_read	@65
    	__bam_curadj_read	@66
    	__bam_merge_read	@67
    	__bam_pgin	@68
    	__bam_pgno_read	@69
    	__bam_pgout	@70
    	__bam_rcuradj_read	@71
    	__bam_relink_43_read	@72
    	__bam_relink_read	@73
    	__bam_repl_read	@74
    	__bam_root_read	@75
    	__bam_rsplit_read	@76
    	__bam_split_read	@77
    	__crdel_inmem_create_read	@78
    	__crdel_inmem_remove_read	@79
    	__crdel_inmem_rename_read	@80
    	__crdel_metasub_read	@81
    	__db_addrem_read	@82
    	__db_big_read	@83
    	__db_cksum_read	@84
    	__db_ctime	@85
    	__db_debug_read	@86
    	__db_dispatch	@87
    	__db_dl	@88
    	__db_dumptree	@89
    	__db_err	@90
    	__db_errx	@91
    	__db_getlong	@92
    	__db_getulong	@93
    	__db_global_values	@94
    	__db_isbigendian	@95
    	__db_mkpath	@96
    	__db_msg	@97
    	__db_noop_read	@98
    	__db_omode	@99
    	__db_ovref_read	@100
    	__db_pg_alloc_42_read	@101
    	__db_pg_alloc_read	@102
    	__db_pg_free_42_read	@103
    	__db_pg_free_read	@104
    	__db_pg_freedata_42_read	@105
    	__db_pg_freedata_read	@106
    	__db_pg_init_read	@107
    	__db_pg_new_read	@108
    	__db_pg_prepare_read	@109
    	__db_pg_sort_read	@110
    	__db_pgin	@111
    	__db_pgout	@112
    	__db_pr_callback	@113
    	__db_relink_42_read	@114
    	__db_rpath	@115
    	__db_stat_pp	@116
    	__db_stat_print_pp	@117
    	__db_util_cache	@118
    	__db_util_interrupted	@119
    	__db_util_logset	@120
    	__db_util_siginit	@121
    	__db_util_sigresend	@122
    	__db_verify_internal	@123
    	__dbreg_register_read	@124
    	__fop_create_read	@125
    	__fop_file_remove_read	@126
    	__fop_remove_read	@127
    	__fop_rename_read	@128
    	__fop_write_read	@129
    	__ham_chgpg_read	@130
    	__ham_copypage_read	@131
    	__ham_curadj_read	@132
    	__ham_get_meta	@133
    	__ham_groupalloc_42_read	@134
    	__ham_groupalloc_read	@135
    	__ham_insdel_read	@136
    	__ham_metagroup_42_read	@137
    	__ham_metagroup_read	@138
    	__ham_newpage_read	@139
    	__ham_pgin	@140
    	__ham_pgout	@141
    	__ham_release_meta	@142
    	__ham_replace_read	@143
    	__ham_splitdata_read	@144
    	__lock_list_print	@145
    	__log_stat_pp	@146
    	__mutex_set_wait_info	@147
    	__os_abspath	@148
    	__os_clock	@149
    	__os_exists	@150
    	__os_get_errno	@151
    	__os_id	@152
    	__os_mapfile	@153
    	__os_seek	@154
    	__os_set_errno	@155
    	__os_sleep	@156
    	__os_spin	@157
    	__os_ufree	@158
    	__os_unmapfile	@159
    	__os_yield	@160
    	__qam_add_read	@161
    	__qam_del_read	@162
    	__qam_delext_read	@163
    	__qam_incfirst_read	@164
    	__qam_mvptr_read	@165
    	__qam_pgin_out	@166
    	__rep_stat_print	@167
    	__txn_child_read	@168
    	__txn_ckp_42_read	@169
    	__txn_ckp_read	@170
    	__txn_recycle_read	@171
    	__txn_regop_42_read	@172
    	__txn_regop_read	@173
    	__txn_xa_regop_read	@174

  5. #5
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    Alors dans ce cas, la marche à suivre est la suivante:

    1) Charger la dll en mémoire, à l'aide de LoadLibrary()

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    HMODULE	hModule = LoadLibrary("le path de la dll");
    if ( hModule == NULL )
    {
        // la dll n'a pas pu être chargée, gérer l'erreur
    }
    2) Appeler la fonction souhaitée

    Arf, j'ai oublié, il nous faut la signature des fonctions définies dans le .def pour pouvoir les appeler. Autrement dit, il nous faut le fichier d'en-tête (.h).

    Prenons par exemple le .def suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    EXPORTS
    unefonction @1
    qui correspond à l'en-tête suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int unefonction(float f);
    Pour appeler unefonction, il faut faire ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    // on défini le type de la fonction a appeler pour simplifier le code:
    typedef int (WINAPI *UnTypeDeFonction) (float f);
     
    // on récupère un pointeur sur cette fonction
    UnTypeDeFonction lafonction = (UnTypeDeFonction)GetProcAddress(hm, "unefonction");
     
    //on appelle la fonction:
    int unint = lafonction(3.45);

    Remarque: tout ceci est trés bien expliqué dans le lien fourni par neuro6
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  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
    Note: Ça, c'est pour utiliser une DLL explicitement.
    Si tu as un .lib (ou pour MinGW, un .a) fourni avec la DLL, tu peux aussi l'utiliser implicitement en liant ton projet au .lib...
    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
    Membre actif
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    577
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 577
    Points : 256
    Points
    256
    Par défaut
    de toute façon, quelle que soit ta façon pour utiliser les fonctions, il te faut le .h

  8. #8
    Membre régulier Avatar de fdubks
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2007
    Messages : 73
    Points : 81
    Points
    81
    Par défaut
    r0d a écris:
    2) Appeler la fonction souhaitée
    3)Liberer la dll:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    FreeLibrary(hModule );
    Remarque: tout ceci est trés bien expliqué dans le lien fourni par neuro6

  9. #9
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par fdubks
    3)Liberer la dll:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    FreeLibrary(hModule );
    Remarque: tout ceci est trés bien expliqué dans le lien fourni par neuro6
    Oui mais bon, libérer la dll ne sert que si l'on souhaite faire un code propre et non buggé...
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  10. #10
    Membre régulier Avatar de fdubks
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2007
    Messages : 73
    Points : 81
    Points
    81
    Par défaut
    r0d a écrit:
    Oui mais bon, libérer la dll ne sert que si l'on souhaite faire un code propre et non buggé...
    Effectivement, comme tous les utilisateurs de ce forum

Discussions similaires

  1. Réponses: 11
    Dernier message: 18/12/2007, 11h12
  2. Comment mais une DLL dans un programme
    Par zizo89 dans le forum Delphi
    Réponses: 1
    Dernier message: 20/04/2007, 23h25
  3. [Langage]Comment utiliser une dll .NET dans VB6?
    Par BouB dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 13/04/2006, 14h20
  4. [] Utiliser AVI d'une DLL dans mon programme
    Par seb.49 dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 02/05/2003, 14h52

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