﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-好好学习，天天向上-文章分类-C++</title><link>http://www.cppblog.com/lzyuan1006/category/20532.html</link><description>在这个神马都是浮云的年代，我背着理想，带上坚持上路了...</description><language>zh-cn</language><lastBuildDate>Sat, 25 May 2013 21:20:44 GMT</lastBuildDate><pubDate>Sat, 25 May 2013 21:20:44 GMT</pubDate><ttl>60</ttl><item><title>DLL中使用CImage关闭调用程序后会卡死的问题另类解决办法</title><link>http://www.cppblog.com/lzyuan1006/articles/200591.html</link><dc:creator>尘末</dc:creator><author>尘末</author><pubDate>Sat, 25 May 2013 12:58:00 GMT</pubDate><guid>http://www.cppblog.com/lzyuan1006/articles/200591.html</guid><wfw:comment>http://www.cppblog.com/lzyuan1006/comments/200591.html</wfw:comment><comments>http://www.cppblog.com/lzyuan1006/articles/200591.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/lzyuan1006/comments/commentRss/200591.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lzyuan1006/services/trackbacks/200591.html</trackback:ping><description><![CDATA[最近在弄一个全仿QQ截屏的控件，封装成DLL，因为里面要用到PNG图片，所以使用了CImage，间接的说就是使用了GDI+, 就在快做完的时候，输出了DLL,采用显示调用DLL的方式，结果发现退出的时候调用DLL的整个进程都卡死了，于是找了MS官方：<a href="http://support.microsoft.com/kb/322909/zh-cn">http://support.microsoft.com/kb/322909/zh-cn</a>，想了半天，这个问题很久了，怎么我用VS2008都不行呢？实在想不出别的办法。被困扰了好久，终于找到一个比较间接解决的办法。<br />首先用VC6建一个MFC工程，修改为输出DLL，然后再用VS2008打开，转成VS2008的工程，结果发现没有问题了，居然正常了。<br />贴上DLL中的代码：<br /><div style="font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all; background-color: #eeeeee; "><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">extern</span>&nbsp;"C"<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">开始截屏，保存时会弹出窗口选择路径，&nbsp;截屏成功返回true,&nbsp;失败返回false</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;_declspec(dllexport)&nbsp;<span style="color: #0000FF; ">bool</span>&nbsp;StartCapture(<span style="color: #0000FF; ">void</span>)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AFX_MANAGE_STATE(AfxGetStaticModuleState());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CCatchScreenDlg&nbsp;dlg;;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dlg.SetSaveFilePath(&nbsp;"",&nbsp;1&nbsp;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dlg.DoModal();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(&nbsp;dlg.GetResult()&nbsp;)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">true</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">else</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">false</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">开始截屏，并指定保存目录和文件类型,&nbsp;截屏成功返回true,&nbsp;失败返回false</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;_declspec(dllexport)&nbsp;<span style="color: #0000FF; ">bool</span>&nbsp;CaptureSaveToFile(&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">char</span>*&nbsp;path,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;img_type&nbsp;)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CCatchScreenDlg&nbsp;dlg;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CString&nbsp;str;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str.Format(&nbsp;"%s",&nbsp;path&nbsp;);&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dlg.SetSaveFilePath(&nbsp;str,&nbsp;img_type&nbsp;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dlg.DoModal();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(&nbsp;dlg.GetResult()&nbsp;)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">true</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">else</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">false</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;<br />}<br />&nbsp;<br />DLL调用代码：<br /><br /><div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all; "><span style="color: #008000; ">&nbsp; &nbsp; //注意，声望要与DLL中的一样。这里就不需要加 __stdcall* 了。<br /></span>&nbsp;&nbsp;&nbsp;&nbsp;typedef&nbsp;<span style="color: #0000FF; ">bool</span>&nbsp;(&nbsp;*&nbsp;_CaptureStart&nbsp;)&nbsp;(&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">char</span>*&nbsp;path,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;img_type&nbsp;);<br />&nbsp;&nbsp;&nbsp;&nbsp;HINSTANCE&nbsp;hIns;<br />&nbsp;&nbsp;&nbsp;&nbsp;hIns&nbsp;=&nbsp;::LoadLibrary&nbsp;(&nbsp;"IScreenCapture.dll"&nbsp;);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(&nbsp;NULL&nbsp;==&nbsp;hIns&nbsp;)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AfxMessageBox(&nbsp;"hIns&nbsp;NULL"&nbsp;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;_CaptureStart&nbsp;dllCall&nbsp;=&nbsp;(_CaptureStart)GetProcAddress(&nbsp;hIns,&nbsp;"CaptureSaveToFile"&nbsp;);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(&nbsp;NULL&nbsp;!=&nbsp;dllCall&nbsp;)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(&nbsp;(*dllCall)("c:\\ttt.bmp",1)&nbsp;)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MessageBox("截图成功！");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">else</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MessageBox("截图失败！");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br /><br /><br />另，附上加载CImage从资源中加载的方法：<br /><br /><div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all; "><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><br /><span style="color: #0000FF; ">bool</span>&nbsp;CCatchScreenDlg::LoadPngForRes(&nbsp;CImage*&nbsp;pCImg,&nbsp;UINT&nbsp;nResID&nbsp;)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(&nbsp;pCImg&nbsp;==NULL)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">false</span>;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;pCImg-&gt;Destroy();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;查找资源</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;HRSRC&nbsp;hRsrc&nbsp;=::FindResource(AfxGetResourceHandle(),&nbsp;MAKEINTRESOURCE(nResID),&nbsp;"png");<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(hRsrc&nbsp;==&nbsp;NULL)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">false</span>;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;加载资源</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;HGLOBAL&nbsp;hImgData&nbsp;=::LoadResource(AfxGetResourceHandle(),&nbsp;hRsrc);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(hImgData&nbsp;==&nbsp;NULL)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::FreeResource(hImgData);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">false</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;锁定内存中的指定资源</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;LPVOID&nbsp;lpVoid&nbsp;=::LockResource(hImgData);&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;LPSTREAM&nbsp;pStream&nbsp;=&nbsp;NULL;<br />&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;dwSize&nbsp;=&nbsp;::SizeofResource(AfxGetResourceHandle(),&nbsp;hRsrc);<br />&nbsp;&nbsp;&nbsp;&nbsp;HGLOBAL&nbsp;hNew&nbsp;=&nbsp;::GlobalAlloc(GHND,&nbsp;dwSize);<br />&nbsp;&nbsp;&nbsp;&nbsp;LPBYTE&nbsp;lpByte&nbsp;=&nbsp;(LPBYTE)::GlobalLock(hNew);<br />&nbsp;&nbsp;&nbsp;&nbsp;::memcpy(lpByte,&nbsp;lpVoid,&nbsp;dwSize);&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;解除内存中的指定资源</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;::GlobalUnlock(hNew);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;从指定内存创建流对象</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;HRESULT&nbsp;ht&nbsp;=::CreateStreamOnHGlobal(hNew,TRUE,&amp;pStream);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(&nbsp;ht&nbsp;!=&nbsp;S_OK&nbsp;)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GlobalFree(hNew);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">else</span><br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;加载图片</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pCImg-&gt;Load(pStream);&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GlobalFree(hNew);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;释放资源</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;::FreeResource(hImgData);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">true</span>;<br />}</div></div></div><img src ="http://www.cppblog.com/lzyuan1006/aggbug/200591.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lzyuan1006/" target="_blank">尘末</a> 2013-05-25 20:58 <a href="http://www.cppblog.com/lzyuan1006/articles/200591.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>二分法与Map速度测试</title><link>http://www.cppblog.com/lzyuan1006/articles/193679.html</link><dc:creator>尘末</dc:creator><author>尘末</author><pubDate>Mon, 22 Oct 2012 11:58:00 GMT</pubDate><guid>http://www.cppblog.com/lzyuan1006/articles/193679.html</guid><wfw:comment>http://www.cppblog.com/lzyuan1006/comments/193679.html</wfw:comment><comments>http://www.cppblog.com/lzyuan1006/articles/193679.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/lzyuan1006/comments/commentRss/193679.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lzyuan1006/services/trackbacks/193679.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 最开始我不太了解map的实现机制，就做了一个这样的比较，结果发现自己写的二分法实际上还要快一些，下面贴代码： Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->&nbsp;&nbsp;1//******************************...&nbsp;&nbsp;<a href='http://www.cppblog.com/lzyuan1006/articles/193679.html'>阅读全文</a><img src ="http://www.cppblog.com/lzyuan1006/aggbug/193679.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lzyuan1006/" target="_blank">尘末</a> 2012-10-22 19:58 <a href="http://www.cppblog.com/lzyuan1006/articles/193679.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>