C#如何调用C++ DLL分配的内存

xingxingyear 2010-01-27 05:26:40
dll中new了一个char数组的内存块,内存大小是由dll指定的.
在C#中如何获取这个内存块呢?
不使用string..因为内存块可能有00字符
...全文
219 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
daviszr_1979 2011-05-16
  • 打赏
  • 举报
回复
C DLL 代码

//TCHAR==wchar_t
bool PCInitAlloc(TCHAR*& buf,int len)
{
if(len<=0)
return false;

buf = (TCHAR*)malloc((len+1)*sizeof(TCHAR));
memset(buf,0,(len+1)*sizeof(TCHAR));


return (buf!=NULL?true:false);
}

void PCTest(TCHAR* buf)
{
::OutputDebugStringW(buf);
return;
}


void PCFree(TCHAR* buf)
{
free(buf);
}

C#代码:
private void button1_Click(object sender, EventArgs e)
{
char[] c;

IntPtr buf = new IntPtr();

String s = this.textBox1.Text;
c=new char[s.Length];

if (!PCInitAlloc(ref buf, s.Length))
{
MessageBox.Show("初始化失败");
return;
}

s.CopyTo(0,c,0,s.Length);
Marshal.Copy(c, 0, buf, c.Length);\\C#中的char==C++中的wchar_t,因为C#支持Unicode

PCTest(buf);

PCFree(ref buf);
}
daviszr_1979 2011-05-16
  • 打赏
  • 举报
回复
Marshal.Copy(pByte, bytes, 0,(int)len);
这句话应该可以。
请楼主考虑环境是否支持Unicode
xingxingyear 2010-01-27
  • 打赏
  • 举报
回复
先顶一顶。大家帮帮忙啊
xingxingyear 2010-01-27
  • 打赏
  • 举报
回复
回复flying_net:
我也是这样做的。但是不知为何会抛出AccessViolationException异常:"尝试读取或写入受保护的内存。这通常指示其他内存已损坏。"
xingxingyear 2010-01-27
  • 打赏
  • 举报
回复
int dllApi(char** buf);
dll的函数原型,buf是内存块的指针,int是内存块的大小。
flying_net 2010-01-27
  • 打赏
  • 举报
回复
C++在方法返回这一数组的指针(IntPtr:pByte)和数组的长度(uint:len)
就可以读取这个内存了,

 
bytes = new byte[len];
Marshal.Copy(pByte, bytes, 0,(int)len);[
flying_net 2010-01-27
  • 打赏
  • 举报
回复
C++在方法返回这一数组的指针(IntPtr:pByte)和数组的长度(uint:len)
就可以读取这个内存了,

code=C#]
bytes = new byte[len];
Marshal.Copy(pByte, bytes, 0,(int)len);[
[/code]
wenboliang 2010-01-27
  • 打赏
  • 举报
回复

[DllImport("user32.dll",CharSet=CharSet.Auto,CallingConvention=CallingConvention.StdCall)]
public static extern int SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hInstance, int threadId);
wenbin 2010-01-27
  • 打赏
  • 举报
回复
在C#中可以使用unsafe关键字来完成直接对内存的操作
godlxldog 2010-01-27
  • 打赏
  • 举报
回复
你这块内存是怎么返回到C#中的

110,567

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