Вы правы, что вы должны использовать 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());
}
Примечание: Вы действительно должны передать длину буфера, который вы передаете, в функцию вычисления.