c# 调用c++ dll

boytomato 2013-07-22 08:51:06

调用后,内存持续飙升,最后死机, 有没有办法释放一下。
...全文
219 15 打赏 收藏 举报
写回复
15 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
boytomato 2013-07-24


	UpdateData();

	CDC memDC,*pDC;
	HDC hDisplayDC;
	hDisplayDC = ::GetDC(NULL);
	pDC = pDC->FromHandle(hDisplayDC);
	
	CBitmap  newBitmap,*oldpBitmap;
	memDC.CreateCompatibleDC(pDC);
	newBitmap.CreateCompatibleBitmap(pDC,m_iScreenWidth,m_iScreenHeight);
	oldpBitmap = memDC.SelectObject(&newBitmap);
	memDC.BitBlt(0,0,
				 m_iScreenWidth,m_iScreenHeight,
				 pDC,
				 m_iX,m_iY,SRCCOPY);

	memDC.SelectObject(oldpBitmap);
	memDC.DeleteDC();
	ReleaseDC(pDC);

	//CBitmap bitmap;
	//bitmap.LoadBitmap(IDB_BITMAP3);
	if(FALSE == User_RealtimeSendData(m_iCardNum,m_iScreenX,m_iScreenY,m_iScreenWidth,m_iScreenHeight,(HBITMAP)newBitmap.m_hObject))
	//if(FALSE == User_RealtimeSendData(m_iCardNum,m_iScreenX,m_iScreenY,m_iScreenWidth,m_iScreenHeight,(HBITMAP)bitmap.m_hObject))
	{
		MessageBox("发送实时数据失败!");
	}

	newBitmap.DeleteObject();

c++ 代码
  • 打赏
  • 举报
回复
boytomato 2013-07-24
User_RealtimeSendData(g_iCardNum, 0, 0, 768, 480, bmp1.GetHbitmap()); 去掉这行代码,一切ok ,程序运行稳定。
  • 打赏
  • 举报
回复
boytomato 2013-07-24
引用 8 楼 gomoku 的回复:
可能是GDI资源泄露了(象HBITMAP,HPEN等都要用DeleteObject来清场)。 试试:
IntPtr hBitmap = bmp1.GetHbitmap();
User_RealtimeSendData(g_iCardNum, 0, 0, 768, 480, hBitmap); 
DeleteObject(hBitmap);   // <-- PInvoke here
详见:http://msdn.microsoft.com/zh-cn/library/windows/desktop/dd183539%28v=vs.85%29.aspx
[DllImport("gdi32.dll")] protected static extern bool DeleteObject(IntPtr hObject); if (User_RealtimeConnect(g_iCardNum) == true) { User_RealtimeSendData(g_iCardNum, 0, 0, 768, 480, bmp1.GetHbitmap()); User_RealtimeDisConnect(g_iCardNum); } DeleteObject(gr1.GetHdc()); DeleteObject(bmp1.GetHbitmap()); 仍然如此啊。
  • 打赏
  • 举报
回复
Dobzhansky 2013-07-23
这种厂家没有考虑好, 这种厂家很多.
  • 打赏
  • 举报
回复
gomoku 2013-07-23
可能是GDI资源泄露了(象HBITMAP,HPEN等都要用DeleteObject来清场)。 试试:
IntPtr hBitmap = bmp1.GetHbitmap();
User_RealtimeSendData(g_iCardNum, 0, 0, 768, 480, hBitmap); 
DeleteObject(hBitmap);   // <-- PInvoke here
详见:http://msdn.microsoft.com/zh-cn/library/windows/desktop/dd183539%28v=vs.85%29.aspx
  • 打赏
  • 举报
回复
FTD_2009 2013-07-23
看看你调用的C++什么类了
  • 打赏
  • 举报
回复
class HelloFriend{
System.out.println("你好,朋友!");
}
  • 打赏
  • 举报
回复
cheng2005 2013-07-23
要么用法不对,要么C++那部分有问题。 如果你信任自己就去问厂家 如果你信任厂家就从自己的代码入手,参照示例来找问题,看看是不是哪里用的不对。
  • 打赏
  • 举报
回复
hudsonhuang 2013-07-23
引用 2 楼 boytomato 的回复:
往led 大屏发送数据, if (User_RealtimeConnect(g_iCardNum) == true) { User_RealtimeSendData(g_iCardNum, 0, 0, 768, 480, bmp1.GetHbitmap()); User_RealtimeDisConnect(g_iCardNum); } 注释掉上面,内存稳定。
厂家有可能提供清理的函数的 看看他们的文档?
  • 打赏
  • 举报
回复
相思梦 2013-07-23
LZ 你调用哪个C++的DLL 是干什么用的.... 死循环还是卡线程
  • 打赏
  • 举报
回复
相思梦 2013-07-23

using System.Runtime.InteropServices; // 

[DllImport("wininet.dll", EntryPoint = "InternetCheckConnectionA")]
private extern static bool InternetCheckConnectionA(string lpszUrl, int dwFlags, int dwReserved);
// 导入DLL动态库 wininet.dll 中的 InternetCheckConnectionA 函数

void main()
{
    InternetCheckConnectionA(string ,int ,int );
}
Csharp 大概的API外部函数声明就是这样....
  • 打赏
  • 举报
回复
boytomato 2013-07-22
dll 是厂家提供的,没办法处理啊。
  • 打赏
  • 举报
回复
devmiao 2013-07-22
C++代码中存在内存泄漏,用boundcheck检查下。
  • 打赏
  • 举报
回复
boytomato 2013-07-22
往led 大屏发送数据, if (User_RealtimeConnect(g_iCardNum) == true) { User_RealtimeSendData(g_iCardNum, 0, 0, 768, 480, bmp1.GetHbitmap()); User_RealtimeDisConnect(g_iCardNum); } 注释掉上面,内存稳定。
  • 打赏
  • 举报
回复
guwei4037 2013-07-22
那要看这个c++的dll是干什么的。
  • 打赏
  • 举报
回复
相关推荐
发帖
C#
加入

10.7w+

社区成员

.NET技术 C#
申请成为版主
帖子事件
创建了帖子
2013-07-22 08:51
社区公告

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