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 :

Exporter string c++


Sujet :

C++

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre confirm�
    Homme Profil pro
    �tudiant
    Inscrit en
    Juillet 2014
    Messages
    89
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (�le de France)

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : Juillet 2014
    Messages : 89
    Par d�faut Exporter string c++
    Bonjour � tous,

    Je suis d�butant en c++, et j aimerais exporter � partir d'une dll c++ un string ou char.

    Le code en lui m�me ouvr� un fichier texte au et recopie son contenu dans la variable char.

    Une fonction getText permet de retourner le char
    Cette fonction est export� dans la dll

    Lorsque j appelle la dll sous vs en c# je n arrive pas a recuperer le texte.

    Pouvez vous m aider ?

    apercu code c++

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    char getText()
    {
         char c[10]; //char[0]=a....char[10]=k
         return c[10];
    }
    apercu code C#:

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
            public static extern char getText();
            static void Main(string[] args)
            {
     
     
                charresult = getText();
     
                Console.ReadKey();
            }

  2. #2
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    Si tu veux retourner une cha�ne de caract�res char d'une mani�re utilisable depuis le C#, le plus simple est de retourner une cha�ne allou�e avec CoTaskMemAlloc() (obtenue en incluant <windows.h>):
    Code C : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #include <windows.h>
    #include <strsafe.h>
     
    char* getText()
    {
    	char * txt = CoTaskMemAlloc(10);
    	if(txt == NULL)
    		return NULL; /*Echec*/
    	StringCchCopy(txt, 10, "toto");
    	return txt;
    }
    Code C# : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    using System.Runtime.InteropServices;
     
    class MaClasse
    {
    	//Le premier attribut signale une fonction dans ta DLL, 
    	//	avec la convention d'appel C (vu qu'elle n'est pas déclarée __stdcall),
    	//	et dont les chaînes de caractères sont constituées de char (et non pas de wchar_t).
    	//Le second attribut signale qu'elle retourne une chaîne allouée avec CoTaskMemAlloc()
    	//	Le framework .Net s'occupera de convertir la chaîne en System::String, et d'appeler CoTaskMemFree().
    	[DllImport("madll.dll", CallingConvention=CallingConvention.Cdecl, CharSet=CharSet.Ansi)]
    	[return: MarshalAs(UnmanagedType.LPStr)]
    	extern static string getText();
    }
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    Ah, vu que tu es en C++, il faudra d�clarer ta fonction en extern "C". Et une fonction de conversion de std::string en cha�ne utilisable devrait t'�tre utile aussi:
    Code C++ : 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
    #include <windows.h>
    #include <strsafe.h>
    #include <string>
     
    //Définit une macro EXTERN_C pour gestion facilitée
    #ifndef EXTERN_C
    #ifdef __cplusplus
    #define EXTERN_C extern "C"
    #else
    #define EXTERN_C extern
    #endif
    #endif
     
    char* CoTaskMemAllocFromString(std::string const &str)
    {
    	size_t bufferSize = str.length() + 1;
    	char* ret = CoTaskMemAlloc(bufferSize);
    	if(ret == NULL)
    		return NULL; //Echec
    	StringCchCopy(ret, bufferSize, str.c_str());
    	return ret;
    }
     
    EXTERN_C char* getText()
    {
    	std::string str = "toto";
    	str += "titi";
    	char * txt = CoTaskMemAllocFromString(str);
    	return txt;
    }
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  4. #4
    Membre confirm�
    Homme Profil pro
    �tudiant
    Inscrit en
    Juillet 2014
    Messages
    89
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (�le de France)

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : Juillet 2014
    Messages : 89
    Par d�faut
    je suis parvenu � r�cuperer toto en string depuis vs sous c#.

    Maintenant j'aimerais faire la m�me chose avec une chaine de caract�re, cad r�cuperer en c# une chaine renvoy� par la dll c++, c'est possible ?

  5. #5
    Membre confirm�
    Homme Profil pro
    �tudiant
    Inscrit en
    Juillet 2014
    Messages
    89
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (�le de France)

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : Juillet 2014
    Messages : 89
    Par d�faut
    tr�s compliqu� tout �a :S

    J'ai r�ussi � stocker un xml dans un char[1000]
    Mais impossible de le r�cup�rer dans mon code c#, j'obtiens parfois des caract�res incompr�hensibles

    exemple de xml:

    Code xml : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <?xml version="1.0" encoding="utf-8"?>
    <root>
      <title>Some Title</title>
      <description>Some description</description>
      <keywords>
        <keyword>Keyword1</keyword>
        <keyword>Keyword2</keyword>
        <keyword>Keyword3</keyword>
        <keyword>Keyword4</keyword>
       </keywords> 
    </root>

    valeur de char[100]:


    char[0] = <
    char[1] = ?
    char[2] =x...

  6. #6
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    Dans ce cas, il faudrait plut�t le transmettre comme tableau d'octets, mais pour avoir la longueur avec, ce n'est pas �vident (� moins d'utiliser un SAFEARRAY, qui est loin d'�tre trivial � utiliser).

    Sinon, tu pourrais convertir la cha�ne UTF-8 en UTF-16 depuis le C avec la fonction MultiByteToWideChar(), retournant ainsi au C# une cha�ne de wchar_t (voire une BSTR, qui est un autre type accept� par C#) qui n'aurait pas de soucis de conversion.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. R�ponses: 4
    Dernier message: 22/07/2011, 09h33
  2. PB export string 250 ->(MEMO)
    Par AODRENN dans le forum Bases de donn�es
    R�ponses: 1
    Dernier message: 14/06/2007, 09h16
  3. R�ponses: 1
    Dernier message: 22/08/2002, 17h00
  4. String Grid et choix d'une couleur pour une ligne
    Par Gigottine dans le forum C++Builder
    R�ponses: 12
    Dernier message: 17/05/2002, 15h23
  5. [CR] exporter en PDF
    Par Nathy dans le forum SAP Crystal Reports
    R�ponses: 3
    Dernier message: 16/05/2002, 09h27

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