c#调用DLL时尝试读取或写入受保护的内存.这通常指示其他内存已损坏.
C++:char*__stdcallunCompressString(char*str){char*s=newchar[strlen(str)+1];strcpy(s,s...
C++:
char* __stdcall unCompressString(char* str)
{
char *s = new char[strlen(str)+1];
strcpy(s,str);
return s;
}
C#:
[DllImport("F:\\调用C的DLL试验\\Debug\\MyZlibDLL.dll")]
public static extern string unCompressString(string str);
//调用
textBox2.Text = unCompressString(textBox1.Text);
求大神解答 展开
char* __stdcall unCompressString(char* str)
{
char *s = new char[strlen(str)+1];
strcpy(s,str);
return s;
}
C#:
[DllImport("F:\\调用C的DLL试验\\Debug\\MyZlibDLL.dll")]
public static extern string unCompressString(string str);
//调用
textBox2.Text = unCompressString(textBox1.Text);
求大神解答 展开
2个回答
展开全部
没做试验,下面是目测发现的问题:
1、new出来的字符串这样返回回去以后就没办法释放了。内存泄漏不可避
2、char*对应的是多字节编码的字符,所以DllImport里面要注明 CharSet=CharSet.ANSI
对于1,你可以通过CoTaskMemAlloc来分配内存,这样在C#这里就会被正确释放了。
这个函数和malloc除了函数名不一样其他都一样。声明在windows.h(更进一步应该是在objbase.h)里面,导入在Ole32.lib里面
1、new出来的字符串这样返回回去以后就没办法释放了。内存泄漏不可避
2、char*对应的是多字节编码的字符,所以DllImport里面要注明 CharSet=CharSet.ANSI
对于1,你可以通过CoTaskMemAlloc来分配内存,这样在C#这里就会被正确释放了。
这个函数和malloc除了函数名不一样其他都一样。声明在windows.h(更进一步应该是在objbase.h)里面,导入在Ole32.lib里面
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询