﻿<?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++博客-小虎的欢乐岛-随笔分类-DLL</title><link>http://www.cppblog.com/wz19860913/category/10664.html</link><description>那片土在蓝天上</description><language>zh-cn</language><lastBuildDate>Mon, 26 Apr 2010 16:03:33 GMT</lastBuildDate><pubDate>Mon, 26 Apr 2010 16:03:33 GMT</pubDate><ttl>60</ttl><item><title>Hook导入表 —— 实现挂钩FreeLibaray和HOOK延迟加载模块的API</title><link>http://www.cppblog.com/wz19860913/archive/2009/08/14/93302.html</link><dc:creator>小虎无忧</dc:creator><author>小虎无忧</author><pubDate>Fri, 14 Aug 2009 05:36:00 GMT</pubDate><guid>http://www.cppblog.com/wz19860913/archive/2009/08/14/93302.html</guid><wfw:comment>http://www.cppblog.com/wz19860913/comments/93302.html</wfw:comment><comments>http://www.cppblog.com/wz19860913/archive/2009/08/14/93302.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/wz19860913/comments/commentRss/93302.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wz19860913/services/trackbacks/93302.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Windows上Ring3的HOOK导入表所用的类大同小异，本文改进了一个HOOK导入表的类，实现了HOOK延迟加载模块的API和FreeLibaray的HOOK的实现。欢迎大家批评指正！&nbsp;&nbsp;<a href='http://www.cppblog.com/wz19860913/archive/2009/08/14/93302.html'>阅读全文</a><img src ="http://www.cppblog.com/wz19860913/aggbug/93302.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wz19860913/" target="_blank">小虎无忧</a> 2009-08-14 13:36 <a href="http://www.cppblog.com/wz19860913/archive/2009/08/14/93302.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>《Windows via C/C++》中示例程序DIPS的问题</title><link>http://www.cppblog.com/wz19860913/archive/2009/06/13/87573.html</link><dc:creator>小虎无忧</dc:creator><author>小虎无忧</author><pubDate>Sat, 13 Jun 2009 05:37:00 GMT</pubDate><guid>http://www.cppblog.com/wz19860913/archive/2009/06/13/87573.html</guid><wfw:comment>http://www.cppblog.com/wz19860913/comments/87573.html</wfw:comment><comments>http://www.cppblog.com/wz19860913/archive/2009/06/13/87573.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/wz19860913/comments/commentRss/87573.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wz19860913/services/trackbacks/87573.html</trackback:ping><description><![CDATA[　　前一阶段重温了Windows中的HOOK，由此参考了《Windows via C/C++》中的示例程序——DIPS，但是我发现了一个有趣的问题。<br>　　默认情况下，链接器并不会将支持XP或Vista的manifest链接到程序上，因此，生成的应用程序运行时的控件风格是经典Windows样式，此时，DIPS小工具运行正常。<br>　　但是，当加上如下这段代码（适用于x86 CPU），问题就产生了。<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">#pragma&nbsp;comment(linker,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">/manifestdependency:\</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">type</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">win32</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">&nbsp;name</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">Microsoft.Windows.Common-Controls</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">&nbsp;version</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">6.0.0.0</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">&nbsp;processorArchitecture</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">x86</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">&nbsp;publicKeyToken</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">6595b64144ccf1df</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">&nbsp;language</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">\</span><span style="COLOR: #000000">""</span><span style="COLOR: #000000">)</span></div>
　　这意味着链接器将会把新的XP或Vista的manifest链接到程序上，使应用程序具有XP或Vista的控件样式。这时，问题产生了。<br>　　这里我贴出程序的主函数代码：<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img id=Codehighlighter1_75_2285_Open_Image onclick="this.style.display='none'; Codehighlighter1_75_2285_Open_Text.style.display='none'; Codehighlighter1_75_2285_Closed_Image.style.display='inline'; Codehighlighter1_75_2285_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_75_2285_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_75_2285_Closed_Text.style.display='none'; Codehighlighter1_75_2285_Open_Image.style.display='inline'; Codehighlighter1_75_2285_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;WINAPI&nbsp;_tWinMain(HINSTANCE&nbsp;hInstExe,&nbsp;HINSTANCE,&nbsp;PTSTR&nbsp;pszCmdLine,&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">)&nbsp;</span><span id=Codehighlighter1_75_2285_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"></span><span id=Codehighlighter1_75_2285_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Convert&nbsp;command-line&nbsp;character&nbsp;to&nbsp;uppercase.</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;CharUpperBuff(pszCmdLine,&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;TCHAR&nbsp;cWhatToDo&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;pszCmdLine[</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">];<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img id=Codehighlighter1_260_347_Open_Image onclick="this.style.display='none'; Codehighlighter1_260_347_Open_Text.style.display='none'; Codehighlighter1_260_347_Closed_Image.style.display='inline'; Codehighlighter1_260_347_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_260_347_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_260_347_Closed_Text.style.display='none'; Codehighlighter1_260_347_Open_Image.style.display='inline'; Codehighlighter1_260_347_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;((cWhatToDo&nbsp;</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">&nbsp;TEXT(</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">S</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">))&nbsp;</span><span style="COLOR: #000000">&amp;&amp;</span><span style="COLOR: #000000">&nbsp;(cWhatToDo&nbsp;</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">&nbsp;TEXT(</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">R</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">)))&nbsp;</span><span id=Codehighlighter1_260_347_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"></span><span id=Codehighlighter1_260_347_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;An&nbsp;invalid&nbsp;command-line&nbsp;argument;&nbsp;prompt&nbsp;the&nbsp;user.</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cWhatToDo&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img id=Codehighlighter1_373_750_Open_Image onclick="this.style.display='none'; Codehighlighter1_373_750_Open_Text.style.display='none'; Codehighlighter1_373_750_Closed_Image.style.display='inline'; Codehighlighter1_373_750_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_373_750_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_373_750_Closed_Text.style.display='none'; Codehighlighter1_373_750_Open_Image.style.display='inline'; Codehighlighter1_373_750_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(cWhatToDo&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">)&nbsp;</span><span id=Codehighlighter1_373_750_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"></span><span id=Codehighlighter1_373_750_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;No&nbsp;command-line&nbsp;argument&nbsp;was&nbsp;used&nbsp;to&nbsp;tell&nbsp;us&nbsp;what&nbsp;to<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;do;&nbsp;show&nbsp;usage&nbsp;dialog&nbsp;box&nbsp;and&nbsp;prompt&nbsp;the&nbsp;user.</span><span style="COLOR: #008000"><br><img id=Codehighlighter1_571_745_Open_Image onclick="this.style.display='none'; Codehighlighter1_571_745_Open_Text.style.display='none'; Codehighlighter1_571_745_Closed_Image.style.display='inline'; Codehighlighter1_571_745_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_571_745_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_571_745_Closed_Text.style.display='none'; Codehighlighter1_571_745_Open_Image.style.display='inline'; Codehighlighter1_571_745_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">switch</span><span style="COLOR: #000000">&nbsp;(DialogBox(hInstExe,&nbsp;MAKEINTRESOURCE(IDD_DIPS),&nbsp;NULL,&nbsp;Dlg_Proc))&nbsp;</span><span id=Codehighlighter1_571_745_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"></span><span id=Codehighlighter1_571_745_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">case</span><span style="COLOR: #000000">&nbsp;IDC_SAVE:&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cWhatToDo&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;TEXT(</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">S</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">);&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">break</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">case</span><span style="COLOR: #000000">&nbsp;IDC_RESTORE:&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cWhatToDo&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;TEXT(</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">R</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">break</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img id=Codehighlighter1_776_845_Open_Image onclick="this.style.display='none'; Codehighlighter1_776_845_Open_Text.style.display='none'; Codehighlighter1_776_845_Closed_Image.style.display='inline'; Codehighlighter1_776_845_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_776_845_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_776_845_Closed_Text.style.display='none'; Codehighlighter1_776_845_Open_Image.style.display='inline'; Codehighlighter1_776_845_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(cWhatToDo&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">)&nbsp;</span><span id=Codehighlighter1_776_845_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"></span><span id=Codehighlighter1_776_845_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;The&nbsp;user&nbsp;doesn't&nbsp;want&nbsp;to&nbsp;do&nbsp;anything.</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;The&nbsp;Desktop&nbsp;ListView&nbsp;window&nbsp;is&nbsp;the&nbsp;grandchild&nbsp;of&nbsp;the&nbsp;ProgMan&nbsp;window.</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;HWND&nbsp;hWndLV&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;GetFirstChild(GetFirstChild(<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FindWindow(TEXT(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">ProgMan</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">),&nbsp;NULL)));<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;chASSERT(IsWindow(hWndLV));<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Set&nbsp;hook&nbsp;that&nbsp;injects&nbsp;our&nbsp;DLL&nbsp;into&nbsp;the&nbsp;Explorer's&nbsp;address&nbsp;space.&nbsp;After&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;setting&nbsp;the&nbsp;hook,&nbsp;the&nbsp;DIPS&nbsp;hidden&nbsp;modeless&nbsp;dialog&nbsp;box&nbsp;is&nbsp;created.&nbsp;We&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;send&nbsp;messages&nbsp;to&nbsp;this&nbsp;window&nbsp;to&nbsp;tell&nbsp;it&nbsp;what&nbsp;we&nbsp;want&nbsp;it&nbsp;to&nbsp;do.</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;chVERIFY(SetDIPSHook(GetWindowThreadProcessId(hWndLV,&nbsp;NULL)));<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Wait&nbsp;for&nbsp;the&nbsp;DIPS&nbsp;server&nbsp;window&nbsp;to&nbsp;be&nbsp;created.</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;MSG&nbsp;msg;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;GetMessage(</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">msg,&nbsp;NULL,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: red">// 请注意这里</span><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Find&nbsp;the&nbsp;handle&nbsp;of&nbsp;the&nbsp;hidden&nbsp;dialog&nbsp;box&nbsp;window.</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;HWND&nbsp;hWndDIPS&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;FindWindow(NULL,&nbsp;TEXT(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Wintellect&nbsp;DIPS</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">));<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Make&nbsp;sure&nbsp;that&nbsp;the&nbsp;window&nbsp;was&nbsp;created.</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;chASSERT(IsWindow(hWndDIPS));<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Tell&nbsp;the&nbsp;DIPS&nbsp;window&nbsp;which&nbsp;ListView&nbsp;window&nbsp;to&nbsp;manipulate<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;and&nbsp;whether&nbsp;the&nbsp;items&nbsp;should&nbsp;be&nbsp;saved&nbsp;or&nbsp;restored.</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;BOOL&nbsp;bSave&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(cWhatToDo&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;TEXT(</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">S</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">));<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;SendMessage(hWndDIPS,&nbsp;WM_APP,&nbsp;(WPARAM)&nbsp;hWndLV,&nbsp;bSave);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Tell&nbsp;the&nbsp;DIPS&nbsp;window&nbsp;to&nbsp;destroy&nbsp;itself.&nbsp;Use&nbsp;SendMessage&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;instead&nbsp;of&nbsp;PostMessage&nbsp;so&nbsp;that&nbsp;we&nbsp;know&nbsp;the&nbsp;window&nbsp;is&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;destroyed&nbsp;before&nbsp;the&nbsp;hook&nbsp;is&nbsp;removed.</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;SendMessage(hWndDIPS,&nbsp;WM_CLOSE,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Make&nbsp;sure&nbsp;that&nbsp;the&nbsp;window&nbsp;was&nbsp;destroyed.</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;chASSERT(</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000">IsWindow(hWndDIPS));<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Unhook&nbsp;the&nbsp;DLL,&nbsp;removing&nbsp;the&nbsp;DIPS&nbsp;dialog&nbsp;box&nbsp;procedure&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;from&nbsp;the&nbsp;Explorer's&nbsp;address&nbsp;space.</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;SetDIPSHook(</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">);&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span></div>
<br>　　看到上面代码中的GetMessage函数（加红色注释那行），该函数是在接收一个来自explorer.exe进程的消息，这个消息是在挂钩DLL注入之后，由挂钩过滤函数发送的。挂钩过滤函数代码如下：<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img id=Codehighlighter1_67_697_Open_Image onclick="this.style.display='none'; Codehighlighter1_67_697_Open_Text.style.display='none'; Codehighlighter1_67_697_Closed_Image.style.display='inline'; Codehighlighter1_67_697_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_67_697_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_67_697_Closed_Text.style.display='none'; Codehighlighter1_67_697_Open_Image.style.display='inline'; Codehighlighter1_67_697_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top><span style="COLOR: #000000">LRESULT&nbsp;WINAPI&nbsp;GetMsgProc(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;nCode,&nbsp;WPARAM&nbsp;wParam,&nbsp;LPARAM&nbsp;lParam)&nbsp;</span><span id=Codehighlighter1_67_697_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"></span><span id=Codehighlighter1_67_697_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000">&nbsp;BOOL&nbsp;bFirstTime&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;TRUE;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img id=Codehighlighter1_124_635_Open_Image onclick="this.style.display='none'; Codehighlighter1_124_635_Open_Text.style.display='none'; Codehighlighter1_124_635_Closed_Image.style.display='inline'; Codehighlighter1_124_635_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_124_635_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_124_635_Closed_Text.style.display='none'; Codehighlighter1_124_635_Open_Image.style.display='inline'; Codehighlighter1_124_635_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(bFirstTime)&nbsp;</span><span id=Codehighlighter1_124_635_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"></span><span id=Codehighlighter1_124_635_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;The&nbsp;DLL&nbsp;just&nbsp;got&nbsp;injected.</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bFirstTime&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;FALSE;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Uncomment&nbsp;the&nbsp;line&nbsp;below&nbsp;to&nbsp;invoke&nbsp;the&nbsp;debugger&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;on&nbsp;the&nbsp;process&nbsp;that&nbsp;just&nbsp;got&nbsp;the&nbsp;injected&nbsp;DLL.<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;ForceDebugBreak();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Create&nbsp;the&nbsp;DIPS&nbsp;Server&nbsp;window&nbsp;to&nbsp;handle&nbsp;the&nbsp;client&nbsp;request.</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CreateDialog(g_hInstDll,&nbsp;MAKEINTRESOURCE(IDD_DIPS),&nbsp;NULL,&nbsp;Dlg_Proc);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Tell&nbsp;the&nbsp;DIPS&nbsp;application&nbsp;that&nbsp;the&nbsp;server&nbsp;is&nbsp;up&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;and&nbsp;ready&nbsp;to&nbsp;handle&nbsp;requests.</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PostThreadMessage(g_dwThreadIdDIPS,&nbsp;WM_NULL,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">(CallNextHookEx(g_hHook,&nbsp;nCode,&nbsp;wParam,&nbsp;lParam));<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span></div>
<br>　　明显地，这里发送了一个WM_NULL消息给DIPS进程，当使用经典样式的控件时一切安好，经调试得到的MSG结构中的各个字段为正确的值。但是加上了上面那行链接命令后，调试得到的MSG结构的字段压根就不是WM_NULL、0、0，而是一个数值为49211的消息，这样导致了DIPS主线程唤醒，随后的FindWindow可能会返回一个NULL，因为该消息并不是挂钩过滤函数的发送的消息。当然，如果在这里Sleep一下，可以得到正确的窗口句柄，我在GetMessage函数上加了一个do-while循环，结果也的确是这样，几次循环之后可以收到消息为WM_NULL的消息，且参数均为0。<br>　　但是我不明白为什么加上了一条链接命令会这样？不妨大家都试试看，我用的IDE是VS2005。<br>　　哪位高手可以来指导我一下呢？ 
<img src ="http://www.cppblog.com/wz19860913/aggbug/87573.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wz19860913/" target="_blank">小虎无忧</a> 2009-06-13 13:37 <a href="http://www.cppblog.com/wz19860913/archive/2009/06/13/87573.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于DLL中DllMain的线程死锁问题</title><link>http://www.cppblog.com/wz19860913/archive/2009/05/22/85472.html</link><dc:creator>小虎无忧</dc:creator><author>小虎无忧</author><pubDate>Fri, 22 May 2009 14:22:00 GMT</pubDate><guid>http://www.cppblog.com/wz19860913/archive/2009/05/22/85472.html</guid><wfw:comment>http://www.cppblog.com/wz19860913/comments/85472.html</wfw:comment><comments>http://www.cppblog.com/wz19860913/archive/2009/05/22/85472.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wz19860913/comments/commentRss/85472.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wz19860913/services/trackbacks/85472.html</trackback:ping><description><![CDATA[　　前一阶段闲着无聊，用远程线程注入的方法把DLL注入到Explorer.exe进程实现音乐循环播放。
<p>　　在DLL中的代码是这样的：</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">BOOL&nbsp;WINAPI&nbsp;DllMain(HINSTANCE&nbsp;hInstDll,&nbsp;DWORD&nbsp;fdwReason,&nbsp;PVOID&nbsp;fImpLoad)<br>{<br>&nbsp;&nbsp;&nbsp; </span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000">&nbsp;HANDLE&nbsp;hThread;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000">&nbsp;DWORD&nbsp;dwThreadId;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">switch</span><span style="COLOR: #000000">&nbsp;(fdwReason)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">case</span><span style="COLOR: #000000">&nbsp;DLL_PROCESS_ATTACH:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g_hInstDll&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;hInstDll;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hThread&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;BEGINTHREADEX(NULL,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,&nbsp;ThreadProc,&nbsp;(PVOID)hInstDll,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">dwThreadId);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(hThread&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;NULL)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;FALSE;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">break</span><span style="COLOR: #000000">;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">case</span><span style="COLOR: #000000">&nbsp;DLL_PROCESS_DETACH:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SendMessage(g_hWnd,&nbsp;WM_CLOSE,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WaitForSingleObject(hThread,&nbsp;INFINITE);&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;这里存在死循环</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CloseHandle(hThread);&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;执行不到这里</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">break</span><span style="COLOR: #000000">;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">case</span><span style="COLOR: #000000">&nbsp;DLL_THREAD_ATTACH:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">break</span><span style="COLOR: #000000">;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">case</span><span style="COLOR: #000000">&nbsp;DLL_THREAD_DETACH:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">break</span><span style="COLOR: #000000">;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">default</span><span style="COLOR: #000000">:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">break</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;TRUE;<br>}</span></div>
<br>
<p>　　在DLL_PROCESS_ATTACH的时候创建了一个线程，这个线程中创建了一个隐藏的窗口，并利用MCI实现播放音乐，具体就不贴出了。然后在DLL_PROCESS_DETACH中停止和关闭设备。</p>
<p>　　但是在应用程序中，发现注入时无异常，在需要撤销DLL映射时出现了问题，程序出现了死循环，在等待远程线程执行FreeLibaray完毕时不返回了。</p>
<p>　　注意上面代码中DLL_PROCESS_DETACH的代码，SendMessage用来关闭窗口，窗口会在WM_DESTROY通知下调用PostQuitMessage(0)使得线程的消息循环退出，从而线程退出。但是WaitForSingleObject函数无法返回。</p>
<p>　　后来发现这里存在死循环，因为执行DllMain的线程是序列化的，必须等待一个线程执行完毕之后另一个线程才能执行。在SendMessage后，导致创建的线程即将退出，这时该线程会调用DllMain，并以DLL_THREAD_DETACH作为通知。可是调用SendMessage的线程调用DllMain时却还在等待即将退出的线程结束，DllMain还没有返回，因此存在了死循环。</p>
<p>　　因此，在DllMain中不适合调用WaitForSingleObject等函数来等待线程完毕。</p>
<img src ="http://www.cppblog.com/wz19860913/aggbug/85472.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wz19860913/" target="_blank">小虎无忧</a> 2009-05-22 22:22 <a href="http://www.cppblog.com/wz19860913/archive/2009/05/22/85472.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>