2010-07-07 5 views
2

S'il vous plaît aider,Appeler un C++ méthode qui renvoie une chaîne, de C#

my c++ function: 
extern "C" REGISTRATION_API void calculate(char* msg) 
{ 
//some calculation here 

msg = "some text"; 
} 

mon C# appel:

[DllImport("thecpp.dll")] 
static extern void calculate(StringBuilder sMsg); 

     private void button4_Click(object sender, EventArgs e) 
     { 
      StringBuilder msg = new StringBuilder(); 
      calculate(msg); 
      MessageBox.Show(msg.ToString()); 
     } 

Peu importe ce que je mets dans msg, le stringbuilder est toujours vide? Pourquoi? Qu'est-ce qui ne va pas? des idées? S'il vous plaît partager

+0

Votre fonction C++ est une fuite de mémoire. – SLaks

+0

Dans votre code C, vous affectez une valeur au pointeur 'msg' lui-même, pas à la mémoire pointée vers. Je ne sais pas comment réparer ce w.r.t. marshalling, mais je jette juste ici parce que deux réponses semblent l'avoir déjà manqué. – Thomas

+0

@SLaks: Ce n'est pas une fuite de mémoire, mais j'avoue qu'il est effrayant d'assigner une chaîne de caractères à un pointeur sur un non-const 'char'. – Thomas

Répondre

2

Vous avez raison que vous devez utiliser pour stringLPCTSTR tampons et StringBuilder pour LPTSTR tampons.

Mais vous avez besoin de 2 changements:

1) Définir la capacité de votre StringBuilder
2) Vous devriez faire strcpy dans ce tampon, changeant quelle adresse de mémoire variable contient ne rien faire que vous avez maintenant. Vous devez changer ce qui se trouve à l'adresse mémoire.

Donc, vous voulez dans votre C/C++ Code:

extern "C" REGISTRATION_API void calculate(LPSTR msg) 
{ 
    //Also consider refactoring this function to take in the buffer length 
    strcpy(msg, "some text"); 
} 

et en C#:

[DllImport("thecpp.dll", CharSet=CharSet.Ansi)] 
static extern void calculate(StringBuilder sMsg); 

private void button4_Click(object sender, EventArgs e) 
{ 
    StringBuilder msg = new StringBuilder(1024); 
    calculate(msg); 
    MessageBox.Show(msg.ToString()); 
} 

Note: Vous devriez vraiment passer la longueur de la mémoire tampon que vous passez pour la fonction de calcul aussi bien.

+0

pouvez-vous s'il vous plaît donnez-moi un exemple – Zee99

+0

@ Zee99: Essayez ce que je vous ai donné ci-dessus. –

+0

Merci, l'a fait. – Zee99

-1

Je suis un peu flou sur la syntaxe, mais je crois que vous voulez quelque chose comme:

[DllImport("thecpp.dll")] static extern void calculate([in, out] StringBuilder sMsg); 
+0

non, j'ai ajouté l'entrée/sortie, toujours pas de réponse du stringbuilder – Zee99

Questions connexes