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++/CLI Discussion :

Probleme de passage de string entre DLL win32 et projetC#?


Sujet :

C++/CLI

  1. #1
    Membre habitué Avatar de Jayceblaster
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    420
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 420
    Points : 174
    Points
    174
    Par défaut Probleme de passage de string entre DLL win32 et projetC#?
    Bonjour a tous...

    Voila j'ai une DLLwin32 qui me renvoie une string (écrite en pascal) et j'ai un programme c# (je suis sous delphi2006) qui doit me récupérer cette string comme montré ci-dessous;

    la DLL:
    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
     
     
     
    uses
      SysUtils,
      Classes,
      ShareMem;
     
    {$R *.res}
     
    function Phrase(): string;stdcall;
    begin
       Phrase := 'la phrase a envoyer';
    end;
     
     
    exports Phrase;
    le source C#:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
         //import de la fonction de DLL
         [DllImport("c:\\envoieString.dll")]
         private static extern string Phrase();
     
         string maPhrase = Phrase();  //récupèration de ma phrase
    Mais le probleme est que quand j'exécute le source C# j'ai une erreur d'exécution à la ligne "string maPhrase = Phrase(); "...j'ai l'erreur suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    La référence d'objet n'est pas définie à une instance d'un objet
    J'ai ce problème que pour le type string et je ne comprend pas...

    Quelqu'un peut il m'expliquer ce qui se passe et m'expliquer ce que je dois faire?

    Merci d'avance pour l'aide
    Heureux est l'étudiant qui, comme la rivière, arrive à suivre son cours sans sortir de son lit........

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    349
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Avril 2006
    Messages : 349
    Points : 320
    Points
    320
    Par défaut
    Salut !

    Tu fais l'import de ta dll dans la même classe que celle où tu l'utilises ?

    Sinon je ne connais pas trop le pascal mais j'ai l'impression que ta fonction ne renvoie pas "Phrase"... Je me trompe ?

    ++
    Le problème est souvent entre la chaise et le clavier

  3. #3
    Membre habitué Avatar de Jayceblaster
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    420
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 420
    Points : 174
    Points
    174
    Par défaut
    SesechXP à écrit:
    Tu fais l'import de ta dll dans la même classe que celle où tu l'utilises ?
    Je ne comprend pas ta question...

    SesechXP à écrit:
    Sinon je ne connais pas trop le pascal mais j'ai l'impression que ta fonction ne renvoie pas "Phrase"... Je me trompe ?
    ma fonction renvoie 'la phrase a envoyer' car en pascal quand tu ecris:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    function Phrase(): string;stdcall;
    begin
       Phrase := 'la phrase a envoyer';
    end;
    ca reviens à écrire en c#:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    function string Phrase();
    {
       return "la phrase a envoyer";
    }
    Bon ben j'ai toujours pas compris pourquoi ça marche pas...
    Heureux est l'étudiant qui, comme la rivière, arrive à suivre son cours sans sortir de son lit........

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    349
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Avril 2006
    Messages : 349
    Points : 320
    Points
    320
    Par défaut
    Ce bout de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    //import de la fonction de DLL
    [DllImport("c:\\envoieString.dll")]
    private static extern string Phrase();
     
    string maPhrase = Phrase();  //récupèration de ma phrase
    Tout est dans la même classe ?

    Car comme la fonction de ta dll est en "private" elle est inaccessible depuis les autres classes.

    ++
    Le problème est souvent entre la chaise et le clavier

  5. #5
    Membre habitué Avatar de Jayceblaster
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    420
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 420
    Points : 174
    Points
    174
    Par défaut
    Oui
    Heureux est l'étudiant qui, comme la rivière, arrive à suivre son cours sans sortir de son lit........

  6. #6
    Membre habitué Avatar de Jayceblaster
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    420
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 420
    Points : 174
    Points
    174
    Par défaut
    personne ne peut me dire comment on peut assurer le passage de string de Win32 à .Net
    Heureux est l'étudiant qui, comme la rivière, arrive à suivre son cours sans sortir de son lit........

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    349
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Avril 2006
    Messages : 349
    Points : 320
    Points
    320
    Par défaut
    Perso j'utilises des StringBuilder plutôt que des String quand je dois utiliser des dll Win32 (écrites en C).

    ++
    Le problème est souvent entre la chaise et le clavier

  8. #8
    Membre habitué Avatar de Jayceblaster
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    420
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 420
    Points : 174
    Points
    174
    Par défaut
    stringBuilder???? c'est quoi la différence avec les string?
    Heureux est l'étudiant qui, comme la rivière, arrive à suivre son cours sans sortir de son lit........

  9. #9
    Membre habitué Avatar de Jayceblaster
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    420
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 420
    Points : 174
    Points
    174
    Par défaut
    je suis donc le seul a essayer de passer une string d'une DLLWin32 à un programme DotNet??? suis-je tordu???

    Help me
    Heureux est l'étudiant qui, comme la rivière, arrive à suivre son cours sans sortir de son lit........

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Octobre 2005
    Messages : 55
    Points : 49
    Points
    49
    Par défaut
    Citation Envoyé par Jayceblaster
    je suis donc le seul a essayer de passer une string d'une DLLWin32 à un programme DotNet??? suis-je tordu???

    Help me

    C'est parcequ'une string d'une DLL Win32 c'est un concept qui dépend du langage Win32 utilisé.

    La string du pascal n'est pas équivalente à celle de C#. Le Marshalling ne va probablement pas se faire automatiquement.

    Je ne connais pas du tout pascal, mais essaie de passer un tableau de char à la place, juste pour voir.

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    349
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Avril 2006
    Messages : 349
    Points : 320
    Points
    320
    Par défaut
    Citation Envoyé par Jayceblaster
    stringBuilder???? c'est quoi la différence avec les string?
    La principale différence (apparente) c'est que spécifies la taille de ta chaîne de caractères. Plus d'infos ici

    +1 pour jobigoud

    ++
    Le problème est souvent entre la chaise et le clavier

  12. #12
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Un exemple qui marche de C à C#
    J'ai eu le même problème que toi mais en partant de dlls en C (sous labwindows CVI) et projet C# (VS 2003).
    Voici mon code, ça peut t'aider:
    Fonction en C dans le fichier .h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    char *__stdcall _ReturnErrorString (int error);
    Appel de la fonction en C#
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    [DllImport("dll_name.dll",EntryPoint="_ReturnErrorString",ExactSpelling=false,CallingConvention=CallingConvention.StdCall)]
    public static unsafe extern string ReturnErrorString (int error);
    et utilisation de la fonction en C#
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public unsafe void LowLevelCall(int error,string failed_message)
    {
      string msg2 = DLL._ReturnErrorString(error);
      string msg = String.Format("{0} - Error [{1}]: {2}",failed_message,error,msg2);
      //Write in log message
      this.LogText = msg;
      throw new Exception(msg);
    		}
    Je te précise que je suis débutante en programmation en C#... mais j'espère que ça pourra t'aider...

  13. #13
    Futur Membre du Club
    Inscrit en
    Juillet 2005
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 5
    Points : 6
    Points
    6
    Par défaut
    Bonjour,

    voici comment j'utilise les DLL développées en C++ sous DEV CPP avec VS 2005 - C#.
    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
     
    namespace toto
    {
        class Pesage
        {
            public Pesage()
            {
            }
     
            // Nom de la DLL
            private const string DLL = "DLLPesee.dll";
     
            [DllImport(DLL)]
            public static extern string Version();
     
        }
    }
     
    namespace tata
    {
        class config
        {
    	public config()
    	{
    		Pesage cPes = new Pesage();
    		MessageBox.Show(cPes.Version());
    	}
        }
    }
    A+

  14. #14
    Membre éclairé
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Février 2004
    Messages
    644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant ERP

    Informations forums :
    Inscription : Février 2004
    Messages : 644
    Points : 785
    Points
    785
    Par défaut
    Le problème provient de ta DLL écrite en Delphi.

    1) tu utilises string en delphi pour retourner une chaine, le problème c'est qu'il s'agit certainement d'un AnsiString ( String façon Borland ).
    Ces AnsiString sont incompatible avec le type String de C# ce qui est normal vu que la signature des classes représentant les Strings des deux langages ne sont pas équivalente ( ce pourquoi il faut employer un wrapper / binding ).

    2) Tu aurais bien plus de chance d'employer un array of char à la place de ton string delphi.

    3) ShareMem doit être utilisé si tu utilises des AnsiStirng d'un projet Delphi vers un projet C++ Builder.
    Nul ne peut mieux connaitre la connaissance qu'elle-même.

  15. #15
    Membre éclairé
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Février 2004
    Messages
    644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant ERP

    Informations forums :
    Inscription : Février 2004
    Messages : 644
    Points : 785
    Points
    785
    Par défaut
    Je rajoute que la seule possibilité actuellement d'utiliser des DLL à travers différents langages est de respecter le types primitifs en stdcall.


    Attention, Delphi comme C++ Builder emploient du fastcall qui est un passage de paramètres sur trois registres, c encore un truc à la sauce borland
    Nul ne peut mieux connaitre la connaissance qu'elle-même.

  16. #16
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 12
    Points : 9
    Points
    9
    Par défaut problème de passage de string
    Ta fonction pascal devrait retourner un pchar c'est le type de chaine que traite C# ou Windows c'est la déclaration type du C

Discussions similaires

  1. Passage d'objets entre DLL
    Par oodini dans le forum C++
    Réponses: 5
    Dernier message: 01/04/2009, 11h27
  2. Problème de passage de string entre DLL
    Par oodini dans le forum C++
    Réponses: 4
    Dernier message: 24/03/2009, 16h34
  3. Passage de valeurs entre dll en C++ vers visual basic
    Par martos dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 15/07/2008, 11h08
  4. Réponses: 1
    Dernier message: 16/03/2007, 15h28
  5. Passage de String à une DLL
    Par tsp dans le forum C++
    Réponses: 1
    Dernier message: 09/03/2006, 16h53

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