Char* to String C#

Char* to String C# - C#/.NET managed - Programmation

Marsh Posté le 10-11-2006 à 11:45:45    

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.
Reply

Marsh Posté le 10-11-2006 à 11:45:45   

Reply

Marsh Posté le 10-11-2006 à 20:54:58    

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

Reply

Marsh Posté le 10-11-2006 à 23:17:16    

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)
Reply

Marsh Posté le 11-11-2006 à 09:02:07    

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.
Reply

Marsh Posté le 21-11-2006 à 16:29:12    

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

Reply

Marsh Posté le 21-11-2006 à 22:54:15    

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)
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed