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 :

[WinCE5.0] Dll-Appel de fonction avec pointeur


Sujet :

Windows

  1. #1
    Membre à l'essai
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2005
    Messages
    40
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2005
    Messages : 40
    Points : 22
    Points
    22
    Par défaut [WinCE5.0] Dll-Appel de fonction avec pointeur
    Bonjour,

    Je développe actuellement une dll et un programme l'utilisant sur WinCe5.0.
    J'ai donc déveloper une appli entière en premier lieu pour me familiariser avec le SDK, créé les fonctions dont j'aurai besoin et les utiliser, aucun probleme.

    J'ai ensuite passer les fonctions dans une dll, et créé une appli qui charge la dll pour utiliser les fonctions exportées.

    Je me retrouve avec un probleme lors de tout appel a une fonction qui recois un pointeur ou une référence.

    /* Fonction dans la dll */
    int NBGTest(int *ptr)
    {
    *ptr = 1985;
    return 0;
    }

    /*Appel dans le programme */
    void OnBnClickedButton5()
    {
    int *t = new int;
    *t = 5;
    pfn_test(t);
    }

    Le pointeur a l'arrivé dans la fonction de la dll n'est pas initialisé, comme si le passage par pointeur (ou par référence, j'ai tester meme probleme) posé probleme.

    Je précise que j'ai déveloper une dll du meme type sous Xp sans aucun probleme au niveau des appels de fonctions. Ma dll est bien chargée, les fonctions sont egalement bien chargées. En mode débug, en mode pas a pas j'arrive jusqua la fonction de la dll ou le pointeur vaut :
    0x00000000 ... comme si le pointeur qui arrive en entré est différent de celui envoyé.

    Auriez vous une idée quand à la raison de cette réinitialisation de variable ou le fait que les deux ariables de concordent pas ?

    Merci de m'avoir lu, n'hésiter pas à demander plus de précisions.

  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
    Vérifie s'il n'y a pas une erreur bizarroïde au niveau de la convention d'appel (genre, la fonction définie avec une certaine convention d'appel, et le pointeur de fonction déclaré avec une autre...).
    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
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2005
    Messages
    40
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2005
    Messages : 40
    Points : 22
    Points
    22
    Par défaut
    Je t'avourai que j'ai un peu de mal a faire des recherches efficaces avec un sujet qui ressemble à ça :
    wince 5.0 dll pointeur
    wince 5.0 passage par pointeur dll

    Surtout que le probleme est assez spécial et difficile à transcrire simplement.

    Pour info je charge la dll avec :
    LoadLibrary("lib.dll");
    et les fonctions :
    GetProcAdress(DLL_Function_init)GetProcAddress(hDll,_T("NBGInit"));

  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
    Montre-moi le prototype exact des fonctions et des typedefs de pointeurs, s'il te plait.
    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
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2005
    Messages
    40
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2005
    Messages : 40
    Points : 22
    Points
    22
    Par défaut
    J'ai reelement fait la fonction de test linker plus haut et le plantage apparait meme avec un passage de pointeur sur un entier. Je te joins les proto et les variables :
    ---------------------------------------------------
    /* APPLI, chargement de la fonction de la dll */

    typedef int (WINAPI *DLL_Function_test) (int *ptr); // Declaration de la fonction de la dll dans l'appli
    pfn_test = (DLL_Function_test)GetProcAddress(hDll,_T("NBGTest")); // Chargement de la fonction dans l'appli


    /* Appel a la fonction de test */
    void OnBnClickedButton5()
    {
    int*t = new int; //<--- Initialisation de mon pointeur
    *t = 5;
    pfn_test(t); // <--- envoi de l'adresse du pointeur
    delete t;
    }

    ---------------------------------------------------
    /* DLL */

    int NBGTest(int *ptr) // <-- recupération du pointeur
    {
    *ptr=1989; // <-- A cet endroit, le pointeur ptr vaut null
    return 0;
    }

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

    *EDIT : Au moment de l'affection de *ptr=1989; l'appli "plante" bizarrement elle ne quitte pas, on dirait que l'erreur et récuperer, et on ressort direct dans la boucle du Main de l'appli MFC

    De plus apres tests, il s'avere que tout passage par valeur via l'appli, se trouve "corrompu" à l'arrivé dans la dll.
    J'ai modifier la fonction de test pour la faire prendre en entrée deux int.
    pfn_test(6,3);

    à l'arrivé, dans la dll, le programme ne recoit pas 6 et 3, mais 3 et 0.
    Il ya apparement un probleme au niveau de la pile, ou au niveau de la mémoire.

    J'ai également une fonction qui envoie une structure pour initialiser la structure dans la dll.
    J'envoie les parametres 1 2 3 4 5 (sous forme de struct)
    à l'arrivé, je recois 2 3 4 5 1.
    J'ai l'impression que certain éléments de la mémoire s'inverse lors du passage par la dll. Je continu les recherches...

  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
    Comme je le pensais, il y a conflit de convention d'appel:
    Le pointeur est déclaré WINAPI (c'est-à-dire __stdcall) mais pas la fonction...
    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 à l'essai
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2005
    Messages
    40
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2005
    Messages : 40
    Points : 22
    Points
    22
    Par défaut
    Aurais tu une solution envisageable ? Je ne comprend pas vraiment le probleme.

  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
    Simple: Soit tu modifies la DLL pour que ses fonctions soient en __stdcall, soit tu supprime WINAPI dans la déclaration des pointeurs de fonction...
    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
    Membre à l'essai
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2005
    Messages
    40
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2005
    Messages : 40
    Points : 22
    Points
    22
    Par défaut
    Je te remercie avant tout de répondre sur ce sujet.

    J'ai modifié les pointeurs de fonction, le probleme reste identique, par contre j'ai fait de nouveaux tests.

    J'ai créé une fonction qui prend en parametre, deux entiers.
    int NBGTest(int a,int b);

    Donc je la charge dans mon appli, pas de souci, je fais un appel à cette fonction
    du genre :
    pfn_test(6,3);

    En mode débug, je m'aperçois qua l'arrivé la mémoire s'est "décaller" de 8 octets.
    A savoir :
    pfn_test(6,3);
    En mode pas à pas, quand j'arrive dans ma fonction NBGTest, le premier parametre est à 3 (au lieu de 6) le second est a 0 (au lieu de 3) et "this" est à 6 (valeur du premier parametre).
    L'image en link permet de voir le pas a pas en arrivé de la fonction test.
    Les valeurs des entiers sont elles bien codées sur le bon nombre d'octets ?




    Je continue mes recherches et reste à l'affut de ce sujet.

  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
    Houlà!

    Tu ne m'avais jamais parlé de fonctions (non-statiques) dans des classes C++!
    Dans ce cas, le type de pointeur est complètement "off". Il faut des "pointeurs de fonctions membres".

    Ou plutôt, modifier la DLL pour que ces fonctions soient hors de la classe ou statiques.
    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
    Membre à l'essai
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2005
    Messages
    40
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2005
    Messages : 40
    Points : 22
    Points
    22
    Par défaut
    Alors la je dis Bravo et Merci Monsieur .


    J'ai utiliser le wizard VS pour creer ma DLL, en supprimant tout ce qui est créer de base par le wizard et en mettant les fonctions sans classe, ça marche impeccable.

    Du coup une question me vient à l'esprit : A QUOI SERT LES FONCTIONS CREEES PAR LE WIZARD -_-.

    Et une autre : Pourquoi le fait de mettre mes fonctions dans une classe fonctionne sous XP mais pas sous CE, et pourquoi le probleme qui en ressort est un décalement de mémoire.

    En tout cas je te remercie d'avoir mis le doigt sur ce point.

    A suivre

  12. #12
    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
    1. Ça dépend du Wizard. Pour une DLL absolument normale, sans MFC ni rien, je pense que ce sont des exemples.
    2. Sans doute parce qu'il y a un code de vérification quelque part dans XP, ou que l'éditeur de liens exporte le symbole différemment. Si tu regardes le lien de ma signature, tu verras qu'il y a un peu partout du code pour "rattrapper" certaines erreurs de convention d'appel...
    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.

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

Discussions similaires

  1. appel d'une fonction avec pointeur comme argument
    Par airness86180 dans le forum Débuter
    Réponses: 1
    Dernier message: 06/03/2009, 13h34
  2. [Function]Appel de fonction avec paramètre
    Par julienOriano dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 02/06/2006, 07h48
  3. DLL export de fonction avec argument
    Par slate dans le forum C
    Réponses: 3
    Dernier message: 31/05/2006, 10h36
  4. Appeler une fonction avec "action" ds un
    Par drinkmilk dans le forum ASP
    Réponses: 4
    Dernier message: 20/04/2004, 14h54
  5. Appeler une fonction avec/sans parenthèses
    Par haypo dans le forum Algorithmes et structures de données
    Réponses: 8
    Dernier message: 29/12/2002, 18h48

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