Discussion: Dllimport dll c

  1. #1
    Membre confirmé Avatar de Flow_75
    Homme Profil pro
    Ingénieur
    Inscrit en
    mai 2005
    Messages
    942
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Transports

    Informations forums :
    Inscription : mai 2005
    Messages : 942
    Points : 636
    Points
    636

    Par défaut Dllimport dll c

    Bonjour,

    Pour la premiere fois j'utilise le dllimport pour appeller une dll c que j'ai codé.

    Ci-dessous, le prototype de la fonction c dans la dll :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    __declspec(dllexport) void GetVoiePkdll(char* path, long Echantillons, int LongueurBlocDMA, double dCycle100, int AcqBytePerCycle, int sNbTT, double** pVoieP)
    Ci-dessous, la declaration de la fonction c dans mon programme c# :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    [DllImport("ComputePK.dll", EntryPoint = "GetVoiePkdll")]
    static extern void GetVoiePkdll(string path, long Echantillons, int LongueurBlocDMA, double dCycle100, int AcqBytePerCycle, int sNbTT, ref double[] VoieP);
    Lors que j'essaye de lancer la fonction, on m'indique que le point d'entrée n'a pas été trouvé.
    Pourriez vous m'aider ?
    Merci.
    F.

  2. #2
    Membre actif
    Homme Profil pro
    Analyste Programmeur
    Inscrit en
    septembre 2008
    Messages
    167
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyste Programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : septembre 2008
    Messages : 167
    Points : 284
    Points
    284

    Par défaut

    Bonjour,

    Pour pouvoir vérifier ton point d'entrée, tu peux utiliser un petit outil qui te permet de voir ce genre de chose.
    Je te citerais 'Dependency Walker' qui te fait ça (entre autre).

    Ça ne corrigera pas ton problème directement, mais tu sera sur que ta fonction est visible et qu'elle a le nom attendu.

    Bonne continuation.
    L’aléatoire n’existe pas en informatique, c’est juste un moyen de dire que l’on a pas encore compris.

  3. #3
    Membre confirmé Avatar de Flow_75
    Homme Profil pro
    Ingénieur
    Inscrit en
    mai 2005
    Messages
    942
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Transports

    Informations forums :
    Inscription : mai 2005
    Messages : 942
    Points : 636
    Points
    636

    Par défaut

    Merci de ton aide.

    La fonction est bien visible depuis le c#, j'ai vu dans dependancy walker, c'est ok.
    J'arrive à l'appeler et à executer du code.
    Maintenant, je souhaite passer un autre pointeur, et c'est maintenant que ca coince:

    Le prototype c/c++ :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void GetVoiePkdll(const char* path, int Echantillons, int LongueurBlocDMA, double dCycle100, int AcqBytePerCycle, short sNbTT, short*psLgTT, double * pVoieP)
    Le dllimport c# :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            [DllImport(@"ComputePK.dll", EntryPoint = "?GetVoiePkdll@@YAXPBDHHNHFPAFPAN@Z")]
            static extern void GetVoiePkdll(string path, int Echantillons, int LongueurBlocDMA, double dCycle100, int AcqBytePerCycle, short sNbTT,short[] sLgTT,double[] VoiePK);
    Et quand j'execute ca me donne cela :

    Informations supplémentaires : Un appel à la fonction PInvoke "---::GetVoiePkdll' a déséquilibré la pile. Cela peut se produire, car la signature PInvoke managée ne correspond pas à la signature cible non managée. Vérifiez que la convention d'appel et les paramètres de la signature PInvoke correspondent à la signature non managée cible.

  4. #4
    Membre confirmé Avatar de Flow_75
    Homme Profil pro
    Ingénieur
    Inscrit en
    mai 2005
    Messages
    942
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Transports

    Informations forums :
    Inscription : mai 2005
    Messages : 942
    Points : 636
    Points
    636

    Par défaut

    Bonjour,

    J'ai essayé de nouvelles solutions :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            static extern void GetVoiePkdll(string path, int Echantillons, int LongueurBlocDMA, double dCycle100, int AcqBytePerCycle, short sNbTT, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 1)] short[] sLgTT, [MarshalAs(UnmanagedType.LPArray)]double[] VoiePK);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            static extern void GetVoiePkdll(string path, int Echantillons, int LongueurBlocDMA, double dCycle100, int AcqBytePerCycle, short sNbTT, ref short[] sLgTT, ref double[] VoiePK);
    Sans succes

  5. #5
    Responsable .NET & Magazine

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    juillet 2016
    Messages
    2 166
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : juillet 2016
    Messages : 2 166
    Points : 7 775
    Points
    7 775
    Billets dans le blog
    15

    Par défaut

    Citation Envoyé par Flow_75 Voir le message
    La fonction est bien visible depuis le c#, j'ai vu dans dependancy walker, c'est ok.
    J'arrive à l'appeler et à executer du code.
    Maintenant, je souhaite passer un autre pointeur, et c'est maintenant que ca coince:
    Attention, si c'est une autre surchage de la fonction, ce n'est pas la même fonction ! Il faut donc adapter le paramètre EntryPoint en conséquence. L'avez-vous bien fait ?
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

Discussions similaires

  1. DllImport et DLL maison
    Par Harooold dans le forum C#
    Réponses: 3
    Dernier message: 25/02/2009, 11h43
  2. utilisation de DllImport("user32.dll",
    Par WBO dans le forum VB.NET
    Réponses: 4
    Dernier message: 09/12/2008, 23h52
  3. convertion DllImport("coredll.dll" en vb.net
    Par WBO dans le forum Windows Mobile
    Réponses: 0
    Dernier message: 08/12/2008, 15h22
  4. Réponses: 7
    Dernier message: 02/09/2008, 15h30
  5. Réponses: 16
    Dernier message: 08/10/2007, 22h11

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