从 C# 调用 C++ dll 将返回垃圾字符
Calling C++ dll from C# returns junk characters
我是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。
我的代码有什么问题?
您的问题是您正在尝试返回局部变量。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
缓冲区。但是,无论您选择如何执行此操作,请确保将最终结果写入从调用方获得的缓冲区中,而不是局部变量中。
相关文章:
- std::stringstream 返回字符 *
- 使用字符串 c_str() 返回字符*
- 从函数返回字符*
- Flex/Bison从C 中的扫描仪返回字符令牌
- 为什么getServicedisplaynamew()和getServicedisplaynamea()返回字符中不同所
- std::string::d ata() 不会返回字符*
- 在 c++ 中返回'/n'字符
- C 如何编写返回字符指针的功能
- 从函数返回字符*不起作用
- 为什么我的函数在应该返回字符时返回垃圾
- C++ Wrting 一个函数,该函数从名为 line_of_input 的字符串中返回字符"a"、"e"、"i"的出现次数
- 删除返回字符*的位置
- 通过赋值运算符返回字符数组
- 字符到 ASCII 代码转换并返回字符
- 尝试返回字符数组
- Arduino,返回字符数组的函数
- C++返回字符指针并打印
- 使用 std::cin >>时可以丢弃返回字符吗?
- 如何从课堂上返回字符*
- 如何使用模板返回字符值