Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
897 connectés 

  FORUM HardWare.fr
  Programmation
  C#/.NET managed

  Char* to String C#

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Char* to String C#

n°1473400
mrcyprom
Posté le 10-11-2006 à 11:45:45  profilanswer
 

Bonjour tout le monde,
 
     J'utilise dans mon aplli C# (Winform) une DLL C++ créer par mes soins. Un problème se pose lorsque je souhaite récupérer d'une fonction contenue dans ma DLL un buffer . J'ai déjà essayé pas mal de choses pour arriver à mes fins. Passer une String C# en argument et en référence à la DLL (coté DLL la fonction à une std::string en paramètre) mais aucune modification n'est faite sur cette String. J'ai aussi éssayer de récupérer la string par valeur de retour mais là j'ai des problèmes d'incompatibilité (même avec Marshal). J'en arrive donc à essayer de retourner un Char*.
    Le problème c'est comment convertir dans mon code C# ce char* retourné en string pour pouvoir l'utilisé ???? Si certain d'entre vous ont la solution merci de m'en faire part.
 
PS: Si il existe une autre façon de faire, elle est bien venue. La majorité des exemples sur le net ne m'ont pas permis d'y parvenir.


---------------
Cordialement.
mood
Publicité
Posté le 10-11-2006 à 11:45:45  profilanswer
 

n°1473733
moi23372
Posté le 10-11-2006 à 20:54:58  profilanswer
 

passer par référence, tu as bien fait un "ref monString" ?

n°1473765
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 10-11-2006 à 23:17:16  profilanswer
 

moi23372 a écrit :

passer par référence, tu as bien fait un "ref monString" ?


ça n'a strictement rien à voir....
 
mrcyprom>> déjà, il faut coder en unsafe, car il va falloir faire usage de pointeurs. ensuite, il faut connaitre l'équivalent du type 'char' de C++ en C# : c'est le type 'sbyte'.
donc, en admettant que ta fonction C++ retourne un char*, tu peux la récupérer en C# comme ceci :

Code :
  1. unsafe
  2. {
  3.   sbyte* retbuffer = (sbyte*)Marshal.AllocHGlobal(256).ToPointer(); // on alloue un buffer de 256 octets sur le tas non managé. il faudra donc penser à le libérer
  4.   retbuffer = MaFonctionCPlusPlus(); // appel de la fonction C++ qui renvoie un char*. on récupère ce pointeur dans le buffer alloué
  5.   string str = new String(retbuffer); // on construit une chaine C# à partir du buffer.
  6.   Marshal.FreeHGlobal(retbuffer); // on a plus besoin du buffer, on peut donc le libérer
  7. }


c'est un code que j'ai pondu pour mon plugin winamp (qui possède un SDK en C, bonjour le marshalling), et qui fonctionne bien (tu peux essayer mon plugin pour t'en convaincre :whistle:)


Message édité par Harkonnen le 10-11-2006 à 23:17:44

---------------
J'ai un string dans l'array (Paris Hilton)
n°1473807
mrcyprom
Posté le 11-11-2006 à 09:02:07  profilanswer
 

Je te remerci pour cette réponse. En faite j'aivais réussi à renvoyer mon char* dans mon programme C# (utilisation de unsafe), il me manquait le moyen de convertir mon char*. Et le sbyte* semble résoudre le problème. Encore merci.


---------------
Cordialement.
n°1479419
_Mose_
Lonesome coder
Posté le 21-11-2006 à 16:29:12  profilanswer
 

Tient Harko, question qui n'a rien à voir : c'est chiant à faire un plug-in winamp ?
Genre rajouter un pti peu d'interface, histoire de faire ma propre média library :D

n°1479650
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 21-11-2006 à 22:54:15  profilanswer
 

en C# c'est un peu chiant oui, vu que l'API de winamp est en C, y'a plein de conversions de données entre managé et non managé à faire, sans oublier les pointeurs qu'il faut déclarer en fixe, pour éviter que le garbage collector ne les change de génération :/


---------------
J'ai un string dans l'array (Paris Hilton)

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C#/.NET managed

  Char* to String C#

 

Sujets relatifs
[résolu...enfin presq]Choix multiple pour une propriété de type string[C] Méthode replace de la classe string
s'échapper d'un while (cin>>string)...Passage d'une string C# à une std::string C++
TextField.text : le String magique ?[RESOLU] Taille maximum String et requête
superiorité de string[Résolu] [C#] String et Split
Mailer Error: Language string failed to load: recipients_failedme@s.fr[C] comment détecter les caractères BOM dans buffer char* ?
Plus de sujets relatifs à : Char* to String C#


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR