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 :

DllImport: impossible de préciser le nom de la fonction


Sujet :

C#

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    45
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 45
    Par défaut DllImport: impossible de préciser le nom de la fonction
    Bonjour,

    J'ai créé une solution contenant :
    - un projet C#
    - un project c++ (unmanaged) type dll, avec export

    Dans le projet c++, j'ai une seul méthode, déclaré avec la macro générée par défaut

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #define TEST_API __declspec(dllexport)
    TEST_API int test();
    depends.exe et dumpbin me montre tout d'eux ma méthode, qui est bien exportée. (avec le bon nom, j'ai mis la déclaration dans un extern "C")

    Dans le projet C#, j'ai la déclaration de cette méthode, et un appel :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    [DllImport("test.dll")]
    private static extern int test();
    A l'éxecution j'ai droit à :
    Impossible de trouver le point d'entrée 'test' dans la DLL 'test.dll'.":"
    Si j'ajoute EntryPoint = "test" -> pareil
    par contre
    si j'ajoute EntryPoint = "#1" // étant l'ordinal de ma méthode -> ça marche

    Le pb est que ceci n'est qu'un prototype, et que j'aurai des 10ène de méthodes par la suite, je ne peux pas m'appuyer sur l'ordinal (étant "variable")

    Je ne comprends pas pourquoi la méthode n'est pas trouvé par nom...


    Si quelqu'un a déjà eu ce pb, une solution me ferai très plaisir

    Merci !

    .µAlexx.

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    45
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 45
    Par défaut ...
    Re bonjour,

    Le pb s'est apparemment résolu de lui-même ..

    Après une n-ième compilation, re compilation et nettoyage, le C# a fini par accepter EntryPoint !

    Je n'arrive pas à voir si j'ai changer quelques choses, cela semble juste marcher.

    Espérons que ça dure !

  3. #3
    Membre extrêmement actif
    Inscrit en
    Avril 2008
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Âge : 65

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 573
    Par défaut dumpbin.exe ,au secours
    bonjour
    quand tu as affaire au nom des functions dans des dll dont pour lesquelles le compilo utilise lors de la creation est inconnu ,utilise l'utilitaire dumpbin.exe....fourni par VS pour lister les noms des fonctions exportees et leur correspondants by Ordinal.

    1/tu trouvera ici l'utilitaire Dumpbin.exe :
    -tonDossierVS\Microsoft Visual Studio .NET 2003\Vc7\bin\
    2/utilisation
    -pour des raisons pratiques copie-le dans un dossier facilement accessible(DossierPerso) et utilise Invite de Commandes Visual Studio
    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
     
    'instruction ligne de commande à lancer
    DossierPerso\dumpbin.exe /exports scrrun.dll /out:sortie.txt ->enter
    'tu recuperes dans sortie.txt les noms des fonctions exportees by Ordinal et ByName
    'ici le resultat de la commande precedente sur la dll system de windows scrrun.dll dans sortie text
    '-----------------------------------------------------------------
    Dump of file scrrun.dll
     
    File Type: DLL
     
      Section contains the following exports for ScrRun.dll
     
        00000000 characteristics
        473E4E83 time date stamp Sat Nov 17 03:14:27 2007
            0.00 version
               1 ordinal base
               6 number of functions
               6 number of names
     
        ordinal hint RVA      name
     
              1    0 0000DF92 DLLGetDocumentation
              2    1 00002655 DllCanUnloadNow
              3    2 00002861 DllGetClassObject
              4    3 0000E545 DllRegisterServer
              5    4 0000E0FE DllUnregisterServer
              6    5 00016BC8 DoOpenPipeStream
     
      Summary
     
            1000 .data
            2000 .reloc
            8000 .rsrc
           1E000 .text
    '-----------------------------------------------------------------
    Il aide beaucoup quand on travaille avec P/INVOKE(version importDll appeler des fonctions dans DLL) comme tu es entrain de le faire .
    Cela remonte au temps ou je faisais du Fortran combine à Delphi Pascal ou à VB6.
    Dumpbin a d'autres options par exemple les noms de variables(Symbols)
    NotaBene :
    -----------
    Attention il ne faut pas l'utiliser pour les dll Automation Com ,Add-in COM & Controles Activex COM(.ocx).Pour cela il y a l'outils VS OleViewer Com.

    Regarde cet article de la MSDN qui fait pub pour dumpbin.exe pour les gens qui utilise P/INVOKE(appel de plateforme sous entendu ayant des systemes differents).
    http://www.google.fr/url?sa=t&source...diDNK2I4C9XWRw
    Bon code................

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    45
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 45
    Par défaut
    Citation Envoyé par MicroAlexx Voir le message
    depends.exe et dumpbin me montre tout d'eux ma méthode, qui est bien exportée.
    Je pense que mon Pb venait de la dll utilisé par mon appli, qui n'était pas à jour par rapport à celle du projet en cpp (copié mais pas pris en compte ou en cache enfin je sais pas trop ^^)

    Tout marche nickel maintenant

  5. #5
    Membre extrêmement actif
    Inscrit en
    Avril 2008
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Âge : 65

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 573
    Par défaut mangling,unmangling name in c++ & mfc c++
    Rebonjour MicroAlexx

    pour le probleme du mangling et unmangling des noms des symboles c'est l'un des grands problemes de c++ & mfc++.
    Microsoft dispose meme d'une Api peu connue et mal documente pour automatiser le "unmangling" c.à.d remplacer les noms "mangles" qui sont un codage reellement par les noms des symboles originaux.
    le "mangling" est du à la directive __declspec.
    la directive extern "C" utilise en C (pas c++) genere des noms au format ansi normaux.
    d'ou l'idee astucieuse pour certains d'ecrire carrement un Wrapper en C++ pure (qu'il ne faut confondre avec le wrapper c++/cli) avec une directice extern "C" pour chaque fonction et c'est lui qu'on appelle.
    Car pour appeler ta dll à partir de vb.net(qui ne differe pas de c#) j'ai eu le meme probleme.

    voici le code c++ de pinvokemacro avec l'adjonction de petits wrappers c++ pour chaque fonction exporte de la classe assez simple:

    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
     
     
    // Le bloc ifdef suivant est la façon standard de créer des macros qui facilitent l'exportation 
    // à partir d'une DLL. Tous les fichiers contenus dans cette DLL sont compilés avec le symbole PINVOKEMACRO_EXPORTS
    // défini sur la ligne de commande. Ce symbole ne doit pas être défini dans les projets
    // qui utilisent cette DLL. De cette manière, les autres projets dont les fichiers sources comprennent ce fichier considèrent les fonctions 
    // PINVOKEMACRO_API comme étant importées à partir d'une DLL, tandis que cette DLL considère les symboles
    // définis avec cette macro comme étant exportés.
    #ifdef PINVOKEMACRO_EXPORTS
    #define TEST_API __declspec(dllexport)
    #else
    #define TEST_API __declspec(dllimport)
    #endif
     
    // Cette classe est exportée de PInvokeMacro.dll
    class TEST_API CPInvokeMacro {
    public:
    	CPInvokeMacro(void);
    	// TODO*: ajoutez ici vos méthodes.
       static int funcClass(int foo);
    };
    int TEST_API CPInvokeMacro::funcClass(int foo)
    {
    return  foo*100;
    }
    //le wrapper de funcClass
    extern "C"
    TEST_API int FuncClassExtern(int foo)
    {
    	return   CPInvokeMacro::funcClass( foo);
    };
    extern TEST_API int nPInvokeMacro;
    //
     
    TEST_API int fnPInvokeMacro(void);
    //
    //le wrapper de fnPInvokeMacro
    extern "C"
    TEST_API int FuncPInvokeMacro(void)
    {
    	return ::fnPInvokeMacro();
    };
    ici le code vb.net pour appeler les fonctions:

    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
     
     
    'Un Module partage avec (equivalent de la directive statique en #)
    Imports System
    Imports System.Runtime.InteropServices
    Module PInvokeModule
        'Exemple c#
        '  [DllImport("test.dll")]
        'private static extern int test();
        'Exemple VB 
        ' Use DllImport to import the PInvokeMacro
        <DllImport("PInvokeMacro.dll", CharSet:=CharSet.Auto)> _
        Function FuncPInvokeMacro() As Integer
        End Function
        <DllImport("PInvokeMacro.dll", CharSet:=CharSet.Auto)> _
       Function FuncClassExtern(ByVal nbEntier As Integer) As Integer
        End Function
     
    End Module
     
    'le code du WinForm
    Imports System
    Imports System.Runtime.InteropServices
    Public Class Form1
     
     
        Private Sub btnPINVOKE_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnPINVOKE.Click
            Me.txtPINVOKE.Text = FuncPInvokeMacro.ToString
            Dim NBENTIER As Integer = 15
            Me.TextBox1.Text = FuncClassExtern(NBENTIER).ToString
        End Sub
    End Class
    Voila un remede à la versatilite du P/Invoke.
    bon code.............

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

Discussions similaires

  1. Impossible de résoudre le nom d'unité
    Par zorville dans le forum Langage
    Réponses: 9
    Dernier message: 25/11/2016, 16h06
  2. Impossible de pinger un nom de domaine :(
    Par ThitoO dans le forum Réseau
    Réponses: 1
    Dernier message: 29/01/2009, 14h39
  3. Réponses: 0
    Dernier message: 15/03/2007, 13h45
  4. Réponses: 13
    Dernier message: 13/01/2007, 18h33
  5. Réponses: 28
    Dernier message: 09/01/2007, 16h30

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