[英]String to Char* Without memory leaks
我嘗試了多種方法將字符串轉換為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);
}
希望有人能幫助我解決此錯誤,在此先謝謝您。
我懷疑sprintf語句中的星號可能是導致此問題的原因。 sprintf期望格式字符串中星號的長度參數。
sprintf(temp_path,"%s*",arg_path);
^
字符串是c ++對象。因此在dll中將不起作用
正如我上面提到的,您應該做的就是這樣做
extern "C" __declspec (dllexport) void Conv(const char* str)
{
//do whatever
}
如果您的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
一無所知。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.