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 :

Communication C# - C via DLL


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 5
    Par défaut Communication C# - C via DLL
    Bonjour tout le monde !

    Je vais essayer de faire simple, j'ai un programme écrit en C# qui envoie des variables en références à une DLL en C.
    Pour des variables simples comme des int, char, short, j'arrive à les récupérer après traitement dans mon programme principal, le problème commence lorsque j'utilise un string...

    Un extrait de mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    extern "C" __declspec(dllexport) void Receive ( long * ID, long *time, short * len,  string * Raw_Buff)
    {
    //Pas de problèmes pour ça :
           *ID=hCanEvent.dwIdent;
           *len=hCanEvent.wDataLen;
           *time=hCanEvent.dwTimeStamp;
     
    //Ne fonctionne pas :
           *Raw_Buff=(string)"Hello World";
    }
    Et dans mon programme principal, les déclarations :
    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
     
            private long    ID, time;
            private short   len = 8;
            private string  Raw_Buff;
     
     
     public void StartCan()
    {
                Raw_Buff=new string();
                if (i== Open())
                {
                    if (Activate() == 0)
                    {
                        while (!fin)
                        {
                            try
                            {
                                Receive(ref ID, ref time, ref len, ref Raw_Buff);
                                [...]
    Retour :
    ID = 100
    time = 1252
    len = 8
    Raw_Buff=null

    Si quelqu'un est inspiré, c'est pas de refus, j'ai tenté à peu près tout ce que j'imaginais ...

    Merci

  2. #2
    Expert confirmé
    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
    Par défaut
    A la place de Raw_Buff=new string(); ... (d'ailleurs c'est quoi ce truc ? en C# tu peut direct faire my_string = ""; et c'est correct) essaye d'utiliser un StringBuilder avec une taille de buffer à la taille voulue (cf. paramètres du constructeur). Et dans ce cas il faudra passer Raw_Buff directement, pas avec un ref.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 5
    Par défaut
    J'ai bien tenté ce que tu as dis, j'ai déclaré mon Raw_Buff
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Raw_Buff = new StringBuilder(128);
    Mais à l'appel de la fonction, j'ai un Debug Assertion Failed
    sizeInBytes>=count

    Je pense que c'est une incompatibilité de langages, je m'explique :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    //Importation dans le C#
    [DllImport("Wrapper.dll")]
    public static extern void Receive(ref long ident, ref long time, ref short len, StringBuilder data);
     
    //Exportation dans le C
    extern "C"__declspec(dllexport) void Receive( long *, long*, short*,  string );
    Je ne sais pas comment déclarer mon StringBuilder dans mon .C
    Serait-ce le problème ?

  4. #4
    Expert confirmé
    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
    Par défaut
    Normalement la déclaration en C ne change pas car un StringBuilder est passé en tant que pointeur vers une chaine de caractères ...

    Mince, deux trucs que j'avais pas vu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    *Raw_Buff=(string)"Hello World";
    etJe suppose donc que c'est du C++ et que c'est un std::string. Il faut pas assigner directement la valeur je pense, mais copier avec strcpy (ou sa version unicode) et utilisé comme source le c_str de ton objet string.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 5
    Par défaut
    Une semaine de bloquage pour des erreurs d'inatention

    Merci de ton aide, ça fonctionne parfaitement

  6. #6
    Expert confirmé
    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
    Par défaut
    n'oublie pas le

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

Discussions similaires

  1. export class via dll probleme ?
    Par cheroua dans le forum C++
    Réponses: 9
    Dernier message: 25/08/2006, 12h28
  2. communication servlet/applet via le protocole https
    Par hlaura dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 18/07/2006, 17h41
  3. communication des données via modem+rtc en VB6
    Par kadirov dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 06/07/2006, 11h56
  4. communication entre un projet DLL et une application
    Par ferry.jules dans le forum C++Builder
    Réponses: 95
    Dernier message: 22/05/2006, 20h06
  5. Réponses: 8
    Dernier message: 10/05/2006, 23h58

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