Вызовите метод c ++, который возвращает строку из c # - PullRequest
2 голосов
/ 07 июля 2010

Пожалуйста, помогите,

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

Независимо от того, что я вставил в msg, строитель строк всегда пуст?Зачем?в чем дело?есть идеи?пожалуйста, поделитесь

Ответы [ 2 ]

2 голосов
/ 07 июля 2010

Вы правы, что вы должны использовать 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 голосов
/ 07 июля 2010

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

[DllImport("thecpp.dll")] static extern void calculate([in, out] StringBuilder sMsg);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...