??xml version="1.0" encoding="utf-8" standalone="yes"?>久久久久亚洲精品天堂,久久精品国内一区二区三区,日韩美女18网站久久精品http://m.shnenglu.com/wz19860913/那片土在蓝天?/description>zh-cnTue, 13 May 2025 00:20:38 GMTTue, 13 May 2025 00:20:38 GMT60[转]利用Winsock模拟HTTP的GEThhttp://m.shnenglu.com/wz19860913/archive/2010/03/01/108644.html虎无忧虎无忧Mon, 01 Mar 2010 02:43:00 GMThttp://m.shnenglu.com/wz19860913/archive/2010/03/01/108644.htmlhttp://m.shnenglu.com/wz19860913/comments/108644.htmlhttp://m.shnenglu.com/wz19860913/archive/2010/03/01/108644.html#Feedback0http://m.shnenglu.com/wz19860913/comments/commentRss/108644.htmlhttp://m.shnenglu.com/wz19860913/services/trackbacks/108644.html阅读全文

虎无忧 2010-03-01 10:43 发表评论
]]>
CRC校验法http://m.shnenglu.com/wz19860913/archive/2009/11/10/100628.html虎无忧虎无忧Tue, 10 Nov 2009 08:06:00 GMThttp://m.shnenglu.com/wz19860913/archive/2009/11/10/100628.htmlhttp://m.shnenglu.com/wz19860913/comments/100628.htmlhttp://m.shnenglu.com/wz19860913/archive/2009/11/10/100628.html#Feedback0http://m.shnenglu.com/wz19860913/comments/commentRss/100628.htmlhttp://m.shnenglu.com/wz19860913/services/trackbacks/100628.html   最q搞一个协议,以实现隐蔽通道Q其中需要用CRC校验法Q由于数据位数比较少Q最后决定用位的CRC校验法?br>  该算法主要就是实C个模二运,基本原理是异或Q移位?br>  模二q算的算法如下(C语言描述Q:

模二q算

  CrcGetCode函数获原始数据和CRC生成多项式,利用模二q算得到新的数据。算法如下:
l数据加上校验码


虎无忧 2009-11-10 16:06 发表评论
]]>
Hook导入?—?实现挂钩FreeLibaray和HOOK延迟加蝲模块的APIhttp://m.shnenglu.com/wz19860913/archive/2009/08/14/93302.html虎无忧虎无忧Fri, 14 Aug 2009 05:36:00 GMThttp://m.shnenglu.com/wz19860913/archive/2009/08/14/93302.htmlhttp://m.shnenglu.com/wz19860913/comments/93302.htmlhttp://m.shnenglu.com/wz19860913/archive/2009/08/14/93302.html#Feedback2http://m.shnenglu.com/wz19860913/comments/commentRss/93302.htmlhttp://m.shnenglu.com/wz19860913/services/trackbacks/93302.html阅读全文

