【发布时间】:2013-12-10 18:16:36
【问题描述】:
我尝试了多种方法将字符串转换为 Char*,但在将 DLL 导入 C# 项目时总是出现 2 个错误。 我的 C++ DLL 的主要功能是这样的:
//Example
extern "C" __declspec (dllexport) void Conv(std::string str)
{
FFileList file_list;
char temp_path[1024];
sprintf(temp_path,"%s*",arg_path);
GetFindFileListWin(temp_path,".mrs",file_list);
}
所以,我需要将“str”转换为 char*,因为GetFindFileListWin 是这样的:
GetFindFileListWin(char* path,char* ext,FFileList& pList);
并将其传递给arg_path。
我尝试过这样做:
char* arg_path = new char[str.length()+1];
strcpy(arg_path, str.c_str());
sprintf(temp_path,"%s*",arg_path);
delete[] arg_path;
但是当我在我的 C# 程序中运行 Conv() 时,它说 Windows 在 Program.exe 中触发了一个断点。 这可能是由于堆损坏,这表明 Program.exe 或其已加载的任何 DLL 中存在错误。(如果我使用 _strdup 也会发生同样的情况)。 所以,我尝试了其他方式:
std::vector<char> Chr(str.size() + 1);
std::copy(str.begin(), str.end(), Chr.begin());
char *arg_path = &Chr[0];
sprintf(temp_path,"%s*",arg_path);
我收到试图读取或写入受保护的内存消息
我的 C# 程序这样做:
[DllImport("Mrs.dll")]
public static extern void Conv(string str);
public void Convert(TextBox Tx)
{
Conv(Tx.Text);
}
希望有人能帮我解决这个错误, 提前致谢。
【问题讨论】:
-
看看这个:
std::string::c_str() -
声明你的 c 函数,比如 void Conv(const char* str) 并使用它
-
不要在 dll api 中使用 stl 容器(不同的编译器为此创建不同的二进制文件)。我什至不认为您可以将 extern "C" 用于接受 std::string 的方法,因为 string 不再是 "C"。不要期望 C# 能够在没有任何编组的情况下将 .net 字符串传递给 Conv(const char*)。最后但同样重要的是,.net 肯定有更好的工具,你可以重写你的 GetFindFileListWin 方法。
标签: c# c++ c memory-management memory-leaks