2010-07-07 66 views
2

请帮帮忙,调用C++方法返回一个字符串,从C#

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

msg = "some text"; 
} 

我的C#电话:

[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()); 
     } 

不管我放味精,StringBuilder的永远是空的?为什么?怎么了?有任何想法吗?请分享

+0

您的C++函数是内存泄漏。 – SLaks 2010-07-07 13:43:50

+0

在你的C代码中,你正在为'msg'指针本身赋值,而不是指向指向的内存。我不知道如何解决这个问题。编组,但我只是把它扔在这里,因为两个答案似乎已经错过了它。 – Thomas 2010-07-07 13:44:48

+0

@SLaks:这不是内存泄漏,但我承认,将字符串文字分配给非const“char”指针是可怕的。 – Thomas 2010-07-07 13:46:34

回答

2

你是正确的,你应该使用stringLPCTSTR缓冲区和StringBuilderLPTSTR缓冲区。

但是,你需要2个变化:

1)在你的StringBuilder
2)你应该做strcpy成设置缓冲区的容量,改变什么内存地址的变量,你必须持有什么都不会做它现在。你需要改变内存地址。

所以,你想在你的C/C++代码:

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

,并在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()); 
} 

注意:您真的应该传递要传递到缓冲区的长度计算函数也是如此。

+0

可以请你给我一个例子 – Zee99 2010-07-07 13:48:13

+0

@ Zee99:试试我给你的上面。 – 2010-07-07 13:49:25

+0

谢谢,做到了。 – Zee99 2010-07-07 14:04:18

-1

我在语法有点朦胧,但我相信你想要的东西,如:

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

nope,我添加了进出,仍然没有回答从字符串生成器 – Zee99 2010-07-07 13:48:36