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 :

PInvoke probleme encodage avec DLL ecrite en C


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Mars 2007
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 40
    Par défaut PInvoke probleme encodage avec DLL ecrite en C
    Bonjour,

    Voila j'ai écrit un programme en C# et j'importes une DLL ecrite en C en utilisant PINvoke.

    Voici ma fonction C
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int myFunctionC(const char* asnModule, const char* pduName, ByteArray source, int length, ByteArray *destination)
    Dans mon programme C# j'ai :
    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
    [DllImport("Asn1Transcoder.dll", EntryPoint = "myFunctionC",CharSet = CharSet.Ansi )]
    public static extern int myFunctionC(
    StringBuilder asnModule, StringBuilder pduName, StringBuilder source, Int32 lenght, [MarshalAs(UnmanagedType.LPStr)] StringBuilder destination
    );
     
     
    public void callDLL()
    {
        StringBuilder asn = new StringBuilder();
        asn.Append("monASN");
     
        StringBuilder pduName = new StringBuilder();
        pduName.Append("toro");
     
       StringBuilder XER = new StringBuilder("text");
     
       Int32 length;
       StringBuilder retour = new StringBuilder("",200);
       length = XER.Length;
     
       int k = myFunctionC(asn, pduName, XER, length, retour);
    }
    Donc ma fonction est bien appelé, il n'y a pas d'erreur.

    Mon problème vient du fait que de mon parametre retour.
    Du cote de la DLL ma valeur retour vaut "8F02"
    Mais dans mon programme mon parametre retour vaut "P(ù".

    Et je ne vois pas d'ou vient le probleme.
    Si quelqu'un pouvait m'aider.

    Merci.

  2. #2
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Déjà a priori cela parait plus que bizarre d'utiliser des StringBuilder pour communiquer avec uen DLL en C.

  3. #3
    Membre averti
    Inscrit en
    Mars 2007
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 40
    Par défaut
    Il faut utiliser quoi a la place des StringBuilder?

  4. #4
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Citation Envoyé par kain31 Voir le message
    Il faut utiliser quoi a la place des StringBuilder?
    Ben, des String a priori.

  5. #5
    Membre Expert

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 067
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2 067
    Par défaut
    pour ton ByteArray je pense que c'est plus Byte[] que tu devrais utilisé du coté de ton code c#

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public static extern int myFunctionC(
    Stringr asnModule, String pduName, Byte[] source, Int32 lenght, out Byte[] destination
    );

  6. #6
    Membre averti
    Inscrit en
    Mars 2007
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 40
    Par défaut
    Que j'utilise des string ou des stringBuilder j'ai le même résultat.

    Pareil avec des byte[].

    Ma DLL recoit les bons élément mais j'ai toujours un probleme avec ma valeur de retour.

  7. #7
    Inactif  
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 123
    Par défaut arff c facile
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    [DllImport("Asn1Transcoder.dll", EntryPoint = "myFunctionC",CharSet = CharSet.Unicode )]
    vous avez mis Ansi.

  8. #8
    Membre averti
    Inscrit en
    Mars 2007
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 40
    Par défaut
    A olivieram, si j'utilise le CharSet.Unicode ma fonction ne fonctionne plus du tout. Il me semble qu'avec C/C++ on utilise le CharSet.Ansi.

    A NicolasG, j'ai essayé d'utiliser le mot ref à la place du mot out. Et la fonction me retourne un tableau avec une valeur au lieu de trois de valeurs. Mais la valeur retourné est correct. Je ne comprends pas pourquoi il ne me retourne pas les 2 valeurs manquantes.

  9. #9
    Membre averti
    Inscrit en
    Mars 2007
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 40
    Par défaut
    Merci a tous,

    J'ai trouvé la solution. J'utilises des IntPtr.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    [DllImport("maDLL.dll", EntryPoint = "maFonction", CharSet = CharSet.Ansi)]
            public static extern int maFonction(
                   String asnModule, String pduName, byte[] source, int length, out IntPtr destination
                   );
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    IntPtr retour = new IntPtr(0);
    int k = maFonction(asn, pduName, ba, length, out retour);
     
    byte[] tabByte = new byte[k];
    Marshal.Copy(retour, tabByte, 0, k);

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

Discussions similaires

  1. [WD14] Problème avec DLL ecrite en Visual Basic
    Par SonnyB dans le forum WinDev
    Réponses: 21
    Dernier message: 07/11/2011, 15h48
  2. Probleme encodage String (pchar) avec une dll
    Par yupa dans le forum Débuter
    Réponses: 8
    Dernier message: 11/05/2009, 18h00
  3. probleme encodage avec BDE
    Par looping dans le forum Bases de données
    Réponses: 0
    Dernier message: 21/03/2009, 10h13
  4. probleme d'une DLL avec une page asp
    Par aymane_farissi dans le forum ASP
    Réponses: 3
    Dernier message: 29/09/2005, 16h25
  5. [CR] Probleme avec Dll P2oledb.dll
    Par malban dans le forum SAP Crystal Reports
    Réponses: 1
    Dernier message: 30/08/2004, 09h10

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