c# 调用c++ dll

boytomato 2013-07-22 08:51:06

调用后,内存持续飙升,最后死机, 有没有办法释放一下。
...全文
248 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
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); } 注释掉上面,内存稳定。
全栈极简 2013-07-22
  • 打赏
  • 举报
回复
那要看这个c++的dll是干什么的。

111,094

社区成员

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

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

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