我尝试了很多方法将字符串转换为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);
}
希望有人能帮我解决这个错误, 提前谢谢。
答案 0 :(得分:3)
我怀疑sprintf语句中的星号可能导致问题。 sprintf期望格式字符串中的星号长度参数。
sprintf(temp_path,"%s*",arg_path);
^
答案 1 :(得分:2)
string是c ++ object.So在dll中它不起作用
我应该做的就像上面提到的那样
extern "C" __declspec (dllexport) void Conv(const char* str)
{
//do whatever
}
答案 2 :(得分:0)
如果你的p / invoke签名是
[DllImport("Mrs.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
public static extern void Conv(string str);
那么你的C ++声明就是
extern "C" __declspec(dllexport) void Conv(const char* str);
您根本不需要任何std::string
。
.NET和p / invoke对std::string
一无所知。