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

Visual C++ Discussion :

Probleme d'appel d'une dll, sans lib et sans stdcall


Sujet :

Visual C++

  1. #1
    Membre à l'essai
    Inscrit en
    Avril 2007
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 16
    Points : 12
    Points
    12
    Par défaut Probleme d'appel d'une dll, sans lib et sans stdcall
    Bonjour,

    Voila je vous explique mon problème, je dois utiliser des dlls que me fourni une société, mais juste des dlls pas de .lib ni de .o.

    J'ai quand même réussi à obtenir le code source mais je ne peu pas les modifier, ni les recompiler.

    Voila un bout de ce qui m'es fournit :

    fichier.c

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    __declspec(dllexport) void fct_main(long * l_a, char * c_b, char * c_c, char * c_d)
    {
    ...
    }
    fichier.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    extern void fct_main(long * l_a, char * c_b, char * c_c, char * c_d);
    Comme vous pouvez le remarquer il n'utilise pas stdcall, ce qui ne me facilite pas la tache.
    Quand j'essaye d'appeler cette fonction j'ai ce beau message d'erreur :

    Nom : MVCDL.JPG
Affichages : 63
Taille : 22,5 Ko

    -----------------------------------------------------------------------

    Apres coup j'ai effectué des tests en créant une dll.

    Pour la tester j'ai crée ce petit bout de code :

    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
    #include "stdafx.h"
    #include <windows.h>
    #include <string.h>
    #include <stdio.h>
     
    typedef void (__stdcall *FCTX1)(int a);
    typedef void (__stdcall *FCTX2)(char * a);
    typedef void (__stdcall *FCTX3)(int * a);
    typedef void (CALLBACK *FCTX4)(long *a);
     
    int main(int argc, char* argv[])
    {
    	FCTX1 E_int;
    	FCTX2 E_p_char;
    	FCTX3 es_p_int;
    	FCTX4 es_p_long;
     
    	HMODULE     ModId;
    	HMODULE     ModIdd;
    	ModId = LoadLibrary("C:\\WINDOWS\\SYSTEM32\\test_dll_simple.dll");
     
    	E_int = (FCTX1)GetProcAddress(ModId, "E_int");
    	E_p_char = (FCTX2)GetProcAddress(ModId, "E_p_char");
    	es_p_int = (FCTX3)GetProcAddress(ModId, "es_p_int");	
    	es_p_long = (FCTX4)GetProcAddress(ModId, "es_p_long");
     
    	char b[255] = "216";
    	char bb[255] = "3000001";
    	char bbb[255] = "";
    	int c = 999;
    	int  * d = &c;
    	long e = 98788;
    	long * f = &e;
     
    	E_p_char(b);
    	E_int(256);
    	es_p_int(d);
    	es_p_long(f);
     
    	printf(" %d\n",*d);
    	printf(" %d\n",*f);
     
    	FreeLibrary(ModId);
            return 0;
    }

    pour ma dll de test :

    Les 3 premières fonctions marche bien, mais la 4eme ou j'ai enlevé __stdcall ne fonctionne toujours pas :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    __declspec (dllexport) void __stdcall E_int(int entree);
    __declspec (dllexport) void __stdcall E_p_char(char *entree);
    __declspec (dllexport) void __stdcall es_p_int(int *entree);
    __declspec(dllexport) void es_p_long(long *entree);




    J'ai essayé plein de méthodes différentes, je vous avoue que je ne sais plus trop quoi essayer, et je me demande même si c'est possible d'effectuer ces actions.

    Si quelqu'un à une idée ou une piste je suis preneur

  2. #2
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Points : 16 075
    Points
    16 075
    Par défaut
    quand tu dis que tu as récupéré les sources, tu as récupéré le projet aussi ? tu peux voir la convention d'appel par défaut ? c'est pas cdecl ?

  3. #3
    Membre à l'essai
    Inscrit en
    Avril 2007
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 16
    Points : 12
    Points
    12
    Par défaut
    Nan j'ai pas le projet, ils m'ont filés :

    - .dll
    - .c
    - .h
    - .def
    - .dat
    - .obj

    Ils ont un logiciel Adelia qui leur génére les dlls, le code est trés fouillie du coup.

    Sinon je viens de verifier mais c'est bien ce que j'ai mis : __declspec

    Qu'entend tu par convention d'appel ?

  4. #4
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Points : 16 075
    Points
    16 075
    Par défaut
    la convention d'appel, c'est ce que tu as dans les options de ton projet, pour vs2005, c'est dans propriétés du projet -> configuration properties -> C/C++ -> advanced -> calling convention

    et tu peux avoir :

    __cdecl (/Gd)
    __fastcall (/Gr)
    __stdcall (/Gz)
    __clrcall (si tu es en .net)

    par défaut, c'est __cdecl en général. T'as essayé en la précisant explicitement dans ta déclaration ?

  5. #5
    Membre à l'essai
    Inscrit en
    Avril 2007
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 16
    Points : 12
    Points
    12
    Par défaut
    Je ne peu pas voir les conventions d'appelles de leur dll, apres moi dans mon projet qui utilise cette dll, c'est a cdecl.

    Mon probléme c'est que je ne peu pas leur demandé de changer quoi que ce soit à leur dll :s

  6. #6
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Points : 16 075
    Points
    16 075
    Par défaut
    je peux pas vérifier là, mais dumpbin.exe il le permet pas ca ?

  7. #7
    Membre confirmé Avatar de toxcct
    Développeur informatique
    Inscrit en
    Juillet 2006
    Messages
    434
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 434
    Points : 511
    Points
    511
    Par défaut
    Citation Envoyé par tchern
    Mon probléme c'est que je ne peu pas leur demandé de changer quoi que ce soit à leur dll :s
    non, mais tu peux adapter ton code pour utiliser les memes conventions d'appels pour les fonctions de la DLL...

    au lieu de coller des __stdcall par defaut, met donc des __cdecl, ca va surement arranger tes affaires

  8. #8
    Membre à l'essai
    Inscrit en
    Avril 2007
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 16
    Points : 12
    Points
    12
    Par défaut
    Enfin j'y suis arrivé en remplacant __stdcall par __cdecl dans le programme c qui utilise la .dll .

    Ouf j'avais abandonné, merci de m'avoir aidé ça me retire une grosse épine du pied ^^

  9. #9
    Membre confirmé Avatar de toxcct
    Développeur informatique
    Inscrit en
    Juillet 2006
    Messages
    434
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 434
    Points : 511
    Points
    511
    Par défaut
    Citation Envoyé par tchern
    Enfin j'y suis arrivé en remplacant __stdcall par __cdecl dans le programme c qui utilise la .dll .

    Ouf j'avais abandonné, merci de m'avoir aidé ça me retire une grosse épine du pied ^^
    heureux pour toi que cela soit résolu.
    cependant, a ta place, je n'hésiterais pas pour leur faire remarquer que leur code manque de commentaires (j'espere que tu avais regardé la doc avant de poser la question, hein?!), et que la convention d'appel n'est pas une info minime quand on joue avec des DLL... met leur la pression pour qu'ils améliorent un peu leur process

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 29/04/2013, 19h57
  2. Réponses: 2
    Dernier message: 19/09/2006, 19h06
  3. Grand Probleme d'appele d'une fonction
    Par Soufyane dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 17/02/2006, 15h57
  4. probleme de debug d'une dll sur pc 64bits
    Par giova_fr dans le forum MFC
    Réponses: 2
    Dernier message: 12/12/2005, 16h40
  5. [MFC ]Probleme de linkage d'une dll
    Par Lysis dans le forum MFC
    Réponses: 9
    Dernier message: 22/01/2004, 14h51

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