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

+0

В коде C вы присваиваете значение самому указателю 'msg', а не указанию на указанную память. Я не знаю, как исправить это w.r.t. marshalling, но я просто бросаю его сюда, потому что два ответа, похоже, уже пропустили его. – Thomas

+0

@SLaks: Это не утечка памяти, но я признаю, что страшно назначать строковый литерал указателю на не-const 'char'. – Thomas

ответ

2

Вы правы, что вы должны использовать string для LPCTSTR буферов и StringBuilder для LPTSTR буферов.

Но нужно 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

+0

@ Zee99: попробуйте то, что я вам дал. –

+0

Спасибо, сделал. – Zee99

-1

Я немного туманный на синтаксисе, но я верю, что вы хотите что-то вроде:

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

nope, я добавил вход/выход, еще нет ответа от стробоскопа – Zee99

Смежные вопросы