从C#调用C ++ dll会返回垃圾字符

时间:2014-03-05 02:00:57

标签: c# c++ dll character

我是C ++的新手。

我正在开发一个简单的dll。

我必须使用C#中的C ++函数,文件位置信息应该是字符串。

C ++将一些字符串返回给C#。

这是我的代码..

extern "C" __declspec(dllexport) const char* ParseData(char *filePath)
{
    string _retValue(filePath);

    printf(_retValue.c_str());  //--> this prints ok

    return _retValue.c_str();
}






[DllImport("D:\\Temp\\chelper.dll", CallingConvention = CallingConvention.Cdecl)]
private static extern IntPtr ParseData(string s);


static void Main(string[] args)
{
    string s    = "D:\\Temp\\test.bin";
    string ret  = Marshal.PtrToStringAnsi(ParseData(s));
    Console.WriteLine(ret);
}

当我查看C ++返回的字符串时,它看起来如下所示。

硼硼硼硼硼硼硼硼硼硼硼硼硼硼硼硼硼硼硼硼硼硼硼硼硼硼硼硼硼硼硼硼硼硼硼硼硼硼硼硼硼硼硼硼硼硼硼硼硼硼硼硼

我期待“D:\ Temp \ test.bin”我传递给C ++ dll。

我的代码出了什么问题?

1 个答案:

答案 0 :(得分:0)

您的问题是您正在尝试返回本地变量。你的DLL可以访问那个内存,因为它声明了变量,但C#程序无法访问它,所以它变得垃圾了。了解Windows API如何实现:让调用者传递缓冲区和缓冲区的大小,并将结果存储在那里。像这样(未经测试):

extern "C" __declspec(dllexport) void ParseData(char* filePath, int pathSize)
{
  char workingPath[pathSize + 1]; //leave space for a trailing null

  strncpy(workingPath, filePath, pathSize);

  //do whatever parsing you need to do here

  strncpy(filePath, workingPath, pathSize);
}

或者直接使用传递的filePath缓冲区。但无论你选择这样做,请确保将最终结果写入调用者的缓冲区中,不是局部变量。