【问题标题】:Call a c++ method that returns a string, from c#从 c# 调用返回字符串的 c++ 方法
【发布时间】:2011-03-12 20:03:59
【问题描述】:

请帮忙,

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 中输入什么,stringbuilder 总是为空?为什么?怎么了?有任何想法吗?请分享

【问题讨论】:

  • 您的 C++ 函数存在内存泄漏。
  • 在您的 C 代码中,您将值分配给 msg 指针本身,而不是指向的内存。我不知道如何解决这个问题。编组,但我只是把它扔在这里,因为两个答案似乎已经错过了。
  • @SLaks:这不是内存泄漏,但我承认将字符串文字分配给指向非 const char 的指针是很可怕的。
  • 那么,有什么建议呢?如何解决这个问题?谢谢
  • @SLaks:这不是内存泄漏(仅当您使用 new、malloc 或类似函数时),但 C# 缓冲区将保持不变。他需要更改传入的内存地址中包含的内容,将他的局部变量更改为不同的内存地址不会有任何影响。

标签: c# c++ string


【解决方案1】:

我对语法有点模糊,但我相信你想要这样的东西:

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

【讨论】:

  • 不,我添加了输入/输出,仍然没有来自 stringbuilder 的回答
【解决方案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());
}

注意:您确实应该将要传递给计算函数的缓冲区的长度也传递给该函数。

【讨论】:

  • 你能举个例子吗
  • @Zee99:试试我上面给你的。
  • StringBuilder 构造函数调用错误。那应该是 666。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-20
  • 1970-01-01
  • 2011-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多