2010-07-07 89 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