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 :

C# DllImport d'une fonction C utlisant un pointeur de char


Sujet :

C#

  1. #21
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    Salut

    Je vote comme TomLev, la lecture de tes bribes de codes dont celui ci entre autre
    _ArtNetSetCallBackFromTimeCode(new ArtNetFromTimeCodeDelegate(ArtNetWrapper.ArtNetFromTime));
    Me laisse penser instintivemement que tu dois avoir une belle recursion qq part

  2. #22
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par olibara Voir le message
    Me laisse penser instintivemement que tu dois avoir une belle recursion qq part
    Je ne pense pas que ce bout de code soit en cause... ArtNetFromTime fait juste un Console.WriteLine

  3. #23
    Membre averti
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2010
    Messages
    15
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2010
    Messages : 15
    Par défaut
    Le problème c'est qu'elle est vide ... très louche cette histoire, je précise que je n'utilise aucun Thread dans mon application, ni de fonction récursive ....

  4. #24
    Membre averti
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2010
    Messages
    15
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2010
    Messages : 15
    Par défaut
    Oups je n'avais pas vu la deuxième page

    Pour résoudre le problème j'ai d'abord réduit les cause éventuels ...
    Je n'utilise plus aucune méthode du wrapper sauf ArtNetInit.

    J'ai toujours cette exception StackOverflow

    Si j'appelle ArtNetInit dans un autre Thread que celui de mon application:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    new System.Threading.Thread(delegate() { ArtNet.ArtNetWrapper.ArtNetInit(); }).Start( );
    Le SplashScreen ArtNet s'affiche mais sans l'image, l'icône dans la zone de notification apparait puis disparait au premier survol de la souris mais je n'ai plus d'exception StackOverflow.

    Encore plus bizarre si je fait mouliner le thread comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    new System.Threading.Thread(delegate() {ArtNet.ArtNetWrapper.ArtNetInit(); while (true){}}).Start( );
    Cela marche !!! le serveur est démarrer le statut est renvoyé, l'interface graphique est fonctionnelle mais le SplashScreen ArtNet reste blanc et ne disparait pas .....

  5. #25
    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
    Le stackoverflow, ca peut être un problème de convention d'appel :

    - en C Calling convention, c'est l'appelant qui nettoye la pile
    - en standard (pascal) convention, c'est l'appelé qui nettoye la pile.

  6. #26
    Membre averti
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2010
    Messages
    15
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2010
    Messages : 15
    Par défaut
    Je suis obligé d'utiliser la C Calling convention, ....
    Donc comment puis-je nettoyer la pile ?

  7. #27
    Membre averti
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2010
    Messages
    15
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2010
    Messages : 15
    Par défaut
    Après quelques recherche j'ai l'impression qu'il n'est pas possible ne nettoyer cette pile, je suis donc condamné à écrire un Wrapper en C++ qui utiliserais la convention d'appel StdDecl , c'est bien ça ?

  8. #28
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par Bluedeep Voir le message
    Le stackoverflow, ca peut être un problème de convention d'appel :

    - en C Calling convention, c'est l'appelant qui nettoye la pile
    - en standard (pascal) convention, c'est l'appelé qui nettoye la pile.
    Citation Envoyé par champy_dev Voir le message
    Je suis obligé d'utiliser la C Calling convention, ....
    Donc comment puis-je nettoyer la pile ?
    Citation Envoyé par champy_dev Voir le message
    Après quelques recherche j'ai l'impression qu'il n'est pas possible ne nettoyer cette pile, je suis donc condamné à écrire un Wrapper en C++ qui utiliserais la convention d'appel StdDecl , c'est bien ça ?
    T'emballe pas, ça peut être un problème de convention d'appel, mais à mon avis ce n'est pas la cause la plus probable... Commence par explorer les autres pistes avant de te lancer dans la création d'un wrapper C++

    Au fait, quelle est la définition de la macro DLL_MODE dans le code C ?

  9. #29
    Membre averti
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2010
    Messages
    15
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2010
    Messages : 15
    Par défaut
    Pour ce qui est de la macro DLL_MODE voici sa déclaration :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define DLL_MODE __declspec(dllimport)
    Si il y as une autre solution que de passer par une dll C++ qui Wrap les fonctions C je suis preneur car j'ai peu de connaissance dans ses langages.

    Pour info avec VS2010 cette macro rend la compilation des projets d'exemple C++ impossible. Avec VC++6 ses mêmes projet compilent ?!

  10. #30
    Membre averti
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2010
    Messages
    15
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2010
    Messages : 15
    Par défaut
    La définition de cette macro donne une information sur la convention d'appel à utiliser ?

  11. #31
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Je ne sais pas exactement ce que signifie __declspec, et la doc à ce sujet ne m'éclaire pas vraiment... en tous cas dans mon code de test c'était __cdecl, qui indique clairement la convention C. Tu peux toujours essayer avec les autres valeurs de CallingConvention, mais je sais pas si ça règlera le problème...

  12. #32
    Membre averti
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2010
    Messages
    15
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2010
    Messages : 15
    Par défaut
    Avec le même paramètre CharSet j'ai essayé toutes les conventions d'appel sans succès

    Est-il impossible de nettoyer la pile utiliser par la librairie C ? Si c'est à l'appelant de nettoyer la pile même en C il ne peut pas savoir quelles variables serons utilisées par la fonction qu'il appelle, donc il ne doit nettoyer que les variables qu'il passent en paramètre ... donc il s'agit de vider la partie de la mémoire associer au paramètre (en l'occurrence ce fameux char* C ou String C#) que je passe de mon application C# à cette librairie C, cela doit bien être possible .....
    Je vais googler dans cette voie.

    Je suppose juste,si je m'égare complétement avertissez moi

  13. #33
    Membre averti
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2010
    Messages
    15
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2010
    Messages : 15
    Par défaut
    Pour ce qui est du __declspec apparemment c'est une extension du mot-clef __export présente Dans les versions les plus récentes du compilateur comme le dit avec précision Microsoft (Exportation à partir d'une DLL à l'aide de __declspec(dllexport)) Qui permet d'exporter les données, les fonctions, les classes ou les fonctions membres d'une classe ... Sous-entendu le mot-clef __export ne le permettais pas, enfin c'est ce que j'en déduis.

    Bref cela ne m'avance pas beaucoup, un peu de recul ne me feras pas de mal, encore merci pour vos réponses.

  14. #34
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par champy_dev Voir le message
    Je suppose juste,si je m'égare complétement avertissez moi
    Ca me parait beaucoup trop compliqué, même en supposant que ce soit possible... A mon avis ce n'est pas de là que vient le problème. Il n'y a pas 36 conventions d'appel, si tu les as toutes essayées c'est que ce n'est pas ça. Commence par explorer d'autres pistes plus plausibles...

    A quel endroit de ton code appelles-tu ArtNetInit ? Est-ce que tu es sûr que c'est bien ça qui pose le problème ? Essaie de remplacer l'appel à ArtNetInit par un appel à une autre méthode : est-ce que tu as la même erreur ?

  15. #35
    Membre averti
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2010
    Messages
    15
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2010
    Messages : 15
    Par défaut
    Je développe cette application en collaboration avec mon colocataire ingénieur lumière, l'idée est de pouvoir piloter des périphériques Art-Net à partir d'autres signaux (MIDI , Gate sur des sons ...), un batteur sur une batterie MIDI pourrais déclencher le lancement d'une vidéo ... les applications sont nombreuses.

    Cette application est développé en WPF MVVM, elle se présente sous forme de Rack ou l'on peut ajouter des composants ( entrées/Sorties Art-Net, entrées/sorties Midi, Fader virtuel ...) que l'on peut ensuite connecter entre eux.

    J'ai une classe Set qui contient les éléments du Rack et leur connexion et quelques paramètres (nom du set , Bpm si besoin ...).
    J'ai une classe SetManager ( qui comporte un instance de Set appelé CurrentSet) qui gère le Set (sérialisation/dé sérialisation, ajout d'un composant, d'une connexion ....) ,c'est cette classe SetManager qui sert de contexte de donnée à mon application, elle comporte notamment toutes les RelayCommand appelé dans l'interface graphique.

    Dans l'interface graphique j'ai un bouton dont la propriété Command est Binder à ma RelayCommand StartArtNetCommand :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <Button Command="{Binding Path=StartArtNetCommand}" Margin="5 0 5 0" Content="Démarrer" >
    Dans ma classe SetManager j'ai la déclaration de cette RelayCommand:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    private RelayCommand _startArtNetCommand;
            public ICommand StartArtNetCommand
            {
                get
                {
                    if (_startArtNetCommand == null)
                    { _startArtNetCommand = new RelayCommand(param => this.StartArtNet()); }
                    return _startArtNetCommand;
                }
            }
    La RelayCommand appelle la méthode StartArtNet de la classe SetManager, voici sont contenu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     private void StartArtNet()
            {
                Console.WriteLine("StartArtNet");
                ArtNetWrapper.ArtNetInit();
                //for (int i = 0; i < Sanford.Multimedia.Midi.OutputDevice.DeviceCount; i++)
                //{
     
                //    MidiOutCaps midiOutCaps = Sanford.Multimedia.Midi.OutputDevice.GetDeviceCapabilities(i);
                //    MidiOutputDecorator midiOutputDecorator = new MidiOutputDecorator();
                //    midiOutputDecorator.DeviceId = i;
                //    midiOutputDecorator.Name = midiOutCaps.name;
     
                //}
            }

    Si je commente la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ArtNetWrapper.ArtNetInit();
    et que je décommente les lignes qui concernent les sorties Midi (elle n'ont rien à faire la c'est juste pour le test) cela marche , pas de StackOverflow .....

  16. #36
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut

    Là je sais vraiment plus quoi te proposer comme solution

  17. #37
    Membre averti
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2010
    Messages
    15
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2010
    Messages : 15
    Par défaut
    Ba je crois que je vais repartir sur ma propre implémentation UDP du protocole ArtNet ... Je manque trop de connaissance en C/C++ pour continuer mes recherches . Dommage cela m'aurais vraiment simplifier la vie.

    Merci pour vos réponses en tout cas.

Discussions similaires

  1. Réponses: 3
    Dernier message: 16/03/2011, 15h35
  2. Réponses: 6
    Dernier message: 16/01/2011, 15h33
  3. DLL:exporter une fonction qui retourne un pointeur
    Par ephemeride dans le forum C++
    Réponses: 2
    Dernier message: 29/09/2006, 11h42
  4. [Turbo Pascal] Allocation et désallocation de pointeurs dans une fonction
    Par neird dans le forum Turbo Pascal
    Réponses: 13
    Dernier message: 17/11/2002, 20h14
  5. Une fonction avec des attributs non obligatoires
    Par YanK dans le forum Langage
    Réponses: 5
    Dernier message: 15/11/2002, 13h39

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