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++/CLI Discussion :

[C++>C#]Pourquoi ma fonction est introuvable dans ma dll?


Sujet :

C++/CLI

  1. #1
    Membre actif
    Avatar de Blo0d4x3
    Inscrit en
    Octobre 2003
    Messages
    583
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 583
    Points : 265
    Points
    265
    Par défaut [C++>C#]Pourquoi ma fonction est introuvable dans ma dll?
    Bonjour, je cherche a wrapper une fonction que j'ai faire dans un DLL écrite en C++, donc non managé.

    Mais ca me lève une execption comme quoi le point d'enté de la fonction SetMousePosition est introuvable. Et je ne trouve pas ou est mon erreur.

    voici le code de la fonction:

    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
     
    bool SetMousePosition(LPARAM lparam, int & x, int & y)
    {
    	MOUSEHOOKSTRUCT * pMouseStruct = (MOUSEHOOKSTRUCT *)lparam;
     
    	if (pMouseStruct == NULL)
    	{
    		return false;
    	}
     
    	pMouseStruct->pt.x = x;
    	pMouseStruct->pt.y = y;
     
    	return true;
    }
    Je wrappe la dll comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    [DllImport("fonct.dll", EntryPoint="SetMousePosition",  SetLastError=true,
    			 CharSet=CharSet.Unicode, ExactSpelling=true,
    			 CallingConvention=CallingConvention.StdCall)]
    		private static extern bool InternalSetMousePosition(IntPtr lparam, ref int x, ref int y);
    Et j'apelle la dll comme ceci dans mon code c#:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SetMousePosition(_lparam, ref x, ref y);
    Merci de votre aide.

  2. #2
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    Tu pourrais en attendant utiliser un outil comme DependencyWalker pour vérifier le nom des fonctions exportés par la dll native en question

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    487
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 487
    Points : 621
    Points
    621
    Par défaut
    Ces fonctions sont dans 2 DLL différentes : SystemHookCore.dll et fonct.dll.
    Leurs déclarations ne sont donc pas forcément identiques.
    C'est peut-être trivial mais je commencerais par vérifier les déclaration __dllexport et __stdcall de ces fonctions.

    Tu pourrais en attendant utiliser un outil comme DependencyWalker
    On ne peut pas faire boire un âne qui n'a pas soif.

  4. #4
    Rédacteur
    Avatar de abelman
    Inscrit en
    Février 2003
    Messages
    1 106
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 1 106
    Points : 2 629
    Points
    2 629
    Par défaut
    Essaye
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    extern "C" bool  _stdcall SetMousePosition(LPARAM lparam, int & x, int & y)

  5. #5
    Membre actif
    Avatar de Blo0d4x3
    Inscrit en
    Octobre 2003
    Messages
    583
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 583
    Points : 265
    Points
    265
    Par défaut
    J'ai essaier avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    extern "C" bool  _stdcall SetMousePosition(LPARAM lparam, int & x, int & y)
    Marche pas :-(. J'ai la meme execption impossible de trouver le point d'entré de la fonction dans la dll.

    Je vais tester avec dependencywalker, en croisant les doigts.

  6. #6
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    Peut être avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    extern "C" __declspec(dllexport) bool  __stdcall SetMousePosition(LPARAM lparam, int & x, int & y);

  7. #7
    Membre actif
    Avatar de Blo0d4x3
    Inscrit en
    Octobre 2003
    Messages
    583
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 583
    Points : 265
    Points
    265
    Par défaut
    Ca marche :-D.

    Dependency trouve la fonction comme ceci:
    _SetMousePosition@12

    j'ai modifier la dllimport:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    [DllImport("fct.dll", EntryPoint="_SetMousePosition@12",  SetLastError=true,
    			 CharSet=CharSet.Unicode, ExactSpelling=true)]
    		private static extern bool InternalSetMousePosition(IntPtr lparam, ref int x, ref int y);
    Nickel, que de la galère pour arriver la. lol
    Mais j'ai toujours pas compris pourquoi ca ne marchais dès le début, quelqu'un aurait une explication?

    Merci a tous.

  8. #8
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    parce qu'il manquait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    __declspec(dllexport)
    Je crois que c'est tout
    Il faut dire au compilateur que tu exportes la fonction

  9. #9
    Membre actif
    Avatar de Blo0d4x3
    Inscrit en
    Octobre 2003
    Messages
    583
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 583
    Points : 265
    Points
    265
    Par défaut
    ok mais pour les autres fonction, je n'utilise pas cette instruction et ca marche quand même. C'est ca qui n'est pas clair pour moi.

  10. #10
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    Ben, à mon avis,
    soit tu utilises inconciement une macro
    exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    #define DLLFUNC __declspec(dllexport)
     
    DLLFUNC bool UneFonctionExportee(...);
    Soit il existe dans ta solution ( et à l'insu de ton plein gré ) un fichier *.def qui contient la liste des fonctions exportés par la dll

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 19
    Points : 16
    Points
    16
    Par défaut melange
    l'utilisation de __declspec et celle du .def sont différentes!
    ce sont 2 moyens différents d'exporter les dll dc normalement si on utilise l'un,on ne se sert pas de l'autre!!!

    j'ai le meme probleme,ma dll est trouvé qd j'utilise le __declspec ms pas qd j'utilise le .def (pourtant ds les 2 cas la dll est créée).

    c koi DependencyWalker ?je pense que ca me serait bien utile!

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 22/10/2008, 18h54
  2. [EasyPHP] ordinal 157 est introuvable dans ssleay32.dll
    Par jpclutier dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 1
    Dernier message: 02/07/2008, 14h35
  3. Réponses: 1
    Dernier message: 27/02/2008, 23h26
  4. fonction introuvable dans la dll ?
    Par FamiDoo dans le forum C++
    Réponses: 5
    Dernier message: 22/06/2006, 16h33
  5. [C#] La ressource 'skin.bmp' est introuvable dans la classe?
    Par cortex024 dans le forum Windows Forms
    Réponses: 6
    Dernier message: 21/01/2006, 00h24

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