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++Builder Discussion :

conversion d'un string en char *


Sujet :

C++Builder

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 78
    Points : 18
    Points
    18
    Par défaut conversion d'un string en char *
    bonjour tout le monde,
    jaimerai savoir comment on pourrai convertir un string en char * pour que je puisse lexploiter ??

  2. #2
    Membre averti Avatar de niglo
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    379
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 379
    Points : 383
    Points
    383
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    AnsiString chaine;
    Char* chaineEnCharEtoile = chaine.c_str();

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 78
    Points : 18
    Points
    18
    Par défaut
    bonjour niglo,
    jai pas compris comment on fait tellement je marrache les cheveux dessus ! mon code le voici

    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
     
    extern "C" __declspec(dllexport) __stdcall char MaFonction_chemin(char *myVar);
     
    /********************** Point d'entré de la DLL **********/
    int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
    {
    return 1;
    }
     
    char __stdcall MaFonction_chemin(char *myVar)
    {
    AnsiString chaine;
    myVar = chaine.c_str();
    return myVar;
    }
    je ne compren rien cela ne fonctionne pas !

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 78
    Points : 18
    Points
    18
    Par défaut
    meme en mettant en fin de ma fonction


    cela ne fonctionne pas !

  5. #5
    say
    say est déconnecté
    Membre expérimenté
    Avatar de say
    Profil pro
    Inscrit en
    Août 2002
    Messages
    1 176
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 1 176
    Points : 1 300
    Points
    1 300
    Par défaut
    dites moi si je me déchire mais c normal que ta fonction retourne un char à la place d'un char* ????
    Ils ne savaient pas que c'était impossible alors ils l'ont fait (Mark Twain)
    _ _ _ _ _ _ _ _ _

    La planète ne nous appartient pas, elle nous a été prêtée par nos enfants
    _ _ _ _ _ _ _ _ _

    Technos : Access, C++ Builder, SQL, PostgreSQL, Crystal Reports, XML entre autres

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 78
    Points : 18
    Points
    18
    Par défaut
    non je veu recuperer une chaine de caractere ! tellement jai mal o crane je ne sais meme plus !!

  7. #7
    Membre averti Avatar de niglo
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    379
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 379
    Points : 383
    Points
    383
    Par défaut
    Citation Envoyé par ferry.jules
    bonjour niglo,
    jai pas compris comment on fait tellement je marrache les cheveux dessus ! mon code le voici

    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
     
    extern "C" __declspec(dllexport) __stdcall char MaFonction_chemin(char *myVar);
     
    /********************** Point d'entré de la DLL **********/
    int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
    {
    return 1;
    }
     
    char __stdcall MaFonction_chemin(char *myVar)
    {
    AnsiString chaine;
    myVar = chaine.c_str();
    return myVar;
    }
    je ne compren rien cela ne fonctionne pas !
    Effectivement, ca fonctionnera mieux si tu mets char* en type de retour !

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 78
    Points : 18
    Points
    18
    Par défaut
    MEME EN METTANT UN CHAR * en retour cela ne fonctionne pas !!!!
    char __stdcall MaFonction_chemin(char *myVar)
    {


    AnsiString chaine;
    myVar = chaine.c_str();
    return *myVar;
    }

  9. #9
    Membre éprouvé

    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 163
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 163
    Points : 1 148
    Points
    1 148
    Par défaut
    Oui déjà le char * mais ça ne suffira pas forcément.
    Suffit de regarder l'aide sur c_str pour comprendre : le pointeur c_str n'est garanti valide QUE dans la ligne dans laquelle il a été appelé.

    Donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #include <string.h>
    char* __stdcall MaFonction_chemin(char *myVar)
    {
    AnsiString chaine;
    return strdup(chaine.c_str());
    }
    Neilos

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 78
    Points : 18
    Points
    18
    Par défaut
    la jai mi la ligne de commande que tu ma donner ! cela fonctionne mai ce que je recupere ne correspond pas a ce que je dois recevoir !!

  11. #11
    Membre éprouvé

    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 163
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 163
    Points : 1 148
    Points
    1 148
    Par défaut
    Tu peux nous donner la ligne que tu donnes en entrée et ce que tu récupères ?

    P.S. Merci de faire des efforts sur ton français, tu n'es pas sur ton téléphone portable.

    En même temps tu devrais avoir une chaine vide vu le code de la fonction. Tu veux faire quoi au fait ?
    Neilos

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 78
    Points : 18
    Points
    18
    Par défaut Merci de penser aux balises CODE !
    bon encore dsl pour le francais !
    je veux recuperer une chaine de caractere qui est donner a ma dll ! cette chaine est etabli sous visual basic ! le programme en question sous visual marche parfaitement ! de ce coter ya pas de probleme ! maintenant je dois recuperer cette chaine de caractere pour pouvoir la donner a ma TForm1 pour pouvoir ensuite l'afficher dans une conbobox !

    VISUAL BASIC
    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 Declare Function MaFonctionchemin Lib "C:\Documents and Settings\U228167\Desktop\mohamed\Projet\060512\version2\exe_dll\Dll.dll" Alias "MaFonction_chemin" (ByVal myVar As String) As String
     
     
    Private Sub CommandButton1_Click()
     
        Dim myVar As String
        MsgBox ("post affectation chemin")
        myVar = "Chemin"
     
        MsgBox ("pre affectation chemin")
        MsgBox (myVar)
        Dim zer As String
     
        zer = MaFonctionchemin(myVar)
        MsgBox (myVar)
        MsgBox (zer)
     
    End Sub
    ----------------------------------------------------------------------------------------------------------------------------------------------------
    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
     
    /********************* Include ***************************/
    #include <clx.h>
    #include <windows.h>
    #include "ExecutableFrm.h"
    #include "Saisie.h"
    #include <string.h>
     
    extern "C" __declspec(dllexport) __stdcall char MaFonction_chemin(char *myVar);
     
    #pragma argsused
     
    /********************** Point d'entré de la DLL **********/
    int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
    {
            return 1;
    }
     
     
     
    char __stdcall MaFonction_chemin(char *myVar)
    {
            AnsiString chaine;
            myVar= strdup(chaine.c_str());
            return *myVar;
    }
    donc jai etabli une communication qui fonctionne bien mais le resultat la chaine ne correspond pas ! au lieu de voir "chemin" dans ma MsgBox je vois des carré et autres !!

  13. #13
    Membre actif Avatar de Mattetfamilly
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    182
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 182
    Points : 201
    Points
    201
    Par défaut envoi et retour?
    Bonsoir Jules,

    Tout dabord désolé pour le char au lieu de char*: en relisant cela me saute aux yeux... J'ai d'ailleurs reproduit cette erreur ce matin en synthètisant des fonctions de mon application en vue de créer une DLL.

    La fonction écrite ainsi, a 1 défaut: tu déclares une chaîne "chaine", elle s'intialise et est donc théoriquement vide puis tu la renvoies...
    Là y'a franchement un soucis...

    Que dois faire cette fonction?
    Pour le moment c'est normal si la chaîne retournée est vide.
    A quoi sert la chaîne MyStr que tu envoies à la fonction? Que contient-elle?
    Quel traitement ta fonction doit réaliser à partir de cette chaîne avant de renvoyer une autre chaîne?

    char *__stdcall MaFonction_chemin(char *myVar)
    {
    AnsiString chaine;

    StrPCopy(chaine,myVar); //La fonction doit elle modifier la chaîne?

    myVar= strdup(chaine.c_str());

    return myVar;
    }


    Mattetfamilly
    on aura tout vu...
    Mais où est-ce???...
    ------------------------------------------------------
    n'oublies pas les balises [code ][/code ]
    et le Tag

  14. #14
    Membre éprouvé

    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 163
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 163
    Points : 1 148
    Points
    1 148
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    char __stdcall MaFonction_chemin(char *myVar)
    {
            AnsiString chaine;
            myVar= strdup(chaine.c_str());
            return *myVar;
    }
    Ce code est faux : tu retourne un char, il s'agit d'un caractère et non pas d'une chaine.

    D'où :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    char* __stdcall MaFonction_chemin(char *myVar)
    {
            return strdup(myVar);
    }
    Cette chaine te retourneras une copie de la chaine qu'elle reçoit en paramètre. Regarde bien le code que tu avais avant...outre le fait que ton type de retour était faux, chaine ne contenait rien..

    Encore une petite chose, peux tu penser à encadrer ton code dans les balises ...cela améliore la lisibilité !
    Neilos

  15. #15
    Membre chevronné
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Mars 2002
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 044
    Points : 2 187
    Points
    2 187
    Billets dans le blog
    1
    Par défaut
    bonsoir,
    petites questions quelle est la taille maximum de Chaine
    dans l'exemple si elle plus grande que 255 caractères la chaine retournée par la fonction dans la dll est nulle;
    tu peux facilement changer la taille du buffer en modifiant la constante
    MaxBufferSize

    attention évite d'utiliser dans AnsiString dans les DLL cela oblige a trimballer l'artillerie lourde de Borland

    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
     
    //---------------------------------------------------------------------------
    #include <string.h>
    #include <windows.h>
    const  MaxBufferSize = 255;
    extern "C" __declspec(dllexport) char* __stdcall  MaFonction_chemin(char *myVar);
     
    //---------------------------------------------------------------------------
    //   Remarque importante concernant la gestion de mémoire de DLL lorsque votre DLL utilise la
    //   version statique de la bibliothèque d'exécution :
    //
    //   Si votre DLL exporte des fonctions qui passent des objets String (ou des
    //   structures/classes contenant des chaînes imbriquées) comme paramètre
    //   ou résultat de fonction, vous devrez ajouter la bibliothèque MEMMGR.LIB
    //   à la fois au projet DLL et à tout projet qui utilise la DLL.  Vous devez aussi
    //   utiliser MEMMGR.LIB si un projet qui utilise la DLL effectue des opérations
    //   new ou delete sur n'importe quelle classe non dérivée de TObject qui est
    //   exportée depuis la DLL. Ajouter MEMMGR.LIB à votre projet forcera la DLL et
    //   ses EXE appelants à utiliser BORLNDMM.DLL comme gestionnaire de mémoire.
    //   Dans ce cas, le fichier BORLNDMM.DLL devra être déployé avec votre DLL.
    //
    //   Pour éviter d'utiliser BORLNDMM.DLL, passez les chaînes comme paramètres "char *"
    //   ou ShortString.
    //
    //   Si votre DLL utilise la version dynamique de la RTL, vous n'avez pas besoin
    //   d'ajouter MEMMGR.LIB, car cela est fait automatiquement.
    //---------------------------------------------------------------------------
     
    #pragma argsused
    BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fwdreason, LPVOID lpvReserved)
    {
            return 1;
    }
    //---------------------------------------------------------------------------
    char* __stdcall MaFonction_chemin(char *myVar)
    {
      char Buffer[MaxBufferSize];
      ZeroMemory(Buffer,MaxBufferSize);
      if (strlen(myVar) > MaxBufferSize ) return "";
      strcpy(Buffer,myVar);
      return Buffer;
    }
    Cordialement
    vous trouverez mes tutoriels à l'adresse suivante: http://djmsoftware.developpez.com/
    je vous en souhaite une excellente lecture ...

    A lire : Les règles du forum

  16. #16
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 78
    Points : 18
    Points
    18
    Par défaut
    Je vous remercu infiment a tous ceux qui ont contribuer a ce sujet !

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

Discussions similaires

  1. Conversion d'un String en Char*
    Par ChPr dans le forum Langage
    Réponses: 15
    Dernier message: 22/08/2013, 19h00
  2. conversion d'un string en char*?
    Par melleb dans le forum C#
    Réponses: 4
    Dernier message: 02/09/2008, 10h06
  3. conversion d'une string en char
    Par vulkanosaure dans le forum C++
    Réponses: 12
    Dernier message: 02/11/2007, 19h55
  4. Conversion de type string en char ?
    Par CoachMac dans le forum C
    Réponses: 18
    Dernier message: 08/08/2006, 10h20
  5. (Problème avec...) conversion de std::string en char
    Par crossbowman dans le forum SL & STL
    Réponses: 7
    Dernier message: 05/03/2006, 19h54

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