虎无忧 2009-08-14 13:36 发表评论
]]>
[转]自己写程序连接视频ƈ可截取视频画?/title><link>http://m.shnenglu.com/wz19860913/archive/2009/07/23/90905.html</link><dc:creator>虎无忧</dc:creator><author>虎无忧</author><pubDate>Thu, 23 Jul 2009 03:26:00 GMT</pubDate><guid>http://m.shnenglu.com/wz19860913/archive/2009/07/23/90905.html</guid><wfw:comment>http://m.shnenglu.com/wz19860913/comments/90905.html</wfw:comment><comments>http://m.shnenglu.com/wz19860913/archive/2009/07/23/90905.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.shnenglu.com/wz19860913/comments/commentRss/90905.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/wz19860913/services/trackbacks/90905.html</trackback:ping><description><![CDATA[<p>转蝲自:<a >http://www.winu.cn/space-14160-do-blog-id-8104.html</a><br><br>  在许多关于视频的软g(如视频会议、可视电话等)开发中Q都应用了视频捕h术。微软ؓ软g开发h员提供了一个专门用于视频捕LVFW (Video for Windows) SDK。VFW SDK为在Windowspȝ中实现视频捕h供了标准的接口,从而大大降低了E序的开发难度。由于VFW SDK只有VC和VB版,没有Delphi版,因此需要在Delphi中一一声明DLL中的各个函数和变量(可以参考MSDN中的VC的函数声明以及变量定义)。本文分3部分介绍如何利用VFW在Delphi中开发视频捕L序?<br><br>VFW?<br>  VFW是微软公?992q推出的关于数字视频的一个Y件包Q它能应用E序通过数字化设备从传统的模拟视频源得到数字化的视频剪辑。VFW的一个关键思想是播放时不需要专用硬ӞZ解决数字视频数据量大的问题,需要对数据q行压羃。它引进了一U叫AVI的文件标准,该标准未规定如何对视频进行捕莗压~及播放Q仅规定视频和音频该如何存储在硬盘上Q以及在AVI文g中交替存储视频和与之相匚w的音频数据。VFW使程序员能通过发送消息或讄属性来捕获、播攑֒~辑视频剪辑。在Windows 9xpȝ?当用户在安装VFWӞ安装E序会自动地安装配置视频所需要的lgQ如讑֤驱动E序、视频压~程序等?<br>VFW主要׃?个模块组成: <br>●AVICAP.DLLQ包含执行视频捕L函数Q它lAVI文g的I/O处理和视频、音频设备驱动程序提供一个高U接口; <br>●MSVIDEO.DLLQ包含一套特D的DrawDib函数Q用来处理屏q上的视频操作; <br>●MCIAVI.DRVQ包括对VFW的MCI命o解释器的驱动E序Q?<br>●AVIFILE.DLLQ包含由标准多媒体I/OQmmioQ函数提供的更高的命令,用来讉K.AVI文gQ?<br>●压~管理器QICMQ:用于理的视频压~?解压~的~译码器QCodecQ; <br>●音频压~管理器ACMQ提供与ICM怼的服务,适用于L形音频?<br>开发步?<br>AVICapH口cL持实时的视频捕获和单捕获Qƈ提供对视频源的控制。虽然MCI也提供数字视频服?比如它ؓ昄.AVI文g的视频提供了AVI VIDEO命o?Qؓ视频叠加提供了Overlay命o集,但这些命令主要是Z文g的操作,它们不能满实时C视频~存中取数据的要求, 对于使用没有视频叠加能力的捕获卡的PC机来_ 用MCI提供的命令集是无法捕莯频流的。而AVICapH口cd捕获视频斚wh一定的优势Q它能直接访问视频缓冲区Q不需要生成中间文Ӟ实时性很强,效率很高。而且Q它q可数字视频捕获到一个文件中?<br>1.创徏“捕获H?#8221; <br>在进行视频捕获之前必需要先创徏一?#8220;捕获H?#8221;Qƈ以它为基q行所有的捕获及设|操作?#8220;捕获H?#8221;用AVICapH口cȝ“CapCreateCaptureWindow”函数来创建,其窗口风g般ؓWS_CHILD和WS_VISIBLE?<br>捕获H类g标准控gQ如按钮、列表框{)Qƈh下列功能Q?<br>●将视频和音频捕获到一个AVI文g中; <br>●动态地同视频和音频输入器gq接或断开Q?<br>●以Overlay或Preview模式对输入的视频进行实时显C; <br>●在捕获Ӟ可指定所用的文g名ƈ能将捕获文g的内Ҏ贝到另一个文Ӟ <br>●设|捕获速率Q?<br>●显C控制视频源、视频格式、视频压~的对话框; <br>●创建、保存或载入调色板; <br>●将囑փ和相关的调色板拷贝到剪脓板; <br>●将捕获的单帧图像保存ؓDIB格式的文件?<br>2Q关联捕L和驱动程?<br>单独定义的一个捕L是不能工作的Q它必需与一个设备相兌Q这h能取得视频信受用函数CapDriverConnect可一个捕L与一个设备驱动程序相兌?<br>3Q设|视频设备的属?<br>通过讄TcaptureParmsl构变量的各个成员变量,可以控制讑֤的采样频率、中断采h键、状态行为等{。设|好TCaptureParmsl构变量后,可以用函数CapCaptureSetSetup使设|生效。之后还可以用CapPreviewScale、CapPreviewRate来设|预览的比例与速度Q也可以直接使用讑֤的默认倹{?<br>4Q打开预览 <br>利用函数CapOverlay选择是否采用叠加模式预览Q这样占用系l资源小Qƈ且视频显C速度快。然后用CapPreview启动预览功能Q这时就可以在屏q上看到来自摄像机的囑փ了?<br>通过以上4步就可以建立一个基本的视频捕获E序。但如果惌已处理从讑֤捕获到的视频数据Q则要用捕L回调函数来处理,比如一帧一帧地获得视频数据或以的方式获得视频数据{等?<br>实例~程 <br>下面以一个一帧一帧地从视频设备上捕获视频数据的DelphiE序ZQ来说明每个函数的作用以及开发过E?<br>该程序的功能是可以在屏幕上显视捕获到的视频,q可以获得每一帧的囑փ数据?<br>新徏一个工E,q将AVICAP32.PAS包含到USES中?<br>在Form1上放|一个TPanel控gQ设Name?#8220;gCapVideoArea”Q该控g用于昄视频。再攄两个TButton控gQ一个Name?#8220;Openvideo”Q另一个Name?#8220;Closevideo”?<br>定义全局变量Q?<br>var <br>//定义捕获H句?<br>ghCapWnd: THandle; <br>//可以得到视频数据指针的结构变量,用于回调函数?<br>VideoStr: LPVIDEOHDR; <br>//用于讄讑֤属性的l构变量 <br>CapParms: TCaptureParms; <br>在Name?#8220;Openvideo”的TButton 的Click事g中写入以下代码: <br>procedure TForm1.OpenvideoClick(Sender: TObject); <br>begin <br>//使用Tpanel控g来创建捕L?<br>ghCapWnd := CapCreateCaptureWindow <br>( PChar(‘KruwoSoft'), //捕获H口的名?<br>WS_CHILD or WS_VISIBLE,//H口样式 <br>0, //X坐标 <br>0, //Y坐标 <br>gCapVideoArea.Width, //H口?<br>gCapVideoArea.Height, //H口?<br>gCapVideoArea.Handle, //H口句柄 <br>0); //一般ؓ0 <br>{Z能够捕获视频帧,要启动一个捕获回调函数VideoStreamCallBack。捕获一个视频流或当前设备状态时分别使用以下函数Q?<br>//捕获一个视频流 <br>CapSetCallbackOnVideoStream; <br>//得到一个设备错?<br>CapSetCallbackonError; <br>//得到一个设备状?<br>CapSetCallbackOnStatus <br>} <br>//定义一个捕获回调函数 <br>CapSetCallbackOnFrame (ghCapWnd,LongInt(@VideoStreamCallBack)); <br>//一个捕L口与一个设备驱E相兌Q第二个参数是个序号Q当pȝ中装有多个显视驱动程序时Q其值分别依ơؓ0到M?<br>CapDriverConnect(ghCapWnd, 0); <br>//讄讑֤属性的l构变量 <br>CapParms.dwRequestMicroSecPerFrame:=40000; <br>CapParms.fLimitEnabled := FALSE; <br>CapParms.fCaptureAudio := FALSE; // NO Audio <br>CapParms.fMCIControl := FALSE; <br>CapParms.fYield := TRUE; <br>CapParms.vKeyAbort := VK_ESCAPE; <br>CapParms.fAbortLeftMouse := FALSE; <br>CapParms.fAbortRightMouse := FALSE; <br>//使设|生?<br>CapCaptureSetSetup(ghCapWnd,LongInt(@CapParms),sizeof(TCAPTUREPARMS)); <br>//讄预览时的比例 <br>CapPreviewScale(ghCapWnd, 1); <br>//讄预览时的帧频?<br>CapPreviewRate(ghCapWnd,66); <br>//如果要捕莯频流Q则要用函数指定不生成文g。否则将会自动生成AVI文g <br>CapCaptureSequenceNoFile(ghCapWnd); <br>//指定是否使用叠加模式Q用ؓ1Q否则ؓ0 <br>CapOverlay(ghCapWnd, 1); <br>//打开预览 <br>CapPreview(ghCapWnd, 1); <br>end; <br>在Name?#8220;Closevideo”的TButton 的Click事g中写入以下代码: <br>procedure TForm1.ClosevideoClick(Sender: TObject); <br>begin <br>//停止捕获 <br>capCaptureAbort(ghCapWnd); <br>//捕L同驱动器断开 <br>capDriverDisconnect(ghCapWnd); <br>end; <br>定义捕获帧回调函敎ͼ <br>function FrameCallBack(hWnd:HWND; lpVHdr:LongInt) :LongInt; stdcall; <br>var <br>DataPoint:^byte; <br>DibLen,RectWidth,RectHeight:integer; <br>begin <br>//转换从回调函C得到的指?<br>VideoStr:=LPVIDEOHDR(lpVHdr); <br>//得到q回的数据大?<br>DibLen:=VideoStr^.dwBufferLength; <br>GetMem(DataPoint,64000); <br>//数据COPYC个内存中Q注意DATAPOINT要先分配I间 <br>CopyMemory(DataPoint,VideoStr^.lpData,Diblen); <br>//一些其他处?<br>…… <br>end; <br>灉|C用AVICapH口cȝ回调函数可以满各种不同的需求,但要注意从视频卡中捕L视频数据的格式和囑փ的长宽要参考视频卡的参数。而且有些视频卡通过讄可支持多U的格式和图像长宽,所以在q原囑փ时要注意参考所用的视频卡的参数?/p> <img src ="http://m.shnenglu.com/wz19860913/aggbug/90905.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/wz19860913/" target="_blank">虎无忧</a> 2009-07-23 11:26 <a href="http://m.shnenglu.com/wz19860913/archive/2009/07/23/90905.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>《Windows via C/C++》中CZE序DIPS的问?/title><link>http://m.shnenglu.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://m.shnenglu.com/wz19860913/archive/2009/06/13/87573.html</guid><wfw:comment>http://m.shnenglu.com/wz19860913/comments/87573.html</wfw:comment><comments>http://m.shnenglu.com/wz19860913/archive/2009/06/13/87573.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://m.shnenglu.com/wz19860913/comments/commentRss/87573.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/wz19860913/services/trackbacks/87573.html</trackback:ping><description><![CDATA[  前一阶段重温了Windows中的HOOKQ由此参考了《Windows via C/C++》中的示例程序——DIPSQ但是我发现了一个有的问题?br>  默认情况下,链接器ƈ不会支持XP或Vista的manifest链接到程序上Q因此,生成的应用程序运行时的控仉格是l典Windows样式Q此ӞDIPS工兯行正常?br>  但是Q当加上如下q段代码Q适用于x86 CPUQ,问题׃生了?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 comment(linker, </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"> 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"> 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"> 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"> 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"> 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>   q意味着链接器将会把新的XP或Vista的manifest链接到程序上Q应用E序hXP或Vista的控件样式。这Ӟ问题产生了?br>  q里我脓出程序的dC码:<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://m.shnenglu.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://m.shnenglu.com/Images/OutliningIndicators/ContractedBlock.gif" align=top><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> WINAPI _tWinMain(HINSTANCE hInstExe, HINSTANCE, PTSTR pszCmdLine, </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">) </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://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>   </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> Convert command-line character to uppercase.</span><span style="COLOR: #008000"><br><img src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">   CharUpperBuff(pszCmdLine, </span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">);<br><img src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>   TCHAR cWhatToDo </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> pszCmdLine[</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">];<br><img src="http://m.shnenglu.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://m.shnenglu.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://m.shnenglu.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>   </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> ((cWhatToDo </span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000"> TEXT(</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">S</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">)) </span><span style="COLOR: #000000">&&</span><span style="COLOR: #000000"> (cWhatToDo </span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000"> TEXT(</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">R</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">))) </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://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>      </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> An invalid command-line argument; prompt the user.</span><span style="COLOR: #008000"><br><img src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">      cWhatToDo </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br><img src="http://m.shnenglu.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>   }</span></span><span style="COLOR: #000000"><br><img src="http://m.shnenglu.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://m.shnenglu.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://m.shnenglu.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>   </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (cWhatToDo </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">) </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://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>      </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> No command-line argument was used to tell us what to<br><img src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>      </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> do; show usage dialog box and prompt the 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://m.shnenglu.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://m.shnenglu.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top></span><span style="COLOR: #000000">      </span><span style="COLOR: #0000ff">switch</span><span style="COLOR: #000000"> (DialogBox(hInstExe, MAKEINTRESOURCE(IDD_DIPS), NULL, Dlg_Proc)) </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://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>         </span><span style="COLOR: #0000ff">case</span><span style="COLOR: #000000"> IDC_SAVE:    <br><img src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>            cWhatToDo </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> 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://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>            </span><span style="COLOR: #0000ff">break</span><span style="COLOR: #000000">;<br><img src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>         </span><span style="COLOR: #0000ff">case</span><span style="COLOR: #000000"> IDC_RESTORE: <br><img src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>            cWhatToDo </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> 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://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>            </span><span style="COLOR: #0000ff">break</span><span style="COLOR: #000000">;<br><img src="http://m.shnenglu.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>      }</span></span><span style="COLOR: #000000"><br><img src="http://m.shnenglu.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>   }</span></span><span style="COLOR: #000000"><br><img src="http://m.shnenglu.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://m.shnenglu.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://m.shnenglu.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>   </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (cWhatToDo </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">) </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://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>      </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> The user doesn't want to do anything.</span><span style="COLOR: #008000"><br><img src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">      </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://m.shnenglu.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>   }</span></span><span style="COLOR: #000000"><br><img src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>   <br><img src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>   </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> The Desktop ListView window is the grandchild of the ProgMan window.</span><span style="COLOR: #008000"><br><img src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">   HWND hWndLV </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> GetFirstChild(GetFirstChild(<br><img src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>      FindWindow(TEXT(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">ProgMan</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">), NULL)));<br><img src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>   chASSERT(IsWindow(hWndLV));<br><img src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>   </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> Set hook that injects our DLL into the Explorer's address space. After <br><img src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>   </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> setting the hook, the DIPS hidden modeless dialog box is created. We <br><img src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>   </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> send messages to this window to tell it what we want it to do.</span><span style="COLOR: #008000"><br><img src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">   chVERIFY(SetDIPSHook(GetWindowThreadProcessId(hWndLV, NULL)));<br><img src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>   </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> Wait for the DIPS server window to be created.</span><span style="COLOR: #008000"><br><img src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">   MSG msg;<br><img src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>   GetMessage(</span><span style="COLOR: #000000">&</span><span style="COLOR: #000000">msg, NULL, </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">, </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">);      <span style="COLOR: red">// h意这?/span><br><img src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>   </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> Find the handle of the hidden dialog box window.</span><span style="COLOR: #008000"><br><img src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">   HWND hWndDIPS </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> FindWindow(NULL, TEXT(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Wintellect DIPS</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">));<br><img src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>   </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> Make sure that the window was created.</span><span style="COLOR: #008000"><br><img src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">   chASSERT(IsWindow(hWndDIPS));<br><img src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>   </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> Tell the DIPS window which ListView window to manipulate<br><img src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>   </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> and whether the items should be saved or restored.</span><span style="COLOR: #008000"><br><img src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">   BOOL bSave </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> (cWhatToDo </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> 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://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>   SendMessage(hWndDIPS, WM_APP, (WPARAM) hWndLV, bSave);<br><img src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>   </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> Tell the DIPS window to destroy itself. Use SendMessage <br><img src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>   </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> instead of PostMessage so that we know the window is <br><img src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>   </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> destroyed before the hook is removed.</span><span style="COLOR: #008000"><br><img src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">   SendMessage(hWndDIPS, WM_CLOSE, </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">, </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">);<br><img src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>   </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> Make sure that the window was destroyed.</span><span style="COLOR: #008000"><br><img src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">   chASSERT(</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000">IsWindow(hWndDIPS));<br><img src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>   </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> Unhook the DLL, removing the DIPS dialog box procedure <br><img src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>   </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> from the Explorer's address space.</span><span style="COLOR: #008000"><br><img src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">   SetDIPSHook(</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">);  <br><img src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>   </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://m.shnenglu.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span></div> <br>  看到上面代码中的GetMessage函数Q加U色注释那行Q,该函数是在接收一个来自explorer.exeq程的消息,q个消息是在挂钩DLL注入之后Q由挂钩qo函数发送的。挂钩过滤函C码如下:<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://m.shnenglu.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://m.shnenglu.com/Images/OutliningIndicators/ContractedBlock.gif" align=top><span style="COLOR: #000000">LRESULT WINAPI GetMsgProc(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> nCode, WPARAM wParam, LPARAM lParam) </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://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>   </span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000"> BOOL bFirstTime </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> TRUE;<br><img src="http://m.shnenglu.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://m.shnenglu.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://m.shnenglu.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>   </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (bFirstTime) </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://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>      </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> The DLL just got injected.</span><span style="COLOR: #008000"><br><img src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">      bFirstTime </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> FALSE;<br><img src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>      </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> Uncomment the line below to invoke the debugger <br><img src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>      </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> on the process that just got the injected DLL.<br><img src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>      </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> ForceDebugBreak();<br><img src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>      </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> Create the DIPS Server window to handle the client request.</span><span style="COLOR: #008000"><br><img src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">      CreateDialog(g_hInstDll, MAKEINTRESOURCE(IDD_DIPS), NULL, Dlg_Proc);<br><img src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>      </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> Tell the DIPS application that the server is up <br><img src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>      </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> and ready to handle requests.</span><span style="COLOR: #008000"><br><img src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">      PostThreadMessage(g_dwThreadIdDIPS, WM_NULL, </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">, </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">);<br><img src="http://m.shnenglu.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>   }</span></span><span style="COLOR: #000000"><br><img src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>   </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">(CallNextHookEx(g_hHook, nCode, wParam, lParam));<br><img src="http://m.shnenglu.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span></div> <br>  明显圎ͼq里发送了一个WM_NULL消息lDIPSq程Q当使用l典样式的控件时一切安好,l调试得到的MSGl构中的各个字段为正的倹{但是加上了上面那行链接命o后,调试得到的MSGl构的字D压根就不是WM_NULL??Q而是一个数gؓ49211的消息,q样D了DIPSȝE唤醒,随后的FindWindow可能会返回一个NULLQ因消息q不是挂钩过滤函数的发送的消息。当Ӟ如果在这里Sleep一下,可以得到正确的窗口句柄,我在GetMessage函数上加了一个do-while循环Q结果也的确是这P几次循环之后可以收到消息为WM_NULL的消息,且参数均??br>  但是我不明白Z么加上了一条链接命令会q样Q不妨大安试试看,我用的IDE是VS2005?br>  哪位高手可以来指导我一下呢Q? <img src ="http://m.shnenglu.com/wz19860913/aggbug/87573.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/wz19860913/" target="_blank">虎无忧</a> 2009-06-13 13:37 <a href="http://m.shnenglu.com/wz19860913/archive/2009/06/13/87573.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于DLL中DllMain的线E死锁问?/title><link>http://m.shnenglu.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://m.shnenglu.com/wz19860913/archive/2009/05/22/85472.html</guid><wfw:comment>http://m.shnenglu.com/wz19860913/comments/85472.html</wfw:comment><comments>http://m.shnenglu.com/wz19860913/archive/2009/05/22/85472.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.shnenglu.com/wz19860913/comments/commentRss/85472.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/wz19860913/services/trackbacks/85472.html</trackback:ping><description><![CDATA[  前一阶段闲着无聊Q用q程U程注入的方法把DLL注入到Explorer.exeq程实现音乐循环播放? <p>  在DLL中的代码是这LQ?/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 WINAPI DllMain(HINSTANCE hInstDll, DWORD fdwReason, PVOID fImpLoad)<br>{<br>    </span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000"> HANDLE hThread;<br>    </span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000"> DWORD dwThreadId;<br>    </span><span style="COLOR: #0000ff">switch</span><span style="COLOR: #000000"> (fdwReason)<br>    {<br>    </span><span style="COLOR: #0000ff">case</span><span style="COLOR: #000000"> DLL_PROCESS_ATTACH:<br>        g_hInstDll </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> hInstDll;<br>        hThread </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> BEGINTHREADEX(NULL, </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">, ThreadProc, (PVOID)hInstDll, </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">, </span><span style="COLOR: #000000">&</span><span style="COLOR: #000000">dwThreadId);<br>        </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (hThread </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> NULL)<br>        {<br>            </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> FALSE;<br>        }<br>        </span><span style="COLOR: #0000ff">break</span><span style="COLOR: #000000">;<br><br>    </span><span style="COLOR: #0000ff">case</span><span style="COLOR: #000000"> DLL_PROCESS_DETACH:<br>        SendMessage(g_hWnd, WM_CLOSE, </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">, </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">);<br>        WaitForSingleObject(hThread, INFINITE);    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> q里存在d@?/span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000"><br>        CloseHandle(hThread);    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 执行不到q里</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">        </span><span style="COLOR: #0000ff">break</span><span style="COLOR: #000000">;<br><br>    </span><span style="COLOR: #0000ff">case</span><span style="COLOR: #000000"> DLL_THREAD_ATTACH:<br>        </span><span style="COLOR: #0000ff">break</span><span style="COLOR: #000000">;<br><br>    </span><span style="COLOR: #0000ff">case</span><span style="COLOR: #000000"> DLL_THREAD_DETACH:<br>        </span><span style="COLOR: #0000ff">break</span><span style="COLOR: #000000">;<br><br>    </span><span style="COLOR: #0000ff">default</span><span style="COLOR: #000000">:<br>        </span><span style="COLOR: #0000ff">break</span><span style="COLOR: #000000">;<br>    }<br>    </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> TRUE;<br>}</span></div> <br> <p>  在DLL_PROCESS_ATTACH的时候创Z一个线E,q个U程中创Z一个隐藏的H口Qƈ利用MCI实现播放音乐Q具体就不脓Z。然后在DLL_PROCESS_DETACH中停止和关闭讑֤?/p> <p>  但是在应用程序中Q发现注入时无异常,在需要撤销DLL映射时出C问题Q程序出Cd@环,在等待远E线E执行FreeLibaray完毕时不q回了?/p> <p>  注意上面代码中DLL_PROCESS_DETACH的代码,SendMessage用来关闭H口Q窗口会在WM_DESTROY通知下调用PostQuitMessage(0)使得U程的消息@环退出,从而线E退出。但是WaitForSingleObject函数无法q回?/p> <p>  后来发现q里存在d@环,因ؓ执行DllMain的线E是序列化的Q必ȝ待一个线E执行完毕之后另一个线E才能执行。在SendMessage后,D创徏的线E即退出,q时该线E会调用DllMainQƈ以DLL_THREAD_DETACH作ؓ通知。可是调用SendMessage的线E调用DllMain时却q在{待卛_退出的U程l束QDllMainq没有返回,因此存在了死循环?/p> <p>  因此Q在DllMain中不适合调用WaitForSingleObject{函数来{待U程完毕?/p> <img src ="http://m.shnenglu.com/wz19860913/aggbug/85472.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/wz19860913/" target="_blank">虎无忧</a> 2009-05-22 22:22 <a href="http://m.shnenglu.com/wz19860913/archive/2009/05/22/85472.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>l于在C++博客安家?/title><link>http://m.shnenglu.com/wz19860913/archive/2009/05/22/85471.html</link><dc:creator>虎无忧</dc:creator><author>虎无忧</author><pubDate>Fri, 22 May 2009 14:15:00 GMT</pubDate><guid>http://m.shnenglu.com/wz19860913/archive/2009/05/22/85471.html</guid><wfw:comment>http://m.shnenglu.com/wz19860913/comments/85471.html</wfw:comment><comments>http://m.shnenglu.com/wz19860913/archive/2009/05/22/85471.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.shnenglu.com/wz19860913/comments/commentRss/85471.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/wz19860913/services/trackbacks/85471.html</trackback:ping><description><![CDATA[  以前都是在博客园的,发现博客园关注的?Net技术,感觉和自q兴趣与特长关pM大,因此甌了C++博客?br>  原博客园博客地址Q?a >http://www.cnblogs.com/wz19860913/</a> <img src ="http://m.shnenglu.com/wz19860913/aggbug/85471.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/wz19860913/" target="_blank">虎无忧</a> 2009-05-22 22:15 <a href="http://m.shnenglu.com/wz19860913/archive/2009/05/22/85471.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://m.shnenglu.com/" title="精品视频久久久久">精品视频久久久久</a> <div class="friend-links"> </div> </div> </footer> <a href="http://www.uucity.com.cn" target="_blank">һۺϾþ</a>| <a href="http://www.vkgx.cn" target="_blank">ɫþþۺľþav</a>| <a href="http://www.y0ing.cn" target="_blank">þ97Ʒþþþþþò</a>| <a href="http://www.etnz.cn" target="_blank">91ɫۺϾþ</a>| <a href="http://www.ebsiask.cn" target="_blank">99þþþþѿ</a>| <a href="http://www.mayingbao.cn" target="_blank">ϵרþ</a>| <a href="http://www.ranhuman.cn" target="_blank">Ʒþþþù3d</a>| <a href="http://www.vnzn.cn" target="_blank">þݹֻƬ </a>| <a href="http://www.gaokaocaiti.cn" target="_blank">ڵþ</a>| <a href="http://www.lar6ge.cn" target="_blank">þþþƷҰ</a>| <a href="http://www.f259.cn" target="_blank">ҹƷþþþþ99</a>| <a href="http://www.56zhuanjia.com.cn" target="_blank">þþþҹҹҹƷ</a>| <a href="http://www.ndgbsz.cn" target="_blank">þþҹƷ</a>| <a href="http://www.xuzhou86.cn" target="_blank">뾫Ʒþþþ </a>| <a href="http://www.xhc9jinmutongsm.cn" target="_blank">Ʒۺþþþþ</a>| <a href="http://www.sgcx.net.cn" target="_blank">޾þһ</a>| <a href="http://www.zhoucheng888.cn" target="_blank">þþþó˾ƷĻ </a>| <a href="http://www.cstshs.cn" target="_blank">ݺɫþþһ</a>| <a href="http://www.u24373.cn" target="_blank">Ʒŷþþþ޹ </a>| <a href="http://www.baobaonin.cn" target="_blank">˾ҹվھƷþþþþþþ </a>| <a href="http://www.jinziwan.com.cn" target="_blank">޾Ʒ˾þþ</a>| <a href="http://www.bihuresorthotel.cn" target="_blank">þþŷղa</a>| <a href="http://www.one-8.cn" target="_blank">ഺþ</a>| <a href="http://www.gcxd.net.cn" target="_blank">һaƬþëƬ</a>| <a href="http://www.bao00long.cn" target="_blank">69þþƷһ</a>| <a href="http://www.palmback.cn" target="_blank">þþƷAV㽶</a>| <a href="http://www.phb321.cn" target="_blank">þĻԴվ</a>| <a href="http://www.vgunu.cn" target="_blank">91þó</a>| <a href="http://www.9795315.cn" target="_blank">Ʒŷ޺ձþ</a>| <a href="http://www.cyjeans.com.cn" target="_blank">þþƷëƬѹۿ</a>| <a href="http://www.mosphere.cn" target="_blank">AVһþ</a>| <a href="http://www.kunzuo.cn" target="_blank">þAV</a>| <a href="http://www.lcvy.cn" target="_blank">97þù¶Ʒ</a>| <a href="http://www.594n.cn" target="_blank">ձþþվ</a>| <a href="http://www.uuribao.com.cn" target="_blank">޾ƷWWWþþþþ</a>| <a href="http://www.mmmj.net.cn" target="_blank">ùƷӰ˾þ</a>| <a href="http://www.areall.cn" target="_blank">þۺϾɫۺϾ99</a>| <a href="http://www.vfqt.cn" target="_blank">һһþaþþƷۺ</a>| <a href="http://www.qymlw.cn" target="_blank">һAvëƬþþƷ</a>| <a href="http://www.etfp.cn" target="_blank">㽶þþþþúݺɫ</a>| <a href="http://www.goodleg.cn" target="_blank">Ʒþþþѿ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>