﻿<?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++博客-编程自动化-随笔分类-深入vc++</title><link>http://www.cppblog.com/AutomateProgram/category/12533.html</link><description>当音乐和传说在深夜中沉寂后，程序的每个字符还在跳动！</description><language>zh-cn</language><lastBuildDate>Mon, 18 Oct 2010 15:21:57 GMT</lastBuildDate><pubDate>Mon, 18 Oct 2010 15:21:57 GMT</pubDate><ttl>60</ttl><item><title>修改IAT实现本进程API HOOK </title><link>http://www.cppblog.com/AutomateProgram/archive/2010/10/14/129849.html</link><dc:creator>漂漂</dc:creator><author>漂漂</author><pubDate>Thu, 14 Oct 2010 07:42:00 GMT</pubDate><guid>http://www.cppblog.com/AutomateProgram/archive/2010/10/14/129849.html</guid><wfw:comment>http://www.cppblog.com/AutomateProgram/comments/129849.html</wfw:comment><comments>http://www.cppblog.com/AutomateProgram/archive/2010/10/14/129849.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/AutomateProgram/comments/commentRss/129849.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/AutomateProgram/services/trackbacks/129849.html</trackback:ping><description><![CDATA[<p>原文地址：<a href="http://blog.csdn.net/leeeryan/archive/2010/06/08/5656364.aspx">http://blog.csdn.net/leeeryan/archive/2010/06/08/5656364.aspx</a><br><br></p>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;APIHOOKImageDirectoryEntryToData.cpp&nbsp;:&nbsp;Defines&nbsp;the&nbsp;entry&nbsp;point&nbsp;for&nbsp;the&nbsp;console&nbsp;application.<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #008000">//<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">#include&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">stdafx.h</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">windows.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">imagehlp.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">ImageDirectoryEntryToData</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #000000">#pragma&nbsp;comment(lib,</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">imagehlp.lib</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">)<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">szModName&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;NULL&nbsp;;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">szHacked&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">不好意思hook到了!</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">DWORD&nbsp;dwHookFun&nbsp;;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">PROC&nbsp;dwHookApiAddr;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">PIMAGE_IMPORT_DESCRIPTOR&nbsp;pImportDesc&nbsp;;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">PIMAGE_THUNK_DATA32&nbsp;pThunk;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">ULONG&nbsp;uSize&nbsp;;&nbsp;&nbsp;<br><img id=Codehighlighter1_415_476_Open_Image onclick="this.style.display='none'; Codehighlighter1_415_476_Open_Text.style.display='none'; Codehighlighter1_415_476_Closed_Image.style.display='inline'; Codehighlighter1_415_476_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_415_476_Closed_Image onclick="this.style.display='none'; Codehighlighter1_415_476_Closed_Text.style.display='none'; Codehighlighter1_415_476_Open_Image.style.display='inline'; Codehighlighter1_415_476_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_415_476_Closed_Text>/**/</span><span id=Codehighlighter1_415_476_Open_Text><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">**********************************************************</span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000">&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;MYhook()&nbsp;&nbsp;<br><img id=Codehighlighter1_496_620_Open_Image onclick="this.style.display='none'; Codehighlighter1_496_620_Open_Text.style.display='none'; Codehighlighter1_496_620_Closed_Image.style.display='inline'; Codehighlighter1_496_620_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_496_620_Closed_Image onclick="this.style.display='none'; Codehighlighter1_496_620_Closed_Text.style.display='none'; Codehighlighter1_496_620_Open_Image.style.display='inline'; Codehighlighter1_496_620_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_496_620_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_496_620_Open_Text><span style="COLOR: #000000">{&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;__asm&nbsp;&nbsp;<br><img id=Codehighlighter1_510_617_Open_Image onclick="this.style.display='none'; Codehighlighter1_510_617_Open_Text.style.display='none'; Codehighlighter1_510_617_Closed_Image.style.display='inline'; Codehighlighter1_510_617_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_510_617_Closed_Image onclick="this.style.display='none'; Codehighlighter1_510_617_Closed_Text.style.display='none'; Codehighlighter1_510_617_Open_Image.style.display='inline'; Codehighlighter1_510_617_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_510_617_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_510_617_Open_Text><span style="COLOR: #000000">{&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;esp,ebp&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;push&nbsp;szHacked&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pop&nbsp;&nbsp;DWORD&nbsp;PTR&nbsp;[ebp</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">12</span><span style="COLOR: #000000">]&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pop&nbsp;&nbsp;ebp&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jmp&nbsp;dwHookApiAddr&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif">&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000">&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;main(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;argc,&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;argv[])<br><img id=Codehighlighter1_656_1624_Open_Image onclick="this.style.display='none'; Codehighlighter1_656_1624_Open_Text.style.display='none'; Codehighlighter1_656_1624_Closed_Image.style.display='inline'; Codehighlighter1_656_1624_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_656_1624_Closed_Image onclick="this.style.display='none'; Codehighlighter1_656_1624_Closed_Text.style.display='none'; Codehighlighter1_656_1624_Open_Image.style.display='inline'; Codehighlighter1_656_1624_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_656_1624_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_656_1624_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;HMODULE&nbsp;hInstance&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">GetModuleHandle(NULL);&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;dwHookFun&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(DWORD)MYhook;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;dwHookApiAddr&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;GetProcAddress(LoadLibrary(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">USER32.dll</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">),&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">MessageBoxA</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">)&nbsp;;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">通过函数)ImageDirectoryEntryToData获得IAT&nbsp;&nbsp;</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;pImportDesc&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(PIMAGE_IMPORT_DESCRIPTOR)ImageDirectoryEntryToData(hInstance,&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TRUE,&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IMAGE_DIRECTORY_ENTRY_IMPORT,&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">uSize)&nbsp;;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">找到要HOOK的函数所在的模块&nbsp;&nbsp;</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">(pImportDesc</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">Name)&nbsp;&nbsp;<br><img id=Codehighlighter1_1050_1195_Open_Image onclick="this.style.display='none'; Codehighlighter1_1050_1195_Open_Text.style.display='none'; Codehighlighter1_1050_1195_Closed_Image.style.display='inline'; Codehighlighter1_1050_1195_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_1050_1195_Closed_Image onclick="this.style.display='none'; Codehighlighter1_1050_1195_Closed_Text.style.display='none'; Codehighlighter1_1050_1195_Open_Image.style.display='inline'; Codehighlighter1_1050_1195_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_1050_1195_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_1050_1195_Open_Text><span style="COLOR: #000000">{&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;szModName&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">)((PBYTE)hInstance</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">pImportDesc</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">Name)&nbsp;;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(strcmp(szModName,</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">USER32.dll</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">)&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">break</span><span style="COLOR: #000000">&nbsp;;&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pImportDesc</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">&nbsp;;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif">&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000">&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">原始的THUNK信息指针&nbsp;&nbsp;</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;pThunk</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(PIMAGE_THUNK_DATA32)((PBYTE)hInstance</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">pImportDesc</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">FirstThunk)&nbsp;;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(;pThunk</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">u1.Function;pThunk</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)&nbsp;&nbsp;<br><img id=Codehighlighter1_1331_1550_Open_Image onclick="this.style.display='none'; Codehighlighter1_1331_1550_Open_Text.style.display='none'; Codehighlighter1_1331_1550_Closed_Image.style.display='inline'; Codehighlighter1_1331_1550_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_1331_1550_Closed_Image onclick="this.style.display='none'; Codehighlighter1_1331_1550_Closed_Text.style.display='none'; Codehighlighter1_1331_1550_Open_Image.style.display='inline'; Codehighlighter1_1331_1550_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_1331_1550_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_1331_1550_Open_Text><span style="COLOR: #000000">{&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PROC</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;ppfn&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(PROC</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">)&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">pThunk</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">u1.Function;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">ppfn&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;dwHookApiAddr)&nbsp;&nbsp;<br><img id=Codehighlighter1_1414_1545_Open_Image onclick="this.style.display='none'; Codehighlighter1_1414_1545_Open_Text.style.display='none'; Codehighlighter1_1414_1545_Closed_Image.style.display='inline'; Codehighlighter1_1414_1545_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_1414_1545_Closed_Image onclick="this.style.display='none'; Codehighlighter1_1414_1545_Closed_Text.style.display='none'; Codehighlighter1_1414_1545_Open_Image.style.display='inline'; Codehighlighter1_1414_1545_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_1414_1545_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_1414_1545_Open_Text><span style="COLOR: #000000">{&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VirtualProtect(</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">pThunk</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">u1.Function,&nbsp;</span><span style="COLOR: #000000">4096</span><span style="COLOR: #000000">,PAGE_READWRITE,</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">);&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pThunk</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">u1.Function&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(PDWORD)dwHookFun;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">break</span><span style="COLOR: #000000">&nbsp;;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000">&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif">&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000">&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">要hook下面这个API&nbsp;&nbsp;</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;MessageBoxA(</span><span style="COLOR: #000000">0</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">xicao</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">);&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span></div>
<img src ="http://www.cppblog.com/AutomateProgram/aggbug/129849.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/AutomateProgram/" target="_blank">漂漂</a> 2010-10-14 15:42 <a href="http://www.cppblog.com/AutomateProgram/archive/2010/10/14/129849.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>预编译头文件介绍和说明</title><link>http://www.cppblog.com/AutomateProgram/archive/2010/10/14/129846.html</link><dc:creator>漂漂</dc:creator><author>漂漂</author><pubDate>Thu, 14 Oct 2010 07:14:00 GMT</pubDate><guid>http://www.cppblog.com/AutomateProgram/archive/2010/10/14/129846.html</guid><wfw:comment>http://www.cppblog.com/AutomateProgram/comments/129846.html</wfw:comment><comments>http://www.cppblog.com/AutomateProgram/archive/2010/10/14/129846.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/AutomateProgram/comments/commentRss/129846.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/AutomateProgram/services/trackbacks/129846.html</trackback:ping><description><![CDATA[<p>原文地址：<a href="http://www.neu.edu.cn/cxsj/pointchart/c11/Untitled(3).html">http://www.neu.edu.cn/cxsj/pointchart/c11/Untitled(3).html</a><br></p>
<div align=left>TAG:<span>预编译和宏定义,VC++,预编译头文件说明</span><span></span></div>
<div align=left>TEXT:</div>
<div align=left><span>所谓头文件预编译，就是把一个工程(Project)中使用的一些MFC标准头文件(如Windows.H、 Afxwin.H)预先编译，以后该工程编译时，不再编译这部分头文件，仅仅使用预编译的结果。这样可以加快编译速度，节省时间。</span><span></span></div>
<div align=left><span>　　 预编译头文件通过编译stdafx.cpp生成，以工程名命名，由于预编译的头文件的后缀是&#8220;pch&#8221;，所以编译结果文件是projectname.pch。</span><span></span></div>
<div align=left><span>　　 编译器通过一个头文件stdafx.h来使用预编译头文件。stdafx.h这个头文件名是可以在project的编译设置里指定的。编译器认为，所有在指令#include "stdafx.h"前的代码都是预编译的，它跳过#include "stdafx. h"指令，使用projectname.pch编译这条指令之后的所有代码。</span><span></span></div>
<div align=left><span>　　 因此，所有的CPP实现文件第一条语句都是：#include "stdafx.h"。</span><span></span></div>
<div align=left><span>　　 另外，每一个实现文件CPP都包含了如下语句：</span><span></span></div>
<div align=left>#ifdef _DEBUG</div>
<div align=left>#undef THIS_FILE</div>
<div align=left>static char THIS_FILE[] = __FILE__;</div>
<div align=left>#endif</div>
<div align=left><span>　　 这是表示，如果生成调试版本，要指示当前文件的名称。__FILE__是一个宏，在编译器编译过程中给它赋值为当前正在编译的文件名称。</span><span></span></div>
<div align=left><span>　　 VC默认情况下使用预编译头(/Yu)，不明白的在加入新.h文件后编译时总出现fatal errorC1010: 在查找预编译头指令时遇到意外的文件结尾的错误。解决方法是在include头文件的地方加上#include"stdafx.h",或者打项目属性，找到&#8220;C/C++&#8221;文件夹，单击&#8220;预编译头&#8221;属性页。修改&#8220;创建/使用预编译头&#8221;属性为&#8220;不使用预编译头&#8221;。</span><span></span></div>
<div align=left><br></div>
<p><br><br>PS:<br>预编译头的概念： </p>
<p>所谓的预编译头就是把一个工程中的那一部分代码,预先编译好放在一个文件里(通常是 </p>
<p>以.pch为扩展名的)，这个文件就称为预编译头文件这些预先编译好的代码可以是任何的 </p>
<p>C/C++代码--------甚至是inline的函数，但是必须是稳定的，在工程开发的过程中不会 </p>
<p>被经常改变。如果这些代码被修改，则需要重新编译生成预编译头文件。注意生成预编 </p>
<p>译头文件是很耗时间的。同时你得注意预编译头文件通常很大，通常有6-7M大。注意及 </p>
<p>时清理那些没有用的预编译头文件。 </p>
<p>也许你会问：现在的编译器都有Time stamp的功能，编译器在编译整个工程的时候，它 </p>
<p>只会编译那些经过修改的文件，而不会去编译那些从上次编译过，到现在没有被修改过 </p>
<p>的文件。那么为什么还要预编译头文件呢？答案在这里，我们知道编译器是以文件为单 </p>
<p>位编译的，一个文件经过修改后，会重新编译整个文件，当然在这个文件里包含的所有 </p>
<p>头文件中的东西（.eg Macro, Preprocesser ）都要重新处理一遍。VC的预编译头文件 </p>
<p>保存的正是这部分信息。以避免每次都要重新处理这些头文件。 </p>
<p>预编译头的作用： </p>
<p>根据上文介绍，预编译头文件的作用当然就是提高便宜速度了，有了它你没有必要每次 </p>
<p>都编译那些不需要经常改变的代码。编译性能当然就提高了。 </p>
<p>预编译头的使用： </p>
<p>要使用预编译头，我们必须指定一个头文件，这个头文件包含我们不会经常改变的 </p>
<p>代码和其他的头文件，然后我们用这个头文件来生成一个预编译头文件（.pch文件） </p>
<p>想必大家都知道 StdAfx.h这个文件。很多人都认为这是VC提供的一个&#8220;系统级别&#8221;的 </p>
<p>，编译器带的一个头文件。其实不是的，这个文件可以是任何名字的。我们来考察一个 </p>
<p>典型的由AppWizard生成的MFC Dialog Based　程序的预编译头文件。（因为AppWizard </p>
<p>会为我们指定好如何使用预编译头文件，默认的是StdAfx.h，这是VC起的名字）。我们 </p>
<p>会发现这个头文件里包含了以下的头文件： </p>
<p>#include &lt;afxwin.h&gt; // MFC core and standard components </p>
<p>#include &lt;afxext.h&gt; // MFC extensions </p>
<p>#include &lt;afxdisp.h&gt; // MFC Automation classes </p>
<p>#include &lt;afxdtctl.h&gt; // MFC support for Internet Explorer 4 </p>
<p>Common Controls </p>
<p>#include &lt;afxcmn.h&gt; </p>
<p>这些正是使用MFC的必须包含的头文件，当然我们不太可能在我们的工程中修改这些头文 </p>
<p>件的，所以说他们是稳定的。 </p>
<p>那么我们如何指定它来生成预编译头文件。我们知道一个头文件是不能编译的。所以我 </p>
<p>们还需要一个cpp文件来生成.pch 文件。这个文件默认的就是StdAfx.cpp。在这个文件 </p>
<p>里只有一句代码就是：#include &#8220;Stdafx.h&#8221;。原因是理所当然的，我们仅仅是要它能 </p>
<p>够编译而已?D?D?D也就是说，要的只是它的.cpp的扩展名。我们可以用/Yc编译开关来指 </p>
<p>定StdAfx.cpp来生成一个.pch文件，通过/Fp编译开关来指定生成的pch文件的名字。打 </p>
<p>开project -&gt;Setting-&gt;C/C++ 对话框。把Category指向Precompiled Header。在左边的 </p>
<p>树形视图里选择整个工程　 </p>
<p>Project Options(右下角的那个白的地方)可以看到 /Fp &#8220;debug/PCH.pch&#8221;，这就是指 </p>
<p>定生成的.pch文件的名字，默认的通常是　&lt;工程名&gt;.pch（我的示例工程名就是PCH）。 </p>
<p>然后，在左边的树形视图里选择StdAfx.cpp.//这时只能选一个cpp文件！ </p>
<p>这时原来的Project Option变成了 Source File Option（原来是工程，现在是一个文件 </p>
<p>，当然变了）。在这里我们可以看到 /Yc开关，/Yc的作用就是指定这个文件来创建一个 </p>
<p>Pch文件。/Yc后面的文件名是那个包含了稳定代码的头文件，一个工程里只能有一个文 </p>
<p>件的可以有YC开关。VC就根据这个选项把 StdAfx.cpp编译成一个Obj文件和一个PCH文件 </p>
<p>。 </p>
<p>然后我们再选择一个其它的文件来看看，//其他cpp文件 </p>
<p>在这里，Precomplier 选择了 Use ⋯⋯⋯一项，头文件是我们指定创建PCH 文件的stda </p>
<p>fx.h </p>
<p>文件。事实上，这里是使用工程里的设置，（如图1）/Yu&#8221;stdafx.h&#8221;。 </p>
<p>这样，我们就设置好了预编译头文件。也就是说，我们可以使用预编译头功能了。以 </p>
<p>下是注意事项： </p>
<p>1):如果使用了/Yu，就是说使用了预编译，我们在每个.cpp文件的最开头，我强调一遍 </p>
<p>是最开头，包含 你指定产生pch文件的.h文件（默认是stdafx.h）不然就会有问题。如 </p>
<p>果你没有包含这个文件，就告诉你Unexpected file end. 如果你不是在最开头包含的， </p>
<p>你自己试以下就知道了，绝对有很惊人的效果⋯.. </p>
<p>fatal error C1010: unexpected end of file while looking for precompiled </p>
<p>header directive </p>
<p>Generating Code... </p>
<p>2）如果你把pch文件不小心丢了，编译的时候就会产生很多的不正常的行为。根据以上 </p>
<p>的分析，你只要让编译器生成一个pch文件。也就是说把 stdafx.cpp（即指定/Yc的那个 </p>
<p>cpp文件）从新编译一遍。当然你可以傻傻的 Rebuild All。简单一点就是选择那个cpp </p>
<p>文件，按一下Ctrl + F7就可以了。不然可是很浪费时间的哦。 </p>
<img src ="http://www.cppblog.com/AutomateProgram/aggbug/129846.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/AutomateProgram/" target="_blank">漂漂</a> 2010-10-14 15:14 <a href="http://www.cppblog.com/AutomateProgram/archive/2010/10/14/129846.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Socket 一些知识和常识，socket入门</title><link>http://www.cppblog.com/AutomateProgram/archive/2010/10/11/129457.html</link><dc:creator>漂漂</dc:creator><author>漂漂</author><pubDate>Mon, 11 Oct 2010 09:23:00 GMT</pubDate><guid>http://www.cppblog.com/AutomateProgram/archive/2010/10/11/129457.html</guid><wfw:comment>http://www.cppblog.com/AutomateProgram/comments/129457.html</wfw:comment><comments>http://www.cppblog.com/AutomateProgram/archive/2010/10/11/129457.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/AutomateProgram/comments/commentRss/129457.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/AutomateProgram/services/trackbacks/129457.html</trackback:ping><description><![CDATA[原文地址：<a href="http://www.cppblog.com/lapcca/archive/2010/09/10/126329.html">http://www.cppblog.com/lapcca/archive/2010/09/10/126329.html</a><br><br>
<p>这两天看csdn有一些关于socket粘包，socket缓冲区设置的问题，发现自己不是很清楚，所以查资料了解记录一下：</p>
<p>一两个简单概念长连接与短连接：<br>1.长连接</p>
<p>&nbsp;&nbsp;&nbsp; Client方与Server方先建立通讯连接，连接建立后不断开， 然后再进行报文发送和接收。</p>
<p>2.短连接</p>
<p>&nbsp;&nbsp;&nbsp; Client方与Server每进行一次报文收发交易时才进行通讯连接，交易完毕后立即断开连接。此种方式常用于一点对多点 <br>通讯，比如多个Client连接一个Server.</p>
<p>二 什么时候需要考虑粘包问题?</p>
<p>1:如果利用tcp每次发送数据，就与对方建立连接，然后双方发送完一段数据后，就关闭连接，这样就不会出现粘包问题（因为只有一种包结构,类似于http协议）。关闭连接主要要双方都发送close连接（参考tcp关闭协议）。如：A需要发送一段字符串给B，那么A与B建立连接，然后发送双方都默认好的协议字符如"hello give me sth abour yourself"，然后B收到报文后，就将缓冲区数据接收,然后关闭连接，这样粘包问题不用考虑到，因为大家都知道是发送一段字符。<br><br>2：如果发送数据无结构，如文件传输，这样发送方只管发送，接收方只管接收存储就ok，也不用考虑粘包<br><br>3：如果双方建立连接，需要在连接后一段时间内发送不同结构数据，如连接后，有好几种结构：<br>1)"hello give me sth abour yourself" <br>2)"Don't give me sth abour yourself"&nbsp;<br><br>&nbsp;那这样的话，如果发送方连续发送这个两个包出去，接收方一次接收可能会是"hello give me sth abour yourselfDon't give me sth abour yourself" 这样接收方就傻了，到底是要干嘛？不知道，因为协议没有规定这么诡异的字符串，所以要处理把它分包，怎么分也需要双方组织一个比较好的包结构，所以一般可能会在头加一个数据长度之类的包，以确保接收。<br></p>
<p>三 粘包出现原因：在流传输中出现，UDP不会出现粘包，因为它有消息边界(参考Windows 网络编程)<br>1 发送端需要等缓冲区满才发送出去，造成粘包<br>2 接收方不及时接收缓冲区的包，造成多个包接收</p>
<p>解决办法：<br>为了避免粘包现象，可采取以下几种措施。一是对于发送方引起的粘包现象，用户可通过编程设置来避免，TCP提供了强制数据立即传送的操作指令push，TCP软件收到该操作指令后，就立即将本段数据发送出去，而不必等待发送缓冲区满；二是对于接收方引起的粘包，则可通过优化程序设计、精简接收进程工作量、提高接收进程优先级等措施，使其及时接收数据，从而尽量避免出现粘包现象；三是由接收方控制，将一包数据按结构字段，人为控制分多次接收，然后合并，通过这种手段来避免粘包。</p>
<p>以上提到的三种措施，都有其不足之处。第一种编程设置方法虽然可以避免发送方引起的粘包，但它关闭了优化算法，降低了网络发送效率，影响应用程序的性能，一般不建议使用。第二种方法只能减少出现粘包的可能性，但并不能完全避免粘包，当发送频率较高时，或由于网络突发可能使某个时间段数据包到达接收方较快，接收方还是有可能来不及接收，从而导致粘包。第三种方法虽然避免了粘包，但应用程序的效率较低，对实时应用的场合不适合。</p>
<br>解决粘包问题：<a href="http://www.vckbase.com/document/viewdoc/?id=1203">http://www.vckbase.com/document/viewdoc/?id=1203</a><br><br>在socket 文件传输中，获取某个目录下的所有文件，如果一个文件名传输一次通讯的话，127.0.0.1上测试没有什么问题，当在局域网中传输2次以上，就会出现包丢失问题。我猜这个问题跟粘包有点相似。
<img src ="http://www.cppblog.com/AutomateProgram/aggbug/129457.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/AutomateProgram/" target="_blank">漂漂</a> 2010-10-11 17:23 <a href="http://www.cppblog.com/AutomateProgram/archive/2010/10/11/129457.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VC中常见错误和解决方法</title><link>http://www.cppblog.com/AutomateProgram/archive/2010/09/16/126789.html</link><dc:creator>漂漂</dc:creator><author>漂漂</author><pubDate>Thu, 16 Sep 2010 10:35:00 GMT</pubDate><guid>http://www.cppblog.com/AutomateProgram/archive/2010/09/16/126789.html</guid><wfw:comment>http://www.cppblog.com/AutomateProgram/comments/126789.html</wfw:comment><comments>http://www.cppblog.com/AutomateProgram/archive/2010/09/16/126789.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/AutomateProgram/comments/commentRss/126789.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/AutomateProgram/services/trackbacks/126789.html</trackback:ping><description><![CDATA[<br>链接错误：<br>LINK : fatal error LNK1000: Internal error during IncrBuildImage<br><br>原文地址：<a href="http://www.a3gs.com/BookViews.asp?InfoID=3425&amp;classID=819">http://www.a3gs.com/BookViews.asp?InfoID=3425&amp;classID=819</a><br>
<p><span>在</span><span>Win7</span><span>旗舰版下使用</span><span>VS2008</span><span>编译程序时出现</span><span>LINK : fatal error LNK1000: Internal error during IncrBuildImage</span><span>错有如下两种解决方法：</span></p>
<p><span>方法一：打补丁</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp; </span></span><span>到微软网站下载</span><span><a href="https://connect.microsoft.com/VisualStudio/Downloads/DownloadDetails.aspx?DownloadID=11399">343461_ENU_i386_zip</a></span><span>补丁包，然后打补丁既可。</span></p>
<p><span>方法二：修改项目设置</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp; </span></span><span>项目</span><span>-&gt;</span><span>属性</span><span>-&gt;</span><span>链接器</span><span>-&gt;</span><span>常规</span> <span>下面的&#8220;启用增量链接&#8221;，将&#8220;是</span><span>(/INCREMENTAL)</span><span>&#8221;改为&#8220;否</span><span>(/INCREMENTAL:NO)</span><span>&#8221;既可。<br><br>ps：找不到补丁包，就按第二种方法。</span></p>
<img src ="http://www.cppblog.com/AutomateProgram/aggbug/126789.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/AutomateProgram/" target="_blank">漂漂</a> 2010-09-16 18:35 <a href="http://www.cppblog.com/AutomateProgram/archive/2010/09/16/126789.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>硬件检测：安装、停用、usb设备检查 和c#实现</title><link>http://www.cppblog.com/AutomateProgram/archive/2010/09/13/126529.html</link><dc:creator>漂漂</dc:creator><author>漂漂</author><pubDate>Mon, 13 Sep 2010 13:27:00 GMT</pubDate><guid>http://www.cppblog.com/AutomateProgram/archive/2010/09/13/126529.html</guid><wfw:comment>http://www.cppblog.com/AutomateProgram/comments/126529.html</wfw:comment><comments>http://www.cppblog.com/AutomateProgram/archive/2010/09/13/126529.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/AutomateProgram/comments/commentRss/126529.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/AutomateProgram/services/trackbacks/126529.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 原文地址：http://www.cnblogs.com/SunYu/archive/2010/04/29/1723977.htmlcodeproject：http://www.codeproject.com/KB/system/HwDetect.aspx&nbsp;简介现在对于IT的安全来说，热插拨设备是个很大的威胁。在这篇文章中，我将试着开发一个用户应用程序来检测本机系统上的设备改变...&nbsp;&nbsp;<a href='http://www.cppblog.com/AutomateProgram/archive/2010/09/13/126529.html'>阅读全文</a><img src ="http://www.cppblog.com/AutomateProgram/aggbug/126529.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/AutomateProgram/" target="_blank">漂漂</a> 2010-09-13 21:27 <a href="http://www.cppblog.com/AutomateProgram/archive/2010/09/13/126529.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>vc/C++中使用网络校正系统时间</title><link>http://www.cppblog.com/AutomateProgram/archive/2010/06/16/118031.html</link><dc:creator>漂漂</dc:creator><author>漂漂</author><pubDate>Wed, 16 Jun 2010 10:09:00 GMT</pubDate><guid>http://www.cppblog.com/AutomateProgram/archive/2010/06/16/118031.html</guid><wfw:comment>http://www.cppblog.com/AutomateProgram/comments/118031.html</wfw:comment><comments>http://www.cppblog.com/AutomateProgram/archive/2010/06/16/118031.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/AutomateProgram/comments/commentRss/118031.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/AutomateProgram/services/trackbacks/118031.html</trackback:ping><description><![CDATA[<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: #008080">&nbsp;1</span><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">BOOL&nbsp;UpdateSysTime()<br></span><span style="COLOR: #008080">&nbsp;2</span><span style="COLOR: #000000"><img id=Codehighlighter1_21_2209_Open_Image onclick="this.style.display='none'; Codehighlighter1_21_2209_Open_Text.style.display='none'; Codehighlighter1_21_2209_Closed_Image.style.display='inline'; Codehighlighter1_21_2209_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_21_2209_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_21_2209_Closed_Text.style.display='none'; Codehighlighter1_21_2209_Open_Image.style.display='inline'; Codehighlighter1_21_2209_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_21_2209_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"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_21_2209_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">&nbsp;3</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;WORD&nbsp;&nbsp;&nbsp;&nbsp;wVersionRequested;<br></span><span style="COLOR: #008080">&nbsp;4</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;WSADATA&nbsp;wsaData;<br></span><span style="COLOR: #008080">&nbsp;5</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">&nbsp;6</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&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: #008080">&nbsp;7</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;wVersionRequested&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;MAKEWORD(&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">&nbsp;);<br></span><span style="COLOR: #008080">&nbsp;8</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">WSAStartup(wVersionRequested,&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">wsaData))&nbsp;<br></span><span style="COLOR: #008080">&nbsp;9</span><span style="COLOR: #000000"><img id=Codehighlighter1_168_203_Open_Image onclick="this.style.display='none'; Codehighlighter1_168_203_Open_Text.style.display='none'; Codehighlighter1_168_203_Closed_Image.style.display='inline'; Codehighlighter1_168_203_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_168_203_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_168_203_Closed_Text.style.display='none'; Codehighlighter1_168_203_Open_Image.style.display='inline'; Codehighlighter1_168_203_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_168_203_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"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_168_203_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">10</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WSACleanup();<br></span><span style="COLOR: #008080">11</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;FALSE;<br></span><span style="COLOR: #008080">12</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">13</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(LOBYTE(wsaData.wVersion)</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">||</span><span style="COLOR: #000000">&nbsp;HIBYTE(wsaData.wVersion)</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">)&nbsp;<br></span><span style="COLOR: #008080">14</span><span style="COLOR: #000000"><img id=Codehighlighter1_272_309_Open_Image onclick="this.style.display='none'; Codehighlighter1_272_309_Open_Text.style.display='none'; Codehighlighter1_272_309_Closed_Image.style.display='inline'; Codehighlighter1_272_309_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_272_309_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_272_309_Closed_Text.style.display='none'; Codehighlighter1_272_309_Open_Image.style.display='inline'; Codehighlighter1_272_309_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_272_309_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"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_272_309_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">15</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WSACleanup(&nbsp;);<br></span><span style="COLOR: #008080">16</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;FALSE;&nbsp;<br></span><span style="COLOR: #008080">17</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">18</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">19</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;这个IP是中国大陆时间同步服务器地址，可自行修改</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">20</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;SOCKET&nbsp;soc</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);<br></span><span style="COLOR: #008080">21</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;sockaddr_in&nbsp;addrSrv;<br></span><span style="COLOR: #008080">22</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;addrSrv.sin_addr.S_un.S_addr</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">inet_addr(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">210.72.145.44</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">23</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;addrSrv.sin_family</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">AF_INET;<br></span><span style="COLOR: #008080">24</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;addrSrv.sin_port</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">htons(</span><span style="COLOR: #000000">123</span><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">25</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">26</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;NTP_Packet&nbsp;NTP_Send,NTP_Recv;&nbsp;<br></span><span style="COLOR: #008080">27</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;NTP_Send.Control_Word&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;htonl(</span><span style="COLOR: #000000">0x0B000000</span><span style="COLOR: #000000">);&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">28</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;NTP_Send.root_delay&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">29</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;NTP_Send.root_dispersion&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">30</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;NTP_Send.reference_identifier&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">31</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;NTP_Send.reference_timestamp&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">32</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;NTP_Send.originate_timestamp&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">33</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;NTP_Send.receive_timestamp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">34</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;NTP_Send.transmit_timestamp_seconds&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">35</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;NTP_Send.transmit_timestamp_fractions&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;<br></span><span style="COLOR: #008080">36</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">37</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(SOCKET_ERROR</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">sendto(soc,(</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">NTP_Send,</span><span style="COLOR: #0000ff">sizeof</span><span style="COLOR: #000000">(NTP_Send),<br></span><span style="COLOR: #008080">38</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,(</span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;sockaddr</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">addrSrv,</span><span style="COLOR: #0000ff">sizeof</span><span style="COLOR: #000000">(addrSrv)))<br></span><span style="COLOR: #008080">39</span><span style="COLOR: #000000"><img id=Codehighlighter1_1074_1113_Open_Image onclick="this.style.display='none'; Codehighlighter1_1074_1113_Open_Text.style.display='none'; Codehighlighter1_1074_1113_Closed_Image.style.display='inline'; Codehighlighter1_1074_1113_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_1074_1113_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1074_1113_Closed_Text.style.display='none'; Codehighlighter1_1074_1113_Open_Image.style.display='inline'; Codehighlighter1_1074_1113_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_1074_1113_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"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_1074_1113_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">40</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;closesocket(soc);<br></span><span style="COLOR: #008080">41</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;FALSE;<br></span><span style="COLOR: #008080">42</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">43</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;sockaddr_Size&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #0000ff">sizeof</span><span style="COLOR: #000000">(addrSrv);<br></span><span style="COLOR: #008080">44</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(SOCKET_ERROR</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">recvfrom(soc,(</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">NTP_Recv,</span><span style="COLOR: #0000ff">sizeof</span><span style="COLOR: #000000">(NTP_Recv),<br></span><span style="COLOR: #008080">45</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,(</span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;sockaddr</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">addrSrv,</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">sockaddr_Size))<br></span><span style="COLOR: #008080">46</span><span style="COLOR: #000000"><img id=Codehighlighter1_1267_1306_Open_Image onclick="this.style.display='none'; Codehighlighter1_1267_1306_Open_Text.style.display='none'; Codehighlighter1_1267_1306_Closed_Image.style.display='inline'; Codehighlighter1_1267_1306_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_1267_1306_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1267_1306_Closed_Text.style.display='none'; Codehighlighter1_1267_1306_Open_Image.style.display='inline'; Codehighlighter1_1267_1306_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_1267_1306_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"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_1267_1306_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">47</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;closesocket(soc);<br></span><span style="COLOR: #008080">48</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;FALSE;<br></span><span style="COLOR: #008080">49</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">50</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;closesocket(soc);<br></span><span style="COLOR: #008080">51</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;WSACleanup();<br></span><span style="COLOR: #008080">52</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">53</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;SYSTEMTIME&nbsp;&nbsp;&nbsp;&nbsp;newtime;<br></span><span style="COLOR: #008080">54</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Splitseconds;<br></span><span style="COLOR: #008080">55</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tm&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">lpLocalTime;<br></span><span style="COLOR: #008080">56</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;time_t&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ntp_time;<br></span><span style="COLOR: #008080">57</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">58</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&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: #008080">59</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;ntp_time&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;ntohl(NTP_Recv.transmit_timestamp_seconds)</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">2208988800</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">60</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;lpLocalTime&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;localtime(</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">ntp_time);<br></span><span style="COLOR: #008080">61</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(lpLocalTime&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;NULL)<br></span><span style="COLOR: #008080">62</span><span style="COLOR: #000000"><img id=Codehighlighter1_1579_1598_Open_Image onclick="this.style.display='none'; Codehighlighter1_1579_1598_Open_Text.style.display='none'; Codehighlighter1_1579_1598_Closed_Image.style.display='inline'; Codehighlighter1_1579_1598_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_1579_1598_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1579_1598_Closed_Text.style.display='none'; Codehighlighter1_1579_1598_Open_Image.style.display='inline'; Codehighlighter1_1579_1598_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_1579_1598_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"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_1579_1598_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">63</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;FALSE;<br></span><span style="COLOR: #008080">64</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">65</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">66</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&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: #008080">67</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;newtime.wYear&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">lpLocalTime</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">tm_year</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">1900</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">68</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;newtime.wMonth&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">lpLocalTime</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">tm_mon</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">69</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;newtime.wDayOfWeek&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">lpLocalTime</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">tm_wday;<br></span><span style="COLOR: #008080">70</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;newtime.wDay&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">lpLocalTime</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">tm_mday;<br></span><span style="COLOR: #008080">71</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;newtime.wHour&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">lpLocalTime</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">tm_hour;<br></span><span style="COLOR: #008080">72</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;newtime.wMinute&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">lpLocalTime</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">tm_min;<br></span><span style="COLOR: #008080">73</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;newtime.wSecond&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">lpLocalTime</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">tm_sec;<br></span><span style="COLOR: #008080">74</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">75</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&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: #008080">76</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;Splitseconds</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000">)ntohl(NTP_Recv.transmit_timestamp_fractions);<br></span><span style="COLOR: #008080">77</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;Splitseconds</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">0.000000000200</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;Splitseconds;<br></span><span style="COLOR: #008080">78</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;Splitseconds</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">1000.0</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;Splitseconds;<br></span><span style="COLOR: #008080">79</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;newtime.wMilliseconds&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;(unsigned&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">short</span><span style="COLOR: #000000">)Splitseconds;<br></span><span style="COLOR: #008080">80</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">81</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&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: #008080">82</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;SetLocalTime(</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">newtime);<br></span><span style="COLOR: #008080">83</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;TRUE;<br></span><span style="COLOR: #008080">84</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span></div>
<img src ="http://www.cppblog.com/AutomateProgram/aggbug/118031.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/AutomateProgram/" target="_blank">漂漂</a> 2010-06-16 18:09 <a href="http://www.cppblog.com/AutomateProgram/archive/2010/06/16/118031.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用CInternetSession和CHttpFile读取网页内容</title><link>http://www.cppblog.com/AutomateProgram/archive/2010/06/16/118030.html</link><dc:creator>漂漂</dc:creator><author>漂漂</author><pubDate>Wed, 16 Jun 2010 10:03:00 GMT</pubDate><guid>http://www.cppblog.com/AutomateProgram/archive/2010/06/16/118030.html</guid><wfw:comment>http://www.cppblog.com/AutomateProgram/comments/118030.html</wfw:comment><comments>http://www.cppblog.com/AutomateProgram/archive/2010/06/16/118030.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/AutomateProgram/comments/commentRss/118030.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/AutomateProgram/services/trackbacks/118030.html</trackback:ping><description><![CDATA[参考网址：<a href="http://www.398588.com/Article/T9/78.aspx">http://www.398588.com/Article/T9/78.aspx</a><br>读取网页的内容可以类比本地的文件一下，代码如下：<br>#include &nbsp; &lt;afxinet.h&gt; <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 src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">CString&nbsp;url;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;GetDlgItemText(IDC_EDIT1,url);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;CInternetSession&nbsp;Sess;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;CHttpFile</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;cFile&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(CHttpFile</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">)Sess.OpenURL(url,</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,INTERNET_FLAG_TRANSFER_ASCII</span><span style="COLOR: #000000">||</span><span style="COLOR: #000000">INTERNET_FLAG_RELOAD,NULL,</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;dwStatusCode;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;cFile</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">QueryInfoStatusCode(dwStatusCode);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(dwStatusCode&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;HTTP_STATUS_OK)<br><img id=Codehighlighter1_304_726_Open_Image onclick="this.style.display='none'; Codehighlighter1_304_726_Open_Text.style.display='none'; Codehighlighter1_304_726_Closed_Image.style.display='inline'; Codehighlighter1_304_726_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_304_726_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_304_726_Closed_Text.style.display='none'; Codehighlighter1_304_726_Open_Image.style.display='inline'; Codehighlighter1_304_726_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_304_726_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"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_304_726_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;CString&nbsp;szData,szAllData;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">(cFile</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">ReadString(szData))<br><img id=Codehighlighter1_389_467_Open_Image onclick="this.style.display='none'; Codehighlighter1_389_467_Open_Text.style.display='none'; Codehighlighter1_389_467_Closed_Image.style.display='inline'; Codehighlighter1_389_467_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_389_467_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_389_467_Closed_Text.style.display='none'; Codehighlighter1_389_467_Open_Image.style.display='inline'; Codehighlighter1_389_467_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_389_467_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"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_389_467_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;&nbsp;&nbsp;&nbsp;szAllData&nbsp;</span><span style="COLOR: #000000">+=</span><span style="COLOR: #000000">&nbsp;szData;<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;szAllData&nbsp;</span><span style="COLOR: #000000">+=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">\r\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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;&nbsp;&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;cFile</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">Close();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Sess.Close();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CString&nbsp;name&nbsp;</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;name&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">sd.htm</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;CFile&nbsp;file(name,&nbsp;CFile::modeCreate&nbsp;</span><span style="COLOR: #000000">|</span><span style="COLOR: #000000">&nbsp;CFile::modeWrite);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;file.Write(szAllData,szAllData.GetLength());<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;file.Close();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"><br><img id=Codehighlighter1_741_779_Open_Image onclick="this.style.display='none'; Codehighlighter1_741_779_Open_Text.style.display='none'; Codehighlighter1_741_779_Closed_Image.style.display='inline'; Codehighlighter1_741_779_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_741_779_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_741_779_Closed_Text.style.display='none'; Codehighlighter1_741_779_Open_Image.style.display='inline'; Codehighlighter1_741_779_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_741_779_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"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_741_779_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;MessageBox(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">请求失败。。。。</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></div>
<br>用CInternetSession打开url得到一个CHttpFile，用ReadString读取CHttpFile中的内容。<br>
<img src ="http://www.cppblog.com/AutomateProgram/aggbug/118030.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/AutomateProgram/" target="_blank">漂漂</a> 2010-06-16 18:03 <a href="http://www.cppblog.com/AutomateProgram/archive/2010/06/16/118030.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>vc中几个源代码网站</title><link>http://www.cppblog.com/AutomateProgram/archive/2010/06/04/117176.html</link><dc:creator>漂漂</dc:creator><author>漂漂</author><pubDate>Fri, 04 Jun 2010 09:34:00 GMT</pubDate><guid>http://www.cppblog.com/AutomateProgram/archive/2010/06/04/117176.html</guid><wfw:comment>http://www.cppblog.com/AutomateProgram/comments/117176.html</wfw:comment><comments>http://www.cppblog.com/AutomateProgram/archive/2010/06/04/117176.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/AutomateProgram/comments/commentRss/117176.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/AutomateProgram/services/trackbacks/117176.html</trackback:ping><description><![CDATA[源码爱好者：<a href="http://www.codefans.net/">http://www.codefans.net/</a><br>源码网：<a href="http://www.51kyuan.com/">http://www.51kyuan.com/</a> <br>vc驿站：<a href="http://www.cctry.com/">http://www.cctry.com/</a> <br>hellocpp中国的codeproject：<a href="http://www.hellocpp.net/">http://www.hellocpp.net/</a> <br>程序员小辉：<a href="http://www.xiaohui.com/dev/">http://www.xiaohui.com/dev/</a> <br>源码搜搜：<a href="http://www.codesoso.com/default.aspx">http://www.codesoso.com/default.aspx</a> <br>中国黑客：<a href="http://www.hackchina.com/">http://www.hackchina.com/</a>
<img src ="http://www.cppblog.com/AutomateProgram/aggbug/117176.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/AutomateProgram/" target="_blank">漂漂</a> 2010-06-04 17:34 <a href="http://www.cppblog.com/AutomateProgram/archive/2010/06/04/117176.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>P2P原理的解释与实现</title><link>http://www.cppblog.com/AutomateProgram/archive/2010/03/29/110785.html</link><dc:creator>漂漂</dc:creator><author>漂漂</author><pubDate>Mon, 29 Mar 2010 01:05:00 GMT</pubDate><guid>http://www.cppblog.com/AutomateProgram/archive/2010/03/29/110785.html</guid><wfw:comment>http://www.cppblog.com/AutomateProgram/comments/110785.html</wfw:comment><comments>http://www.cppblog.com/AutomateProgram/archive/2010/03/29/110785.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/AutomateProgram/comments/commentRss/110785.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/AutomateProgram/services/trackbacks/110785.html</trackback:ping><description><![CDATA[原文地址：<a href="http://www.cppblog.com/converse/archive/2006/09/02/11969.html">http://www.cppblog.com/converse/archive/2006/09/02/11969.html</a><div><span  style="font-family: Arial; font-size: 14px; line-height: 21px; ">关于采用UDP协议进行打洞以进行P2P会话的原理,我本来想写一篇文章作说明,但是现在已经有一篇文章把原理性的东西解释清楚了,我在这里不再作这部分的重复,可以参见这里:<br>P2P 之 UDP穿透NAT的原理与实现（附源代码）--<a href="http://www.cnpaf.net/Class/hack/0512182034513804825.htm" style="color: rgb(29, 88, 209); text-decoration: none; ">http://www.cnpaf.net/Class/hack/0512182034513804825.htm</a><br><br>下面解释一下上面的文章中没有提及或者说我觉得比较欠缺的地方.<br>私有地址/端口和公有地址/端口:我们知道,现在大部分网络采用的都是NAPT(Network Address/Port Translator)了,这个东东的作用是一个对外的对话在经过NAT之后IP地址和端口号都会被改写,在这里把一次会话中客户自己认为在使用的IP地址和端口号成为私有地址/端口,而把经过NAPT之后被改写的IP地址和端口号称为公有地址/端口.或者可以这么理解,私有地址/端口是你家里人对你的昵称而公有地址/端口则是你真正对外公开的名字.如何获得用户的私用地址/端口号,这个很简单了,而要得到公有地址/端口号就要在连接上另一台机器之后由那台机器看到的IP地址和端口号来表示.<br><br>如果明白了上面的东西,下面进入我们的代码,在这里解释一下关键部分的实现:<br><br>客户端首先得到自己的私有地址/终端,然后向server端发送登陆请求,server端在得到这个请求之后就可以知道这个client端的公有地址/终端,server会为每一个登陆的client保存它们的私有地址/端口和公有地址/端口.<br><br>OK,下面开始关键的打洞流程.假设client A要向client B对话,但是A不知道B的地址,即使知道根据NAT的原理这个对话在第一次会被拒绝,因为client B的NAT认为这是一个从没有过的外部发来的请求.这个时候,A如果发现自己没有保存B的地址,或者说发送给B的会话请求失败了,它会要求server端让B向A打一个洞,这个B-&gt;A的会话意义在于它使NAT B认为A的地址/端口是可以通过的地址/端口,这样A再向B发送对话的时候就不会再被NAT B拒绝了.打一个比方来说明打洞的过程,A想来B家做客,但是遭到了B的管家NAT B的拒绝,理由是:我从来没有听我家B提过你的名字,这时A找到了A,B都认识的朋友server,要求server给B报一个信,让B去跟管家说A是我的朋友,于是,B跟管家NAT B说,A是我认识的朋友,这样A的访问请求就不会再被管家NAT B所拒绝了.简而言之,UDP打洞就是一个通过server保存下来的地址使得彼此之间能够直接通信的过程,server只管帮助建立连接,在建立间接之后就不再介入了.<br><br>好了,原理性的东西解释到这里,附件中有一个完整的P2P演示程序,命令行模式下,包括server端和client端,在运行的时候首先启动server端,然后打开几个client端分别登陆,之后彼此之间就可以相互通信了.程序在本机上测试通过,也就是测试的环境server和client都是一台机器,还没有在不同的机器上测试过,不知道会不会有问题:)<br>下载地址:<br><a href="http://www.cppblog.com/Files/converse/P2PDemo.rar" style="color: rgb(29, 88, 209); text-decoration: none; ">http://www.cppblog.com/Files/converse/P2PDemo.rar</a><br>参考资料:<br>1)P2P 之 UDP穿透NAT的原理与实现（附源代码）-http://www.cnpaf.net/Class/hack/0512182034513804825.htm<br>2)王艳平&lt;&lt;Windows网络与通信程序设计&gt;&gt;</span></div><img src ="http://www.cppblog.com/AutomateProgram/aggbug/110785.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/AutomateProgram/" target="_blank">漂漂</a> 2010-03-29 09:05 <a href="http://www.cppblog.com/AutomateProgram/archive/2010/03/29/110785.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++ TCP htons INADDR_ANY SOCKADDR_IN结构</title><link>http://www.cppblog.com/AutomateProgram/archive/2010/03/28/110720.html</link><dc:creator>漂漂</dc:creator><author>漂漂</author><pubDate>Sun, 28 Mar 2010 02:44:00 GMT</pubDate><guid>http://www.cppblog.com/AutomateProgram/archive/2010/03/28/110720.html</guid><wfw:comment>http://www.cppblog.com/AutomateProgram/comments/110720.html</wfw:comment><comments>http://www.cppblog.com/AutomateProgram/archive/2010/03/28/110720.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/AutomateProgram/comments/commentRss/110720.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/AutomateProgram/services/trackbacks/110720.html</trackback:ping><description><![CDATA[原文地址：<div><span  style="color: rgb(51, 51, 51); font-family: Arial, Helvetica, sans-serif; font-size: 14px; line-height: 22px; "><p style="line-height: 22px; margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">1 htons</p><p style="line-height: 22px; margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">htons(1986)得到的结果是49671<br style="line-height: 22px; ">如何得到49671这个结果呢?<br style="line-height: 22px; ">1986转换成16进制是07C2<br style="line-height: 22px; ">主机顺序转换成网络顺序之后是C207<br style="line-height: 22px; ">C207转换为十进制是49671<br style="line-height: 22px; ">例子:0x12 34 56 78经过htons是0x78 56 34 12<br style="line-height: 22px; ">在给SOCKADDR_IN结构中的端口号直接赋值,客户端和服务端全部都直接赋值<br style="line-height: 22px; ">SOCKADDR_IN addrSrv;&nbsp;&nbsp;&nbsp;<br style="line-height: 22px; ">addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);<br style="line-height: 22px; ">addrSrv.sin_family = AF_INET;<br style="line-height: 22px; ">addrSrv.sin_port = 1986;<br style="line-height: 22px; ">这样也可以通讯,但绑定的端口号已经不是1986,而是49671</p><p style="line-height: 22px; margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">2 INADDR_ANY<br style="line-height: 22px; ">#define INADDR_ANY&nbsp; (u_long)0x00000000<br style="line-height: 22px; ">INADDR_ANY表示 所有的IP,如果自己的主机有多个IP,在给SOCKADDR_IN 结构的IP地址赋值时就用INADDR_ANY.<br style="line-height: 22px; ">如果只有一个IP且是固定的,也可以不用INADDR_ANY,使用如下语句<br style="line-height: 22px; ">addrSrv.sin_addr.S_un.S_addr = inet_addr("221.217.218.111");<br style="line-height: 22px; ">inet_addr函数是将一个点分十进制的IP转换成无符号长整型</p><p style="line-height: 22px; margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">3 SOCKADDR_IN结构<br style="line-height: 22px; ">struct sockaddr_in<br style="line-height: 22px; ">&nbsp;{<br style="line-height: 22px; ">&nbsp;&nbsp;&nbsp; short&nbsp;&nbsp; sin_family;<br style="line-height: 22px; ">&nbsp;&nbsp;&nbsp; u_short sin_port;<br style="line-height: 22px; ">&nbsp;&nbsp;&nbsp; struct&nbsp; in_addr sin_addr;<br style="line-height: 22px; ">&nbsp;&nbsp;&nbsp; char&nbsp;&nbsp;&nbsp; sin_zero[8];<br style="line-height: 22px; ">};<br style="line-height: 22px; ">sin_family:网络类型<br style="line-height: 22px; ">sin_port:网络端口号<br style="line-height: 22px; ">in_addr:IP地址<br style="line-height: 22px; ">sin_zero:保证结构的大小<br style="line-height: 22px; ">in_addr的结构为<br style="line-height: 22px; ">struct in_addr {<br style="line-height: 22px; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; union {<br style="line-height: 22px; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; struct { u_char s_b1,s_b2,s_b3,s_b4; } S_un_b;<br style="line-height: 22px; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; struct { u_short s_w1,s_w2; } S_un_w;<br style="line-height: 22px; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; u_long S_addr;<br style="line-height: 22px; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } S_un;</p><p style="line-height: 22px; margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">对于IP地址为221.217.218.111,addrSrv.sin_addr.S_un的赋值方法如下<br style="line-height: 22px; ">第一种:<br style="line-height: 22px; ">addrSrv.sin_addr.S_un.S_addr =111&lt;&lt;24|218&lt;&lt;16|217&lt;&lt;8|221;<br style="line-height: 22px; ">第二种:<br style="line-height: 22px; ">addrSrv.sin_addr.S_un.S_addr =htonl(221&lt;&lt;24|217&lt;&lt;16|218&lt;&lt;8|111);<br style="line-height: 22px; ">第三种:<br style="line-height: 22px; ">addrSrv.sin_addr.S_un.S_addr = inet_addr("221.217.218.111");<br style="line-height: 22px; ">第四种:<br style="line-height: 22px; ">addrSrv.sin_addr .S_un.S_un_w.s_w1 =217&lt;&lt;8|221;<br style="line-height: 22px; ">addrSrv.sin_addr .S_un.S_un_w.s_w2 =111&lt;&lt;8|218;<br style="line-height: 22px; ">第五种:<br style="line-height: 22px; ">addrSrv.sin_addr .S_un.S_un_b.s_b1=221;<br style="line-height: 22px; ">addrSrv.sin_addr .S_un.S_un_b.s_b2=217;<br style="line-height: 22px; ">addrSrv.sin_addr .S_un.S_un_b.s_b3=218;<br style="line-height: 22px; ">addrSrv.sin_addr .S_un.S_un_b.s_b4=111;</p></span></div><img src ="http://www.cppblog.com/AutomateProgram/aggbug/110720.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/AutomateProgram/" target="_blank">漂漂</a> 2010-03-28 10:44 <a href="http://www.cppblog.com/AutomateProgram/archive/2010/03/28/110720.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>直接用socket完成HTTP下载（转）</title><link>http://www.cppblog.com/AutomateProgram/archive/2010/03/27/110666.html</link><dc:creator>漂漂</dc:creator><author>漂漂</author><pubDate>Sat, 27 Mar 2010 04:39:00 GMT</pubDate><guid>http://www.cppblog.com/AutomateProgram/archive/2010/03/27/110666.html</guid><wfw:comment>http://www.cppblog.com/AutomateProgram/comments/110666.html</wfw:comment><comments>http://www.cppblog.com/AutomateProgram/archive/2010/03/27/110666.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/AutomateProgram/comments/commentRss/110666.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/AutomateProgram/services/trackbacks/110666.html</trackback:ping><description><![CDATA[原文地址：<a href="http://www.cnoffice.info/Program/VC/VCnet/Program_55135.html">http://www.cnoffice.info/Program/VC/VCnet/Program_55135.html</a>
<img src ="http://www.cppblog.com/AutomateProgram/aggbug/110666.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/AutomateProgram/" target="_blank">漂漂</a> 2010-03-27 12:39 <a href="http://www.cppblog.com/AutomateProgram/archive/2010/03/27/110666.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>http 下载</title><link>http://www.cppblog.com/AutomateProgram/archive/2010/03/27/110662.html</link><dc:creator>漂漂</dc:creator><author>漂漂</author><pubDate>Sat, 27 Mar 2010 03:01:00 GMT</pubDate><guid>http://www.cppblog.com/AutomateProgram/archive/2010/03/27/110662.html</guid><wfw:comment>http://www.cppblog.com/AutomateProgram/comments/110662.html</wfw:comment><comments>http://www.cppblog.com/AutomateProgram/archive/2010/03/27/110662.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/AutomateProgram/comments/commentRss/110662.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/AutomateProgram/services/trackbacks/110662.html</trackback:ping><description><![CDATA[<p>visual c++网络通讯编程实用案例精选中<br><br>&nbsp;DWORD dwFlags;<br>&nbsp;InternetGetConnectedState(&amp;dwFlags, 0);<br>&nbsp;CHAR strAgent[64];<br>&nbsp;sprintf(strAgent, "Agent%ld", timeGetTime());<br>&nbsp;HINTERNET hOpen;<br>&nbsp;if(!(dwFlags &amp; INTERNET_CONNECTION_PROXY))<br>&nbsp;&nbsp;hOpen = InternetOpenA(strAgent, INTERNET_OPEN_TYPE_PRECONFIG_WITH_NO_AUTOPROXY, NULL, NULL, 0);<br>&nbsp;else<br>&nbsp;&nbsp;hOpen = InternetOpenA(strAgent, INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);<br>&nbsp;if(!hOpen)<br>&nbsp;{<br>&nbsp;&nbsp;AfxMessageBox("Internet连接错误!");<br>&nbsp;&nbsp;return -1;<br>&nbsp;}</p>
<p>&nbsp;DWORD dwSize;<br>&nbsp;CHAR&nbsp;&nbsp; szHead[] = "Accept: */*\r\n\r\n";<br>&nbsp;VOID* szTemp[16384];<br>&nbsp;HINTERNET&nbsp; hConnect;<br>&nbsp;CFile file;</p>
<p>&nbsp;if ( !(hConnect = InternetOpenUrlA ( hOpen, szUrl, szHead,<br>&nbsp;&nbsp; lstrlenA (szHead), INTERNET_FLAG_DONT_CACHE | INTERNET_FLAG_PRAGMA_NOCACHE | INTERNET_FLAG_RELOAD, 0)))<br>&nbsp;{<br>&nbsp;&nbsp;&nbsp; AfxMessageBox("不能打开该URL!");<br>&nbsp;&nbsp;&nbsp; return -1;<br>&nbsp;}</p>
<p>&nbsp;if&nbsp; (file.Open(szFileName,CFile::modeWrite|CFile::modeCreate)==FALSE )<br>&nbsp;{<br>&nbsp;&nbsp;&nbsp; AfxMessageBox("不能打开本地的文件!");<br>&nbsp;&nbsp; return -1;<br>&nbsp;}</p>
<p>&nbsp;DWORD dwByteToRead = 0;<br>&nbsp;DWORD dwSizeOfRq = 4;<br>&nbsp;DWORD dwBytes = 0;</p>
<p>&nbsp;&nbsp;&nbsp; if (!HttpQueryInfo(hConnect, HTTP_QUERY_CONTENT_LENGTH | HTTP_QUERY_FLAG_NUMBER, <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (LPVOID)&amp;dwByteToRead, &amp;dwSizeOfRq, NULL))<br>&nbsp;{<br>&nbsp;&nbsp;dwByteToRead = 0;<br>&nbsp;}</p>
<p>&nbsp;DWORD start;<br>&nbsp;DWORD end;<br>&nbsp;DWORD time;<br>&nbsp;CString tempstring;<br>&nbsp;time = 10;<br>&nbsp;start = timeGetTime();<br>&nbsp;do<br>&nbsp;{<br>&nbsp;&nbsp;if (!InternetReadFile (hConnect, szTemp, 16384,&nbsp; &amp;dwSize))<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;AfxMessageBox("读文件出错!");<br>&nbsp;&nbsp;&nbsp;file.Close();<br>&nbsp;&nbsp;&nbsp;return -1;<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;if (dwSize==0)<br>&nbsp;&nbsp;&nbsp;break;<br>&nbsp;&nbsp;else<br>&nbsp;&nbsp;&nbsp;file.Write(szTemp,dwSize);<br>&nbsp;&nbsp;dwBytes+=dwSize;<br>&nbsp;&nbsp;if(dwByteToRead)<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;tempstring.Format("%d%%",(dwBytes*100)/dwByteToRead);<br>&nbsp;&nbsp;&nbsp;SetDlgItemText(IDC_PERCENT_TEXT,tempstring);<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;FLOAT fSpeed = 0;<br>&nbsp;&nbsp;fSpeed = (float)dwBytes;<br>&nbsp;&nbsp;fSpeed /= ((float)time)/1000.0f;<br>&nbsp;&nbsp;fSpeed /= 1024.0f;<br>&nbsp;&nbsp;tempstring.Format("%dKB/s",fSpeed);<br>&nbsp;&nbsp;SetDlgItemText(IDC_SPEED_TEXT,tempstring);<br>&nbsp;&nbsp;end = timeGetTime();<br>&nbsp;&nbsp;time = end - start;<br>&nbsp;&nbsp;if(time == 0)<br>&nbsp;&nbsp;&nbsp;time = 10;<br>&nbsp;}while (TRUE);</p>
<p>&nbsp;file.Close();<br>&nbsp;InternetCloseHandle(hOpen);</p>
<img src ="http://www.cppblog.com/AutomateProgram/aggbug/110662.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/AutomateProgram/" target="_blank">漂漂</a> 2010-03-27 11:01 <a href="http://www.cppblog.com/AutomateProgram/archive/2010/03/27/110662.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>WinINet操作流程</title><link>http://www.cppblog.com/AutomateProgram/archive/2010/03/26/110569.html</link><dc:creator>漂漂</dc:creator><author>漂漂</author><pubDate>Fri, 26 Mar 2010 01:22:00 GMT</pubDate><guid>http://www.cppblog.com/AutomateProgram/archive/2010/03/26/110569.html</guid><wfw:comment>http://www.cppblog.com/AutomateProgram/comments/110569.html</wfw:comment><comments>http://www.cppblog.com/AutomateProgram/archive/2010/03/26/110569.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/AutomateProgram/comments/commentRss/110569.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/AutomateProgram/services/trackbacks/110569.html</trackback:ping><description><![CDATA[<p>原文地址：<a href="http://blog.csdn.net/li_guotao/archive/2009/03/04/3956067.aspx">http://blog.csdn.net/li_guotao/archive/2009/03/04/3956067.aspx</a><br>一 WinINet是干什么的？<br>二 如果完成一个基本的WinINet操作流程<br>三 如何异步完成，异步操作的好处。<br>四 unicode以及mutilbyte<br>五 代码样例</p>
<p>一 WinINet是微软开发的一个库，可以完成http ftp客户端的工作。让程序员从复杂的协议中节省大量体力。</p>
<p>二 我会用了http, ftp类似。用WinINet完成一个http下载需要以下步骤 。 下面这个是同步操作（也就是一步步操作，每个函数执行完才会返回一个结果的意思）</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp; InternetOpen&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Initializes an application's use of the WinINet functions.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 需要的话 InternetSetOption 设置代理服务器地址以及端口。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; http：&nbsp;&nbsp;&nbsp; ip:port 或者 http=http://ip:port<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; socks：SOCKS=ip:port<br>&nbsp;&nbsp;&nbsp;&nbsp; 2&nbsp;&nbsp; InternetConnect&nbsp;&nbsp;&nbsp; 关联目标地址或者域名以及服务ip</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 3&nbsp;&nbsp; HttpOpenRequest&nbsp;&nbsp; 关联要下载的内容名字<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; InternetSetOption 设置用户名密码</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 4&nbsp;&nbsp; HttpSendRequest&nbsp;&nbsp;&nbsp;&nbsp; 这步就是用HttpOpenRequest 的返回值（已经关联了上面的所有信息）发送出去，第一次用了网络。向目标服务器或者代理服务器。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 5&nbsp;&nbsp; HttpQueryInfo<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 该函数查询返回值，不参与网络操作。可以查询服务器的返回信息，比如目标文件的大小，该文件是否存在，代理服务返回了要求用户名，密码等等（这几个最常用），还有很多信息。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 6&nbsp;&nbsp; InternetReadFile<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 很普通的读函数，就是下载文件。不知道是否和底层网络同步，底层会不会提前下载呢？</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 7&nbsp;&nbsp; InternetCloseHandle 释放资源</p>
<p>三&nbsp;&nbsp;&nbsp; 异步操作，比较复杂的。&nbsp;&nbsp; 为什么需要异步操作呢？ 因为涉及到网络操作，某些函数在操作中可能需要时间，如果一直不返回（比如1秒）时，这时主线程要结束程序，岂不就出现意想不到的结果了，但是如果每个函数都能够瞬间返回，然后通过WaitForMultipleObjects或者WaitForSingleObject等待结果的出现（此时就不会操作那个消耗1秒的函数了，而这个1秒函数正是要用到系统资源HINTERNET的）。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 异步操作的目的上如，原理呢？ 其实原理就是注册一个函数，在这里叫InternetStatusCallback，因为微软写得底层代码要用到，所以必须格式统一。一旦有结果来了就通过事件通知我们，WaitForSingleObject函数就可以走了。比如等到了HINTERNET创建或者命令发送成功等结果。然后我们就可以第一时间安全的使用了。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; API 函数如果名字最后可以带EX，那么带ex的就是异步操作的。</p>
<p>四 一定要注意，凡是有unicode和mutilbyte函数的一定要统一，最好都用mutilbyte的。</p>
<p><br>五： 代码如下：<br>// crt_assert.c<br>// compile with: /c<br>#include &lt;stdio.h&gt;<br>#include &lt;assert.h&gt;<br>#include &lt;stdlib.h&gt;</p>
<p><br>#include &lt;iostream&gt;</p>
<p>#include "winsock2.h"<br>#include &lt;string&gt;<br>#include &lt;Wininet.h&gt;<br>#include &lt;windows.h&gt;<br>#include &lt;fstream&gt;　//要使用文件输入输出流必须的头文件<br>using namespace std;<br>#define __HTTP_VERB_GET&nbsp;&nbsp;&nbsp; "GET"<br>#define __HTTP_VERB_POST "POST"<br>#define __HTTP_ACCEPT_TYPE "*/*"<br>#define __HTTP_ACCEPT "Accept: */*\r\n"<br>#define __SIZE_HTTP_BUFFER&nbsp;&nbsp;&nbsp; 100000<br>#define __SIZE_HTTP_RESPONSE_BUFFER&nbsp;&nbsp;&nbsp; 100000<br>#define __SIZE_HTTP_HEAD_LINE&nbsp;&nbsp;&nbsp; 2048</p>
<p>void CALLBACK InternetStatusCallback(</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HINTERNET hInternet,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DWORD dwContext,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DWORD dwInternetStatus,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LPVOID lpvStatusInformation,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DWORD dwStatusInformationLength);<br>HANDLE hEvent[3];</p>
<p>HINTERNET hFile;<br>HINTERNET hNet;<br>HINTERNET hSession,hConnect,hRequest;<br>int WaitExitEvent()<br>{<br>&nbsp;&nbsp;&nbsp; //return 1;<br>&nbsp;&nbsp;&nbsp; DWORD dwRet = ::WaitForMultipleObjects(3, hEvent, FALSE, 30000);//INFINITE);<br>&nbsp;&nbsp;&nbsp; int x=-1;<br>&nbsp;&nbsp;&nbsp; switch (dwRet)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //句柄被创建事件或者读数据请求成功完成事件<br>&nbsp;&nbsp;&nbsp; case WAIT_OBJECT_0:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; x=0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout&lt;&lt;"WAIT_OBJECT_0"&lt;&lt;endl;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //句柄被关闭事件<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp; case WAIT_OBJECT_0+1:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; x=1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout&lt;&lt;"WAIT_OBJECT_1"&lt;&lt;endl;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //用户要求终止子线程事件或者发生错误事件<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp; case WAIT_OBJECT_0+2:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; x=2;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout&lt;&lt;"WAIT_OBJECT_2"&lt;&lt;endl;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp; default:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout&lt;&lt;"WaitForMultipleObjects time out"&lt;&lt;endl;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return -1;</p>
<p>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; return x;<br>}</p>
<p>// 支持代理设置， 是否异步设置； 采用事件驱动<br>void WinINet3(bool setProxy, bool ASYNC)<br>{<br>&nbsp;&nbsp;&nbsp; hSession=NULL;<br>&nbsp;&nbsp;&nbsp; hConnect=NULL;<br>&nbsp;&nbsp;&nbsp; hRequest=NULL;<br>&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; 3; i++) <br>&nbsp;&nbsp;&nbsp; { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hEvent[i] = CreateEvent( <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NULL,&nbsp;&nbsp; // default security attributes<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FALSE, // auto-reset event object<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FALSE, // initial state is nonsignaled<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NULL); // unnamed object</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (hEvent[i] == NULL) <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("CreateEvent error: %d\n", GetLastError() ); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ExitProcess(0); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br>&nbsp;&nbsp;&nbsp; } <br>&nbsp;&nbsp;&nbsp; char *url = "<a href="http://down.360safe.com/setup.exe">http://down.360safe.com/setup.exe</a>";<br>&nbsp;&nbsp;&nbsp; char *pip = "down.360safe.com";<br>&nbsp;&nbsp;&nbsp; char *paim = "/setup.exe";</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp; //&nbsp;&nbsp; step 1<br>&nbsp;&nbsp;&nbsp; if(ASYNC)&nbsp;&nbsp;&nbsp; cout&lt;&lt;"异步模式"&lt;&lt;endl;<br>&nbsp;&nbsp; // setProxy =false;<br>&nbsp;&nbsp;&nbsp; if(setProxy)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout&lt;&lt;"代理模式"&lt;&lt;endl;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(ASYNC)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hSession = InternetOpen("name",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INTERNET_OPEN_TYPE_DIRECT,//|INTERNET_OPEN_TYPE_PROXY,// INTERNET_OPEN_TYPE_PROXY,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NULL,NULL,INTERNET_FLAG_ASYNC); // 异步<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hSession = InternetOpen("name",INTERNET_OPEN_TYPE_PROXY,NULL,NULL,0); // 同步<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(ASYNC)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hSession = InternetOpen("name",INTERNET_OPEN_TYPE_PRECONFIG,NULL,NULL,INTERNET_FLAG_ASYNC); // 异步<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hSession = InternetOpen("name",INTERNET_OPEN_TYPE_PRECONFIG,NULL,NULL,0); // 同步<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; if(!hSession){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DWORD er = ::GetLastError();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout&lt;&lt;"InternetOpen error"&lt;&lt;endl;//, "Err", MB_OK);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; if(ASYNC)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //Sleep(500);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INTERNET_STATUS_CALLBACK res = ::InternetSetStatusCallback(hSession,InternetStatusCallback);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(res == INTERNET_INVALID_STATUS_CALLBACK)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout&lt;&lt;"InternetSetStatusCallback failed, so return "&lt;&lt;endl;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return ;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout&lt;&lt;"InternetSetStatusCallback succeed, so go on "&lt;&lt;endl;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //Sleep(500);<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; char&nbsp;&nbsp; strProxyList[MAX_PATH],&nbsp;&nbsp; strUsername[64],&nbsp;&nbsp; strPassword[64];<br>&nbsp;&nbsp;&nbsp; strcpy(strProxyList,&nbsp;&nbsp; "SOCKS=58.56.87.2:1080"); //&nbsp;&nbsp; 写上socks怎么就无效了呢？？？SOCKS5=172.18.132.27:1080<br>&nbsp;&nbsp;&nbsp; strcpy(strUsername,&nbsp;&nbsp; "user01"); <br>&nbsp;&nbsp;&nbsp; strcpy(strPassword,&nbsp;&nbsp; "baidu"); <br>&nbsp;&nbsp;&nbsp; INTERNET_PROXY_INFO proxy;<br>&nbsp;&nbsp;&nbsp; proxy.dwAccessType = INTERNET_OPEN_TYPE_PROXY;<br>&nbsp;&nbsp;&nbsp; proxy.lpszProxy&nbsp;&nbsp;&nbsp; = strProxyList;<br>&nbsp;&nbsp;&nbsp; proxy.lpszProxyBypass = NULL;<br>&nbsp;&nbsp;&nbsp; if( setProxy &amp;&amp;!InternetSetOption(hSession,INTERNET_OPTION_PROXY ,&amp;proxy,sizeof(INTERNET_PROXY_INFO)))<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout&lt;&lt;"InternetSetOption failed"&lt;&lt;endl;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return ;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; // step 2<br>&nbsp;&nbsp;&nbsp; //如果明确知道需要认证，第4，5个参数可以输入用户名，密码"administrator","password"<br>&nbsp;&nbsp;&nbsp; //第2，3个参数为目标主机IP、端口号(不是代理服务器的参数)<br>&nbsp;&nbsp;&nbsp; hConnect = InternetConnect(hSession,pip,INTERNET_DEFAULT_HTTP_PORT,NULL,NULL,INTERNET_SERVICE_HTTP,INTERNET_FLAG_RELOAD,0);<br>&nbsp;&nbsp;&nbsp; if(!ASYNC &amp;&amp;!hConnect){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout&lt;&lt;"同步，InternetConnect error"&lt;&lt;endl;//, "Err", MB_OK);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; if( ASYNC&amp;&amp; hConnect== NULL)// 异步 需要等待&nbsp;&nbsp; 竟然直接创建好了<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int er = GetLastError();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DWORD dwError = ::GetLastError();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (dwError != ERROR_IO_PENDING) <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout&lt;&lt;"CHttpDownload::OpenInternetConnection| 连接失败" &lt;&lt;endl;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return ;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else //<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout&lt;&lt;"hConnect == NULL, so run WaitExitEvent"&lt;&lt;endl;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WaitExitEvent(); // 等待成功创建 // 这里应该等待&nbsp;&nbsp; 这里应该显示一次呀<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ::ResetEvent(hEvent[0]);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ::ResetEvent(hEvent[1]);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ::ResetEvent(hEvent[2]);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; cout&lt;&lt;"step 2 :InternetConnect secced"&lt;&lt;endl;</p>
<p>&nbsp;&nbsp;&nbsp; // ::InternetSetStatusCallback(hConnect,InternetStatusCallback);<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; // step 3!!!<br>&nbsp;&nbsp;&nbsp; char&nbsp;&nbsp; szHead[] = "Accept: */*\r\n\r\n";<br>&nbsp;&nbsp;&nbsp; char **p = new char*[2];*p = szHead;*(p+1) = NULL;</p>
<p>&nbsp;&nbsp;&nbsp; //hRequest = HttpOpenRequest(hConnect,"GET","download/BaiduHi_1.0_Beta2.exe",NULL,NULL,/*(const char **)p*/NULL,0/*INTERNET_FLAG_NO_COOKIES|INTERNET_FLAG_RELOAD*/,0); // no request;<br>&nbsp;&nbsp;&nbsp; CONST TCHAR *szAcceptType=__HTTP_ACCEPT_TYPE;<br>&nbsp;&nbsp;&nbsp; hRequest = ::HttpOpenRequest(hConnect,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "GET",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; paim,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HTTP_VERSION,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;szAcceptType,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INTERNET_FLAG_RELOAD|INTERNET_FLAG_KEEP_CONNECTION|INTERNET_FLAG_NO_CACHE_WRITE,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0);<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; //::HttpAddRequestHeaders( hRequest, __HTTP_ACCEPT, strlen(__HTTP_ACCEPT), HTTP_ADDREQ_FLAG_REPLACE);<br>&nbsp;&nbsp;&nbsp; /*_hHTTPRequest=::HttpOpenRequest(&nbsp;&nbsp;&nbsp; _hHTTPConnection,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; __HTTP_VERB_GET, // HTTP Verb<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; szURI, // Object Name<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HTTP_VERSION, // Version<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "", // Reference<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;szAcceptType, // Accept Type<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INTERNET_FLAG_KEEP_CONNECTION | INTERNET_FLAG_NO_CACHE_WRITE,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0); // context call-back point<br>&nbsp;&nbsp;&nbsp; */<br>&nbsp;&nbsp;&nbsp; if (!ASYNC&amp;&amp; !hRequest){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout&lt;&lt;"同步，HttpOpenRequest error"&lt;&lt;endl;//, "Err", MB_OK);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; if( ASYNC&amp;&amp; hRequest== NULL)// 异步 需要等待<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int er = GetLastError();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DWORD dwError = ::GetLastError();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (dwError != ERROR_IO_PENDING) <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout&lt;&lt;"CHttpDownload::OpenInternetConnection| 连接失败" &lt;&lt;endl;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return ;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else //<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout&lt;&lt;"hRequest == NULL, so run WaitExitEvent"&lt;&lt;endl;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WaitExitEvent(); // 等待成功创建<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ::ResetEvent(hEvent[0]);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ::ResetEvent(hEvent[1]);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ::ResetEvent(hEvent[2]);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; //Sleep(10000);<br>&nbsp;&nbsp;&nbsp; cout &lt;&lt; "step 3 : HttpOpenRequest success"&lt;&lt;endl;<br>&nbsp;&nbsp;&nbsp; //::InternetSetStatusCallback(hRequest,InternetStatusCallback);<br>&nbsp;&nbsp;&nbsp; //////////////////////////////////////////////<br>&nbsp;&nbsp;&nbsp; if (setProxy )<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // InternetSetOption 不要异步等待<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( !InternetSetOption(hRequest,INTERNET_OPTION_PROXY_USERNAME ,strUsername,strlen(strUsername)+1))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout&lt;&lt;"InternetSetOption Username failed"&lt;&lt;endl;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return ;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( !InternetSetOption(hRequest,INTERNET_OPTION_PROXY_PASSWORD ,strPassword,strlen(strPassword)+1))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout&lt;&lt;"InternetSetOption Password failed"&lt;&lt;endl;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return ;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; // step 4<br>&nbsp;&nbsp;&nbsp; //HttpSendRequest(hRequest,NULL,0,NULL,0);<br>&nbsp;&nbsp;&nbsp; //Sleep(3000);<br>&nbsp;&nbsp;&nbsp; ::ResetEvent(hEvent[0]);<br>&nbsp;&nbsp;&nbsp; ::ResetEvent(hEvent[1]);<br>&nbsp;&nbsp;&nbsp; ::ResetEvent(hEvent[2]);<br>&nbsp;&nbsp;&nbsp; if(!::HttpSendRequest(hRequest,NULL,0,NULL,0)) // 为什么失败？？？<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //Sleep(3000);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(!ASYNC)// 同步<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DWORD dwError = ::GetLastError();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout&lt;&lt;"同步，HttpSendRequest failed, GetLastError=="&lt;&lt;dwError&lt;&lt;endl;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return ;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Sleep(3000);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DWORD dwError = ::GetLastError();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout&lt;&lt;"dwError =="&lt;&lt;dwError&lt;&lt;endl;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (dwError != ERROR_IO_PENDING) <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout&lt;&lt;"dwError != ERROR_IO_PENDING, so quit,dwError =="&lt;&lt;dwError&lt;&lt;endl;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return ;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else //<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout&lt;&lt;"HttpSendRequest, so run WaitExitEvent"&lt;&lt;endl;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Sleep(3000);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //if(WaitExitEvent()!=2)//; // 等待成功创建 等待是否不对？？？<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout&lt;&lt;"had not recv complete event, so quit"&lt;&lt;endl;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // return ;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; Sleep(3000);<br>&nbsp;&nbsp;&nbsp; cout &lt;&lt; "step 4: HttpSendRequest success!"&lt;&lt;endl;</p>
<p>&nbsp;&nbsp;&nbsp; int bufh[1000];<br>&nbsp;&nbsp;&nbsp; DWORD dwLen,dwIndex;<br>&nbsp;&nbsp;&nbsp; /*if(!::HttpQueryInfo(hRequest, HTTP_QUERY_RAW_HEADERS_CRLF, bufh, &amp;dwLen, &amp;dwIndex))// 这句话？？？<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //return E_FAIL;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return;<br>&nbsp;&nbsp;&nbsp; }<br>*/<br>&nbsp;&nbsp;&nbsp; // 判断状态码；<br>&nbsp;&nbsp;&nbsp; char m_dwStatusCode[90];<br>&nbsp;&nbsp;&nbsp; DWORD dwStatusSize = sizeof(m_dwStatusCode);<br>&nbsp;&nbsp;&nbsp; /*if (FALSE == ::HttpQueryInfo(hRequest,&nbsp;&nbsp; // 查询失效？？<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HTTP_QUERY_STATUS_CODE | HTTP_QUERY_FLAG_NUMBER,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;m_dwStatusCode,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;dwStatusSize,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NULL))&nbsp;&nbsp; //获取返回状态码<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return ;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; //判断状态码是不是 200<br>&nbsp;&nbsp;&nbsp; //if (HTTP_STATUS_OK != m_dwStatusCode)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //return ;<br>&nbsp;&nbsp;&nbsp; }<br>*/</p>
<p>&nbsp;&nbsp;&nbsp; DWORD dwByteToRead = 0;<br>&nbsp;&nbsp;&nbsp; DWORD dwSizeOfRq = 4;<br>&nbsp;&nbsp;&nbsp; DWORD dwBytes = 0;<br>&nbsp;&nbsp;&nbsp; //这三个值分别存储文件的大小，HttpQueryInfo内容的大小和总共读取的字节数。<br>&nbsp;&nbsp;&nbsp; //HttpQueryInfo(hRequest, HTTP_QUERY_CONTENT_LENGTH | HTTP_QUERY_FLAG_NUMBER, (LPVOID)&amp;dwByteToRead, &amp;dwSizeOfRq, NULL);<br>&nbsp;&nbsp;&nbsp; //需要说明的是 HttpQueryInfo 并不进行网络操作，因此它不需要进行异步操作的处理。 <br>&nbsp;&nbsp;&nbsp; if (!HttpQueryInfo(hRequest, HTTP_QUERY_CONTENT_LENGTH | HTTP_QUERY_FLAG_NUMBER, (LPVOID)&amp;dwByteToRead, &amp;dwSizeOfRq, NULL))<br>&nbsp;&nbsp;&nbsp; { // 这里失败了？？？<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DWORD dwError = ::GetLastError();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout&lt;&lt;"HttpQueryInfo failed, so return， GetLastError() =="&lt;&lt;dwError&lt;&lt;endl;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return ;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; FILE * pFile = fopen("e://baidu01.exe", "wb" );<br>&nbsp;&nbsp;&nbsp; //ofstream mfile("out.txt");//定义文件输出流ouf，并关联到out.txt<br>&nbsp;&nbsp;&nbsp; int i=0;<br>&nbsp;&nbsp;&nbsp; DWORD leftB = dwByteToRead;<br>&nbsp;&nbsp;&nbsp; cout&lt;&lt;"开始下载"&lt;&lt;endl;<br>&nbsp;&nbsp;&nbsp; if( !ASYNC) // 同步下载<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while(true)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; const int MAX_BUFFER_SIZE = 65536;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; unsigned long nSize = 0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char szBuffer[MAX_BUFFER_SIZE+2];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int num = MAX_BUFFER_SIZE;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( leftB &lt; num);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; num = leftB;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BOOL bRet = ::InternetReadFile(hRequest, szBuffer, num, &amp;nSize); // 异步 需要等待</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; leftB -= nSize;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout&lt;&lt;i++&lt;&lt;" size: "&lt;&lt;nSize&lt;&lt;endl;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(!bRet || nSize &lt;= 0)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fwrite(szBuffer, sizeof(char), nSize, pFile);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; else // 异步下载<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INTERNET_BUFFERS i_buf = {0};<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i_buf.dwStructSize = sizeof(INTERNET_BUFFERS);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i_buf.lpvBuffer = new TCHAR[10242];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i_buf.dwBufferLength = 10240;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for( DWORD i=0;i&lt;dwByteToRead;)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //重置读数据事件<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ::ResetEvent( hEvent[0]);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int num = 10240;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(dwByteToRead-i&lt;10240)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; num = dwByteToRead-i;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i_buf.dwBufferLength = dwByteToRead-i;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (FALSE == ::InternetReadFileEx(hRequest,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;i_buf,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IRF_ASYNC,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NULL))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (ERROR_IO_PENDING == ::GetLastError())<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ( NULL)//WaitExitEvent()!=2)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; delete[] i_buf.lpvBuffer;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return ;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout&lt;&lt;"down failed,so return"&lt;&lt;endl;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; delete[] i_buf.lpvBuffer;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return ;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //在网络传输速度快，步长较小的情况下，<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //InternetReadFileEx 经常会直接返回成功，<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //因此要判断是否发生了用户要求终止子线程事件。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout&lt;&lt;"网络很好，InternetReadFileEx返回true"&lt;&lt;endl;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 暂不考虑用户退出<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i += i_buf.dwBufferLength; // 最后一次写多了！！！<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fwrite(i_buf.lpvBuffer, sizeof(char), i_buf.dwBufferLength, pFile);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout&lt;&lt;"i== "&lt;&lt;i&lt;&lt;endl;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //保存数据<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //通知主线程下载进度<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; InternetCloseHandle(hRequest);<br>&nbsp;&nbsp;&nbsp; InternetCloseHandle(hConnect);<br>&nbsp;&nbsp;&nbsp; InternetCloseHandle(hSession);<br>&nbsp;&nbsp;&nbsp; cout&lt;&lt;"success download file"&lt;&lt;endl;<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; return;<br>}</p>
<p>int main( void )<br>{<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; WinINet3(true,true);<br>&nbsp;&nbsp;&nbsp; return 1;<br>}</p>
<p>void OnInternetHandleCreated(HINTERNET hInternet, LPINTERNET_ASYNC_RESULT lpInetStatusResult)<br>{<br>&nbsp;&nbsp;&nbsp; if(NULL == lpInetStatusResult)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //ATLASSERT( 0 );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; hFile = HINTERNET(lpInetStatusResult-&gt;dwResult);<br>&nbsp;&nbsp;&nbsp; HINTERNET&nbsp;&nbsp;&nbsp; hInet = HINTERNET(lpInetStatusResult-&gt;dwResult);<br>&nbsp;&nbsp;&nbsp; DWORD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dwInetHandleType;<br>&nbsp;&nbsp;&nbsp; DWORD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dwTypeLen = sizeof(dwInetHandleType);</p>
<p>&nbsp;&nbsp;&nbsp; InternetQueryOption( hInet, INTERNET_OPTION_HANDLE_TYPE, &amp;dwInetHandleType, &amp;dwTypeLen);<br>&nbsp;&nbsp;&nbsp; switch(dwInetHandleType) <br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; case INTERNET_HANDLE_TYPE_CONNECT_HTTP:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //CloseInternetConnection(); //&nbsp;&nbsp; 这里是何意？？？？ 通过回调 设置httpConnect<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hConnect = hInet;&nbsp;&nbsp;&nbsp;&nbsp; // <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp; case INTERNET_HANDLE_TYPE_HTTP_REQUEST:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //CloseInternetFile();&nbsp;&nbsp;&nbsp; //&nbsp;&nbsp;&nbsp; 这里是何意？？&nbsp;&nbsp;&nbsp; 通过回调 设置httpFile<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hRequest = hInet;&nbsp;&nbsp;&nbsp; //<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break; <br>&nbsp;&nbsp;&nbsp; default:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; cout&lt;&lt;"OnInternetHandleCreated, so ::SetEvent(hEvent[0])"&lt;&lt;endl;<br>&nbsp;&nbsp;&nbsp; // HANDLE已创建事件（异步控制）<br>&nbsp;&nbsp;&nbsp; ::SetEvent(hEvent[0]);<br>}<br>void OnInternetRequestComplete(HINTERNET hInternet, LPINTERNET_ASYNC_RESULT lpInetStatusResult)<br>{</p>
<p>&nbsp;&nbsp;&nbsp; if( lpInetStatusResult == NULL )<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //ATLASSERT( 0 );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; cout&lt;&lt;"OnInternetRequestComplete, so ::SetEvent(hEvent[2])"&lt;&lt;endl;<br>&nbsp;&nbsp;&nbsp; // 激发请求完成事件（异步控制）<br>&nbsp;&nbsp;&nbsp; ::SetEvent(hEvent[0]);<br>}</p>
<p>void CALLBACK InternetStatusCallback(<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HINTERNET hInternet,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DWORD_PTR dwContext,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DWORD dwInternetStatus,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LPVOID lpvStatusInformation,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DWORD dwStatusInformationLength<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br>{<br>&nbsp;&nbsp;&nbsp; cout&lt;&lt;"进入回调"&lt;&lt;endl;<br>&nbsp;&nbsp;&nbsp; switch (dwInternetStatus)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; case INTERNET_STATUS_RESOLVING_NAME:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp; case INTERNET_STATUS_NAME_RESOLVED:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp; case INTERNET_STATUS_CONNECTING_TO_SERVER:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp; case INTERNET_STATUS_CONNECTED_TO_SERVER:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp; case INTERNET_STATUS_SENDING_REQUEST:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp; case INTERNET_STATUS_REQUEST_SENT:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp; case INTERNET_STATUS_RECEIVING_RESPONSE:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp; case INTERNET_STATUS_RESPONSE_RECEIVED:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp; case INTERNET_STATUS_CLOSING_CONNECTION:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp; case INTERNET_STATUS_CONNECTION_CLOSED:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp; case INTERNET_STATUS_HANDLE_CREATED:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout&lt;&lt;"回调是INTERNET_STATUS_HANDLE_CREATED"&lt;&lt;endl;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OnInternetHandleCreated(hInternet, LPINTERNET_ASYNC_RESULT(lpvStatusInformation)); // 传递了HINTERNET 这是精髓呀<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp; case INTERNET_STATUS_HANDLE_CLOSING:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp; case INTERNET_STATUS_REQUEST_COMPLETE:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout&lt;&lt;"回调是INTERNET_STATUS_REQUEST_COMPLETE"&lt;&lt;endl;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OnInternetRequestComplete(hInternet, LPINTERNET_ASYNC_RESULT(lpvStatusInformation));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp; case INTERNET_STATUS_REDIRECT:<br>&nbsp;&nbsp;&nbsp; case INTERNET_STATUS_INTERMEDIATE_RESPONSE:<br>&nbsp;&nbsp;&nbsp; case INTERNET_STATUS_STATE_CHANGE:<br>&nbsp;&nbsp;&nbsp; default:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp; }<br>}</p>
<img src ="http://www.cppblog.com/AutomateProgram/aggbug/110569.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/AutomateProgram/" target="_blank">漂漂</a> 2010-03-26 09:22 <a href="http://www.cppblog.com/AutomateProgram/archive/2010/03/26/110569.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DrawFrameControl 绘制控件</title><link>http://www.cppblog.com/AutomateProgram/archive/2010/03/23/110335.html</link><dc:creator>漂漂</dc:creator><author>漂漂</author><pubDate>Tue, 23 Mar 2010 02:36:00 GMT</pubDate><guid>http://www.cppblog.com/AutomateProgram/archive/2010/03/23/110335.html</guid><wfw:comment>http://www.cppblog.com/AutomateProgram/comments/110335.html</wfw:comment><comments>http://www.cppblog.com/AutomateProgram/archive/2010/03/23/110335.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/AutomateProgram/comments/commentRss/110335.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/AutomateProgram/services/trackbacks/110335.html</trackback:ping><description><![CDATA[<p>DrawFrameControl 的效果：<br>RECT rect;<br>&nbsp;&nbsp;&nbsp; rect.top = 0; <br>&nbsp;&nbsp;&nbsp; rect.left = 0;<br>&nbsp;&nbsp;&nbsp; rect.bottom = 40;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; rect.right = 40;<br>&nbsp;&nbsp;&nbsp; pDC-&gt;DrawFrameControl(&amp;rect, DFC_CAPTION, DFCS_CAPTIONCLOSE);<br>&nbsp;&nbsp;&nbsp; rect.left = 50;<br>&nbsp;&nbsp;&nbsp; rect.right = 90;<br>&nbsp;&nbsp;&nbsp; pDC-&gt;DrawFrameControl(&amp;rect, DFC_CAPTION, DFCS_CAPTIONMIN);<br>&nbsp;&nbsp;&nbsp; rect.left = 100;<br>&nbsp;&nbsp;&nbsp; rect.right = 140;<br>&nbsp;&nbsp;&nbsp; pDC-&gt;DrawFrameControl(&amp;rect, DFC_CAPTION, DFCS_CAPTIONMAX);<br>&nbsp;&nbsp;&nbsp; rect.left = 150;<br>&nbsp;&nbsp;&nbsp; rect.right = 190;<br>&nbsp;&nbsp;&nbsp; pDC-&gt;DrawFrameControl(&amp;rect, DFC_CAPTION, DFCS_CAPTIONRESTORE);<br>&nbsp;&nbsp;&nbsp; rect.left = 200;<br>&nbsp;&nbsp;&nbsp; rect.right = 240;<br>&nbsp;&nbsp;&nbsp; pDC-&gt;DrawFrameControl(&amp;rect, DFC_CAPTION, DFCS_CAPTIONHELP);<br>&nbsp;// TODO: Menu bar<br>&nbsp;&nbsp;&nbsp; rect.left = 250;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; rect.right = 290;<br>&nbsp;&nbsp;&nbsp; pDC-&gt;DrawFrameControl(&amp;rect, DFC_MENU, DFCS_MENUARROW);<br>&nbsp;&nbsp;&nbsp; rect.left = 300;<br>&nbsp;&nbsp;&nbsp; rect.right = 340;<br>&nbsp;&nbsp;&nbsp; pDC-&gt;DrawFrameControl(&amp;rect, DFC_MENU, DFCS_MENUCHECK);<br>&nbsp;&nbsp;&nbsp; rect.left = 350;<br>&nbsp;&nbsp;&nbsp; rect.right = 390;<br>&nbsp;&nbsp;&nbsp; pDC-&gt;DrawFrameControl(&amp;rect, DFC_MENU, DFCS_MENUBULLET);<br>&nbsp;&nbsp;&nbsp; rect.left = 400;<br>&nbsp;&nbsp;&nbsp; rect.right = 440;<br>&nbsp;&nbsp;&nbsp; pDC-&gt;DrawFrameControl(&amp;rect, DFC_MENU, DFCS_MENUARROWRIGHT);<br>&nbsp;// TODO: Scroll bar<br>&nbsp;&nbsp;&nbsp; rect.top = 50; <br>&nbsp;&nbsp;&nbsp; rect.left = 0;<br>&nbsp;&nbsp;&nbsp; rect.bottom = 90;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; rect.right = 40;<br>&nbsp;&nbsp;&nbsp; pDC-&gt;DrawFrameControl(&amp;rect, DFC_SCROLL, DFCS_SCROLLUP);<br>&nbsp;&nbsp;&nbsp; rect.left = 50;<br>&nbsp;&nbsp;&nbsp; rect.right = 90;<br>&nbsp;&nbsp;&nbsp; pDC-&gt;DrawFrameControl(&amp;rect, DFC_SCROLL, DFCS_SCROLLDOWN);<br>&nbsp;&nbsp;&nbsp; rect.left = 100;<br>&nbsp;&nbsp;&nbsp; rect.right = 140;<br>&nbsp;&nbsp;&nbsp; pDC-&gt;DrawFrameControl(&amp;rect, DFC_SCROLL, DFCS_SCROLLLEFT);<br>&nbsp;&nbsp;&nbsp; rect.left = 150;<br>&nbsp;&nbsp;&nbsp; rect.right = 190;<br>&nbsp;&nbsp;&nbsp; pDC-&gt;DrawFrameControl(&amp;rect, DFC_SCROLL, DFCS_SCROLLRIGHT);<br>&nbsp;&nbsp;&nbsp; rect.left = 200;<br>&nbsp;&nbsp;&nbsp; rect.right = 240;<br>&nbsp;&nbsp;&nbsp; pDC-&gt;DrawFrameControl(&amp;rect, DFC_SCROLL, DFCS_SCROLLCOMBOBOX);<br>&nbsp;&nbsp;&nbsp; rect.left = 250;<br>&nbsp;&nbsp;&nbsp; rect.right = 290;<br>&nbsp;&nbsp;&nbsp; pDC-&gt;DrawFrameControl(&amp;rect, DFC_SCROLL, DFCS_SCROLLSIZEGRIP);<br>&nbsp;&nbsp;&nbsp; rect.left = 300;<br>&nbsp;&nbsp;&nbsp; rect.right = 340;<br>&nbsp;&nbsp;&nbsp; pDC-&gt;DrawFrameControl(&amp;rect, DFC_SCROLL, DFCS_SCROLLSIZEGRIPRIGHT);<br>&nbsp;// TODO: Standard button<br>&nbsp;&nbsp;&nbsp; rect.top = 100; <br>&nbsp;&nbsp;&nbsp; rect.left = 0;<br>&nbsp;&nbsp;&nbsp; rect.bottom = 140;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; rect.right = 40;<br>&nbsp;&nbsp;&nbsp; pDC-&gt;DrawFrameControl(&amp;rect, DFC_BUTTON, DFCS_BUTTONCHECK);<br>&nbsp;&nbsp;&nbsp; rect.left = 50;<br>&nbsp;&nbsp;&nbsp; rect.right = 90;<br>&nbsp;&nbsp;&nbsp; pDC-&gt;DrawFrameControl(&amp;rect, DFC_BUTTON, DFCS_BUTTONRADIOIMAGE);<br>&nbsp;&nbsp;&nbsp; rect.left = 100;<br>&nbsp;&nbsp;&nbsp; rect.right = 140;<br>&nbsp;&nbsp;&nbsp; pDC-&gt;DrawFrameControl(&amp;rect, DFC_BUTTON, DFCS_BUTTONRADIOMASK);<br>&nbsp;&nbsp;&nbsp; rect.left = 150;<br>&nbsp;&nbsp;&nbsp; rect.right = 190;<br>&nbsp;&nbsp;&nbsp; pDC-&gt;DrawFrameControl(&amp;rect, DFC_BUTTON, DFCS_BUTTONRADIO);<br>&nbsp;&nbsp;&nbsp; rect.left = 200;<br>&nbsp;&nbsp;&nbsp; rect.right = 240;<br>&nbsp;&nbsp;&nbsp; pDC-&gt;DrawFrameControl(&amp;rect, DFC_BUTTON, DFCS_BUTTON3STATE);<br>&nbsp;&nbsp;&nbsp; rect.left = 250;<br>&nbsp;&nbsp;&nbsp; rect.right = 290;<br>&nbsp;&nbsp;&nbsp; pDC-&gt;DrawFrameControl(&amp;rect, DFC_BUTTON, DFCS_BUTTONPUSH);<br><br>使用DrawFrameControl 定制自己的check按钮<br>void CMyCheckButton::OnPaint()<br>{<br>&nbsp;CPaintDC dc(this); // device context for painting<br>&nbsp;CRect rect;<br>&nbsp;GetClientRect(&amp;rect);</p>
<p>&nbsp;CRect BoxRect;<br>&nbsp;BoxRect=rect;<br>&nbsp;BoxRect.right =BoxRect.left +15;<br>&nbsp;dc.DrawFrameControl(BoxRect,DFC_BUTTON,DFCS_BUTTONCHECK|GetCheck()?DFCS_CHECKED :0);</p>
<p>&nbsp;CFont&nbsp;&nbsp; myFont;&nbsp; <br>&nbsp;myFont.CreatePointFont (100,_T("宋体"));<br>&nbsp;CFont&nbsp;&nbsp; *pOldFont=(CFont&nbsp;&nbsp; *)dc.SelectObject(&amp;myFont);<br>&nbsp;dc.SetBkMode(TRANSPARENT);&nbsp;&nbsp; </p>
<p>&nbsp;CString StrWndText;<br>&nbsp;GetWindowText(StrWndText);</p>
<p>&nbsp;rect.OffsetRect (20,0);<br>&nbsp;dc.SetTextColor(RGB(0,0,0));<br>&nbsp;dc.DrawText(StrWndText,&nbsp;&nbsp; rect,&nbsp;&nbsp; DT_LEFT|DT_VCENTER|DT_SINGLELINE);<br>&nbsp;dc.SelectObject&nbsp;&nbsp; (pOldFont);&nbsp; <br>&nbsp;myFont.DeleteObject&nbsp;&nbsp; ();&nbsp; <br>}</p>
<img src ="http://www.cppblog.com/AutomateProgram/aggbug/110335.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/AutomateProgram/" target="_blank">漂漂</a> 2010-03-23 10:36 <a href="http://www.cppblog.com/AutomateProgram/archive/2010/03/23/110335.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CFile操作详解</title><link>http://www.cppblog.com/AutomateProgram/archive/2010/03/22/110281.html</link><dc:creator>漂漂</dc:creator><author>漂漂</author><pubDate>Mon, 22 Mar 2010 03:09:00 GMT</pubDate><guid>http://www.cppblog.com/AutomateProgram/archive/2010/03/22/110281.html</guid><wfw:comment>http://www.cppblog.com/AutomateProgram/comments/110281.html</wfw:comment><comments>http://www.cppblog.com/AutomateProgram/archive/2010/03/22/110281.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/AutomateProgram/comments/commentRss/110281.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/AutomateProgram/services/trackbacks/110281.html</trackback:ping><description><![CDATA[<p>原文地址：<a href="http://blog.csdn.net/zhuang_rui/archive/2007/09/28/1804875.aspx">http://blog.csdn.net/zhuang_rui/archive/2007/09/28/1804875.aspx</a><br>各种关于文件的操作在程序设计中是十分常见，如果能对其各种操作都了如指掌，就可以根据实际情况找到最佳的解决方案，从而在较短的时间内编写出高效的代码，因而熟练的掌握文件操作是十分重要的。本文将对Visual C++中有关文件操作进行全面的介绍，并对在文件操作中经常遇到的一些疑难问题进行详细的分析。<br>　　1．文件的查找 <br>　　当对一个文件操作时，如果不知道该文件是否存在，就要首先进行查找。MFC中有一个专门用来进行文件查找的类CFileFind，使用它可以方便快捷地进行文件的查找。下面这段代码演示了这个类的最基本使用方法。 <br>　　CString strFileTitle; <br>　　CFileFind finder; <br>　　BOOL bWorking = finder.FindFile("C:\\windows\\sysbkup\\*.cab"); <br>　　while(bWorking) <br>　　{ <br>　　bWorking=finder.FindNextFile(); <br>　　strFileTitle=finder.GetFileTitle(); <br>　　} <br>　　2．文件的打开/保存对话框 <br>　　让用户选择文件进行打开和存储操作时，就要用到文件打开/保存对话框。MFC的类CFileDialog用于实现这种功能。使用CFileDialog声明一个对象时，第一个BOOL型参数用于指定文件的打开或保存，当为TRUE时将构造一个文件打开对话框，为FALSE时构造一个文件保存对话框。 <br>　　在构造CFileDialog对象时，如果在参数中指定了OFN_ALLOWMULTISELECT风格，则在此对话框中可以进行多选操作。此时要重点注意为此CFileDialog对象的m_ofn.lpstrFile分配一块内存，用于存储多选操作所返回的所有文件路径名，如果不进行分配或分配的内存过小就会导致操作失败。下面这段程序演示了文件打开对话框的使用方法。 <br>　　CFileDialog mFileDlg(TRUE,NULL,NULL, <br>　　OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT|OFN_ALLOWMULTISELECT, <br>　　"All Files (*.*)|*.*||",AfxGetMainWnd()); <br>　　CString str(" ",10000); <br>　　mFileDlg.m_ofn.lpstrFile=str.GetBuffer(10000); <br>　　str.ReleaseBuffer(); <br>　　POSITION mPos=mFileDlg.GetStartPosition(); <br>　　CString pathName(" ",128); <br>　　CFileStatus status; <br>　　while(mPos!=NULL) <br>　　{ <br>　　pathName=mFileDlg.GetNextPathName(mPos); <br>　　CFile::GetStatus( pathName, status ); <br>　　} <br>　　3．文件的读写 <br>　　文件的读写非常重要，下面将重点进行介绍。文件读写的最普通的方法是直接使用CFile进行，如文件的读写可以使用下面的方法： <br>　　//对文件进行读操作 <br>　　char sRead[2]; <br>　　CFile mFile(_T("user.txt"),CFile::modeRead); <br>　　if(mFile.GetLength()&lt;2) <br>　　return; <br>　　mFile.Read(sRead,2); <br>　　mFile.Close(); <br>　　//对文件进行写操作 <br>　　CFile mFile(_T("user.txt "), CFile::modeWrite|CFile::modeCreate); <br>　　mFile.Write(sRead,2); <br>　　mFile.Flush(); <br>　　mFile.Close(); <br>　　虽然这种方法最为基本，但是它的使用繁琐，而且功能非常简单。我向你推荐的是使用CArchive，它的使用方法简单且功能十分强大。首先还是用CFile声明一个对象，然后用这个对象的指针做参数声明一个CArchive对象，你就可以非常方便地存储各种复杂的数据类型了。它的使用方法见下例。 <br>　　//对文件进行写操作 <br>　　CString strTemp; <br>　　CFile mFile; <br>　　mFile.Open("d:\\dd\\try.TRY",CFile::modeCreate|CFile::modeNoTruncate|CFile::modeWrite); <br>　　CArchive ar(&amp;mFile,CArchive::store); <br>　　ar&lt;&lt;　　ar.Close(); <br>　　mFile.Close(); <br>　　//对文件进行读操作 <br>　　CFile mFile; <br>　　if(mFile.Open("d:\\dd\\try.TRY",CFile::modeRead)==0) <br>　　return; <br>　　CArchive ar(&amp;mFile,CArchive::load); <br>　 　ar&gt;&gt;strTemp; <br>&nbsp;&nbsp;&nbsp; 　 ar.Close(); <br>　　mFile.Close(); <br>　　CArchive的 &lt;&lt; 和&gt;&gt; 操作符用于简单数据类型的读写，对于CObject派生类的对象的存取要使用ReadObject()和WriteObject()。使用CArchive的ReadClass()和WriteClass()还可以进行类的读写，如： <br>　　//存储CAboutDlg类 <br>　　ar.WriteClass(RUNTIME_CLASS(CAboutDlg)); <br>　　//读取CAboutDlg类 <br>　　CRuntimeClass* mRunClass=ar.ReadClass(); <br>　　//使用CAboutDlg类 <br>　　CObject* pObject=mRunClass-&gt;CreateObject(); <br>&nbsp;&nbsp;&nbsp; 　　((CDialog* )pObject)-&gt;DoModal(); <br>　　虽然VC提供的文档/视结构中的文档也可进行这些操作，但是不容易理解、使用和管理，因此虽然很多VC入门的书上花费大量篇幅讲述文档/视结构，但我建议你最好不要使用它的文档。关于如何进行文档/视的分离有很多书介绍，包括非常著名的《Visual C++ 技术内幕》。 <br>　　如果你要进行的文件操作只是简单的读写整行的字符串，我建议你使用CStdioFile，用它来进行此类操作非常方便，如下例。 <br>　　CStdioFile mFile; <br>　　CFileException mExcept; <br>　　mFile.Open( "d:\\temp\\aa.bat", CFile::modeWrite, &amp;mExcept); <br>　　CString string="I am a string."; <br>　　mFile.WriteString(string); <br>　　mFile.Close(); <br>　4．临时文件的使用 </p>
<p>　　正规软件经常用到临时文件，你经常可以会看到C:\Windows\Temp目录下有大量的扩展名为tmp的文件，这些就是程序运行是建立的临时文件。临时文件的使用方法基本与常规文件一样，只是文件名应该调用函数GetTempFileName()获得。它的第一个参数是建立此临时文件的路径，第二个参数是建立临时文件名的前缀，第四个参数用于得到建立的临时文件名。得到此临时文件名以后，你就可以用它来建立并操作文件了，如： <br>　　char szTempPath[_MAX_PATH],szTempfile[_MAX_PATH]; <br>　　GetTempPath(_MAX_PATH, szTempPath); <br>　　GetTempFileName(szTempPath,_T ("my_"),0,szTempfile); <br>　　CFile m_tempFile(szTempfile,CFile:: modeCreate|CFile:: modeWrite); <br>　　char m_char='a'; <br>　　m_tempFile.Write(&amp;m_char,2); <br>　　m_tempFile.Close(); <br>　　5．文件的复制、删除等 <br>　　MFC中没有提供直接进行这些操作的功能，因而要使用SDK。SDK中的文件相关函数常用的有CopyFile()、CreateDirectory()、DeleteFile()、MoveFile()。它们的用法很简单，可参考MSDN。 </p>
<p>1,判断文件是否存在<br>&nbsp;&nbsp;&nbsp; access(filename,mode);<br>2,对于不同用途又不同的文件操作,其中API函数CreateFile()也是比较有用处理方式,对于巨型文件很合适的其他的楼上的大都说了,不重复了.</p>
<p>[1]显示对话框，取得文件名</p>
<p>CString FilePathName;<br>CFileDialog dlg(TRUE);///TRUE为OPEN对话框，FALSE为S***E AS对话框<br>if (dlg.DoModal() == IDOK)<br>&nbsp;&nbsp;&nbsp; FilePathName=dlg.GetPathName();</p>
<p>相关信息：CFileDialog 用于取文件名的几个成员函数：<br>假如选择的文件是C:\WINDOWS\TEST.EXE<br>则(1)GetPathName();取文件名全称，包括完整路径。取回C:\WINDOWS\TEST.EXE<br>(2)GetFileTitle();取文件全名：TEST.EXE<br>(3)GetFileName();取回TEST<br>(4)GetFileExt();取扩展名EXE</p>
<p>[2]打开文件<br>CFile file("C:\HELLO.TXT",CFile::modeRead);//只读方式打开<br>//CFile::modeRead可改为 CFile::modeWrite(只写),<br>//CFile::modeReadWrite(读写),CFile::modeCreate(新建)<br>例子：<br>{<br>CFile file;<br>file.Open("C:\HELLO.TXT",CFile::modeCreate|Cfile::modeWrite);<br>.<br>.<br>.<br>}</p>
<p>[3]移动文件指针<br>file.Seek(100,CFile::begin);///从文件头开始往下移动100字节<br>file.Seek(-50,CFile::end);///从文件末尾往上移动50字节<br>file.Seek(-30,CFile::current);///从当前位置往上移动30字节<br>file.SeekToBegin();///移到文件头<br>file.SeekToEnd();///移到文件尾</p>
<p>[4]读写文件<br>读文件：<br>char buffer[1000];<br>file.Read(buffer,1000);<br>写文件：<br>CString string("自强不息");<br>file.Write(string,8);</p>
<p>[5]关闭文件<br>file.Close(); </p>
<p><br>本文来自CSDN博客，转载请标明出处：<a href="http://blog.csdn.net/zhuang_rui/archive/2007/09/28/1804875.aspx">http://blog.csdn.net/zhuang_rui/archive/2007/09/28/1804875.aspx</a></p>
<img src ="http://www.cppblog.com/AutomateProgram/aggbug/110281.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/AutomateProgram/" target="_blank">漂漂</a> 2010-03-22 11:09 <a href="http://www.cppblog.com/AutomateProgram/archive/2010/03/22/110281.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用OnCtlColor函数来改变控件颜色</title><link>http://www.cppblog.com/AutomateProgram/archive/2010/03/20/110180.html</link><dc:creator>漂漂</dc:creator><author>漂漂</author><pubDate>Sat, 20 Mar 2010 12:29:00 GMT</pubDate><guid>http://www.cppblog.com/AutomateProgram/archive/2010/03/20/110180.html</guid><wfw:comment>http://www.cppblog.com/AutomateProgram/comments/110180.html</wfw:comment><comments>http://www.cppblog.com/AutomateProgram/archive/2010/03/20/110180.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/AutomateProgram/comments/commentRss/110180.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/AutomateProgram/services/trackbacks/110180.html</trackback:ping><description><![CDATA[<p>原文地址：http://lixikeke.blog.hexun.com/25486166_d.html</p><p>在MFC类库提供了<strong><font color="#0000ff">CWnd</font>::<font color="#993300">OnCtlColor</font></strong>函数,在工作框架的子窗口被重画时将调用该成员函数.因此可以重载<strong>WM_CTLCOLOR</strong>消息的响应函数.此函数的原型:<br>&nbsp;&nbsp;<strong>afx_msg 
HBRUSH OnCtlColor(CDC *pDC,CWnd *pWnd,UINT nCtlColor);<br></strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
参数<strong>nCtlColor</strong>用于指定控件的类型,可以是:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .<strong><font color="#993300">CTLCOLOR_BTN</font></strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 按钮控件<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
.<strong><font color="#993300">CTLCOLOR_DLG</font></strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
对话框<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .<font color="#993300"><strong>CTLCOLOR</strong>_<strong>EDIT</strong></font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
编辑框<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .<strong><font color="#993300">CTLCOLOR_LISTBOX</font></strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 列表控件<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
.<strong><font color="#993300">CTLCOLOR_MSGBOX</font></strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
消息控件<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .<strong><font color="#993300">CTLCOLOR_SCROLLBAR</font></strong> 滚动条控件<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
.<strong><font color="#993300">CTLCOLOR_STATIC</font></strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
静态控件<br><strong>[程序实现]</strong><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
假设你已有了名为<strong>My</strong>的对话框工程.你有了一个<strong>STATIC</strong>的控件，ID为<strong><font color="#000000">IDC_STATIC1</font></strong>.<br>&nbsp;&nbsp;<strong><font color="#0000ff">HBRUSH CMyDlg</font>::<font color="#993300">OnCtlColor</font>(<font color="#0000ff">CDC</font>* pDC, <font color="#0000ff">CWnd</font>* pWnd, <font color="#0000ff">UINT</font> nCtlColor) <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">HBRUSH</font> hbr = <font color="#0000ff">CDialog</font>::<font color="#993300">OnCtlColor</font>(pDC, pWnd, nCtlColor);<br>&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#008080"> </font><font color="#339966">// TODO: Change any attributes of the 
DC here</font><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">if </font>(nCtlColor==<font color="#993300">CTLCOLOR_</font><font color="#993300">STATIC</font>)</strong></p>
<p><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pDC-&gt;<font color="#993300">SetTextColor</font>(<font color="#993300">RGB</font>(255,0,0));</strong>&nbsp;&nbsp;<font color="#339966">//字体颜色<br></font><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pDC-&gt;<font color="#993300">SetBkColor</font>(<font color="#993300">RGB</font>(0, 0, 
255));</strong>&nbsp;&nbsp;&nbsp;<font color="#339966">//字体背景色</font><strong>&nbsp;&nbsp;</strong></p>
<p><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</strong><strong><font color="#339966"> // 
TODO: Return a different brush if the default is not 
desired<br></font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">return</font> hbr;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
}</strong></p>
<p><br>如果要指定某个特定控件可以这样写：<strong><font color="#000000">ID为IDC_STATIC1</font></strong></p>
<p><font color="#0000ff"><strong>if </strong></font><strong><font color="#000000">(pWnd-&gt;<font color="#993300">GetDlgCtrlID</font>()==<font color="#ff00ff">IDC_STATIC1</font>)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pDC-&gt;<font color="#993300">SetTextColor</font></font><font color="#000000">(</font></strong><font color="#000000"><strong><font color="#ff00ff">RGB</font>(255,0,0));&nbsp;&nbsp;<font color="#339966">//设置字体颜色</font><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pDC-&gt;<font color="#993300">SetBkMode</font>(<font color="#ff00ff">TRANSPARENT</font>); <font color="#339966">//设置字体背景为透明</font><br></strong><font color="#339966"><strong>// 
TODO: Return a different brush if the default is not 
desired</strong><br></font><strong>&nbsp;&nbsp;<font color="#0000ff">return</font> (<font color="#0000ff">HBRUSH</font>)::<font color="#993300">GetStockObject</font>(<font color="#ff00ff">BLACK_BRUSH</font>);&nbsp;&nbsp;<font color="#339966">// 
设置背景色<br></font>}<br><font color="#0000ff">else</font><br><font color="#0000ff">return</font> hbr;</strong></font></p>
<p><font color="#000000"><strong>【注】</strong></font></p>
<p><font color="#000000"><strong>BLACK_BRUSH:</strong>黑色</font></p>
<p><font color="#000000"><strong>WHITE_BRUSH:</strong>白色</font></p>
<p><font color="#000000"><strong>GRAY_BRUSH:</strong>灰色</font></p>
<p><font color="#000000"><strong>NULL_BRUSH:</strong>透明</font></p>
<p><font color="#000000"><font size="2"><strong><font color="#000000">HOLLOW_BRUSH</font></strong> ：透明</font></font></p><p><span  style="font-size: small;">注：如果在窗体中使用这种方法，会引起代码的臃肿，建议自定义自己的类。</span></p><img src ="http://www.cppblog.com/AutomateProgram/aggbug/110180.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/AutomateProgram/" target="_blank">漂漂</a> 2010-03-20 20:29 <a href="http://www.cppblog.com/AutomateProgram/archive/2010/03/20/110180.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VC之美化界面篇（转）</title><link>http://www.cppblog.com/AutomateProgram/archive/2010/03/20/110179.html</link><dc:creator>漂漂</dc:creator><author>漂漂</author><pubDate>Sat, 20 Mar 2010 12:12:00 GMT</pubDate><guid>http://www.cppblog.com/AutomateProgram/archive/2010/03/20/110179.html</guid><wfw:comment>http://www.cppblog.com/AutomateProgram/comments/110179.html</wfw:comment><comments>http://www.cppblog.com/AutomateProgram/archive/2010/03/20/110179.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/AutomateProgram/comments/commentRss/110179.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/AutomateProgram/services/trackbacks/110179.html</trackback:ping><description><![CDATA[原文地址：<a href="http://blog.csdn.net/bluejoe2000/archive/2009/06/15/4269540.aspx">http://blog.csdn.net/bluejoe2000/archive/2009/06/15/4269540.aspx</a>
<img src ="http://www.cppblog.com/AutomateProgram/aggbug/110179.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/AutomateProgram/" target="_blank">漂漂</a> 2010-03-20 20:12 <a href="http://www.cppblog.com/AutomateProgram/archive/2010/03/20/110179.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VS2005下如何安装WTL</title><link>http://www.cppblog.com/AutomateProgram/archive/2010/03/20/110153.html</link><dc:creator>漂漂</dc:creator><author>漂漂</author><pubDate>Sat, 20 Mar 2010 02:21:00 GMT</pubDate><guid>http://www.cppblog.com/AutomateProgram/archive/2010/03/20/110153.html</guid><wfw:comment>http://www.cppblog.com/AutomateProgram/comments/110153.html</wfw:comment><comments>http://www.cppblog.com/AutomateProgram/archive/2010/03/20/110153.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/AutomateProgram/comments/commentRss/110153.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/AutomateProgram/services/trackbacks/110153.html</trackback:ping><description><![CDATA[<p>原文地址：<a href="http://www.cnblogs.com/weitianshui/articles/1017178.html">http://www.cnblogs.com/weitianshui/articles/1017178.html</a></p>
<p><font face="Courier New">Windows Template Library - WTL的安装指南满地都是，而且源程序也附带了安装说明，似乎没有必要再多写一个。但是，事情并没有想象的那么简单，本人有过将近4年的C++开发经验，在两年前刚转入C#，有很长时间没碰C++了（最后使用的工具是VC++6.0）。今天突发兴趣，想要玩玩VC++ 2005和WTL，谁知，以我这种经验，折腾这看是简单的玩意，也花了大半天的时间方才搞出第一个WTL的Hello World，个中曲折，说来实在惭愧，只好把正确的安装过程写一下，如果能给别人一点提示，那是最好的了。至少，可以做个笔记，两三年以后如果又忘了，还可以回来翻翻。</font></p>
<p><font face="Courier New">1、从http://sourceforge.net/projects/wtl下载最新版本的WTL，当时是8.0<br>2、下载得到的是一个自解压文件，可以解压到任意目录。比如d:\wtl80，下面有几个子目录samples, include, AppWizMobile, AppWizCE, AppWiz，还有一个txt文件和htm文件。其中include是头文件，samples是几个示例，AppWiz*是各种向导文件。<br>3、在命令行里执行：wscript.exe "D:\WTL80\AppWiz\setup80.js"，如果是vs2005 express、vs2003等，分别执行setup80x.js, setup70.js,可以看看里面的文档说明。<br>&nbsp;&nbsp; 注：这是一个很容易让人困惑的地方，网上的文档全都说解压后执行setup80.js文件，但都没说如何执行。后来在代码里看到有WScript，才想到用WSCript.exe来执行。</font></p>
<p><font face="Courier New">4、打开VS2005, 选择VC++项目，就可以看到WTL项目的向导了。</font></p>
<p><font face="Courier New">5、在VS2005里，打开菜单&#8220;工具&#8221;——选项——项目和解决方案——VC++目录，在&#8220;显示以下内容的目录&#8221;下拉框中，选择&#8220;包含文件&#8221;，加入刚才解压的wtl下的include，本例中是"d:\wtl80\include"。</font></p>
<p><font face="Courier New">6、按照向导创建一个程序，编译，执行，OK。</font></p>
<img src ="http://www.cppblog.com/AutomateProgram/aggbug/110153.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/AutomateProgram/" target="_blank">漂漂</a> 2010-03-20 10:21 <a href="http://www.cppblog.com/AutomateProgram/archive/2010/03/20/110153.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>TransparentBlt的使用</title><link>http://www.cppblog.com/AutomateProgram/archive/2010/03/18/110001.html</link><dc:creator>漂漂</dc:creator><author>漂漂</author><pubDate>Thu, 18 Mar 2010 07:27:00 GMT</pubDate><guid>http://www.cppblog.com/AutomateProgram/archive/2010/03/18/110001.html</guid><wfw:comment>http://www.cppblog.com/AutomateProgram/comments/110001.html</wfw:comment><comments>http://www.cppblog.com/AutomateProgram/archive/2010/03/18/110001.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/AutomateProgram/comments/commentRss/110001.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/AutomateProgram/services/trackbacks/110001.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;//自定义绘制<br>&nbsp;&nbsp;CDC* cdc = GetDC();&nbsp;&nbsp;&nbsp;&nbsp; //前台DC<br>&nbsp;&nbsp;CDC bufferDC;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //后台DC<br>&nbsp;&nbsp;CDC tempDC;&nbsp;&nbsp;&nbsp; //临时DC<br>&nbsp;&nbsp;CBitmap bufferBMP;&nbsp; //后台DC位图<br>&nbsp;&nbsp;//DC关联<br>&nbsp;&nbsp;bufferDC.CreateCompatibleDC(cdc);<br>&nbsp;&nbsp;tempDC.CreateCompatibleDC(cdc);<br>&nbsp;&nbsp;//后台DC位图关联&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;bufferBMP.CreateCompatibleBitmap(cdc,278,127);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;bufferDC.SelectObject(bufferBMP);<br>&nbsp;&nbsp;tempDC.SelectObject(m_bmp);<br>&nbsp;&nbsp;bufferDC.TransparentBlt(0,0,278,127,&amp;tempDC,0,0,278,127,RGB(255,255,255));<br>&nbsp;&nbsp;//绘制到前台DC<br>&nbsp;&nbsp;cdc-&gt;BitBlt(0,0,278,127,&amp;bufferDC,0,0,SRCCOPY);<br>&nbsp;&nbsp;//释放资源<br>&nbsp;&nbsp;bufferBMP.DeleteObject();<br>&nbsp;&nbsp;tempDC.DeleteDC();<br>&nbsp;&nbsp;bufferDC.DeleteDC();<br>&nbsp;&nbsp;this-&gt;ReleaseDC(cdc);<br>
<img src ="http://www.cppblog.com/AutomateProgram/aggbug/110001.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/AutomateProgram/" target="_blank">漂漂</a> 2010-03-18 15:27 <a href="http://www.cppblog.com/AutomateProgram/archive/2010/03/18/110001.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>透明位图的显示</title><link>http://www.cppblog.com/AutomateProgram/archive/2010/03/18/109999.html</link><dc:creator>漂漂</dc:creator><author>漂漂</author><pubDate>Thu, 18 Mar 2010 07:18:00 GMT</pubDate><guid>http://www.cppblog.com/AutomateProgram/archive/2010/03/18/109999.html</guid><wfw:comment>http://www.cppblog.com/AutomateProgram/comments/109999.html</wfw:comment><comments>http://www.cppblog.com/AutomateProgram/archive/2010/03/18/109999.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/AutomateProgram/comments/commentRss/109999.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/AutomateProgram/services/trackbacks/109999.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 原文地址：http://www.vckbase.com/document/viewdoc/?id=532包含透明色的位图的绘制方法有多种，最简单的方法是调用现成的函数：TransparentBlt,也可以通过自己的代码实现类似TransparentBlt的功能，实现过程也有两种形式，一种是事先做一张掩码位图，另一种是动态生成掩码位图。本文将介绍动态生成掩码位图绘制具有透明区域位图的方法。一...&nbsp;&nbsp;<a href='http://www.cppblog.com/AutomateProgram/archive/2010/03/18/109999.html'>阅读全文</a><img src ="http://www.cppblog.com/AutomateProgram/aggbug/109999.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/AutomateProgram/" target="_blank">漂漂</a> 2010-03-18 15:18 <a href="http://www.cppblog.com/AutomateProgram/archive/2010/03/18/109999.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>程序控制桌面切换</title><link>http://www.cppblog.com/AutomateProgram/archive/2010/03/18/109977.html</link><dc:creator>漂漂</dc:creator><author>漂漂</author><pubDate>Thu, 18 Mar 2010 05:41:00 GMT</pubDate><guid>http://www.cppblog.com/AutomateProgram/archive/2010/03/18/109977.html</guid><wfw:comment>http://www.cppblog.com/AutomateProgram/comments/109977.html</wfw:comment><comments>http://www.cppblog.com/AutomateProgram/archive/2010/03/18/109977.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/AutomateProgram/comments/commentRss/109977.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/AutomateProgram/services/trackbacks/109977.html</trackback:ping><description><![CDATA[<p>原文地址：<a href="http://blog.csdn.net/goingup/archive/2006/03/07/618323.aspx">http://blog.csdn.net/goingup/archive/2006/03/07/618323.aspx</a><br></p>
<p>用向导建立一个Win32程序&#8220;hello, world!&#8221;，然后用下面的内容替换整个CPP文件内容就可以了</p>
<p><br>#include "stdafx.h"<br>#include "resource.h"</p>
<p>#include "ShellApi.h"</p>
<p>HINSTANCE hInst = NULL;</p>
<p>HDESK hDesktopCurrent;<br>HDESK hDesktopLlx;</p>
<p>LONG APIENTRY WndProc(<br>&nbsp;&nbsp;&nbsp; HWND hWnd,<br>&nbsp;&nbsp;&nbsp; UINT message,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // type of message<br>&nbsp;&nbsp;&nbsp; WPARAM wParam,&nbsp;&nbsp;&nbsp;&nbsp; // additional information<br>&nbsp;&nbsp;&nbsp; LPARAM lParam)&nbsp;&nbsp;&nbsp;&nbsp; // additional information<br>{<br>&nbsp;int wmId, wmEvent;<br>&nbsp;PAINTSTRUCT ps;<br>&nbsp;HDC hdc;</p>
<p>&nbsp;switch (message) <br>&nbsp;{<br>&nbsp; case WM_COMMAND:<br>&nbsp;&nbsp; wmId&nbsp;&nbsp;&nbsp; = LOWORD(wParam); <br>&nbsp;&nbsp; wmEvent = HIWORD(wParam); <br>&nbsp;&nbsp; // Parse the menu selections:<br>&nbsp;&nbsp; switch (wmId)<br>&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; case IDM_ABOUT:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp; case IDM_EXIT:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DestroyWindow(hWnd);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp; default:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return DefWindowProc(hWnd, message, wParam, lParam);<br>&nbsp;&nbsp; }<br>&nbsp;&nbsp; break;<br>&nbsp; case WM_PAINT:<br>&nbsp;&nbsp; hdc = BeginPaint(hWnd, &amp;ps);<br>&nbsp;&nbsp; // TODO: Add any drawing code here...<br>&nbsp;&nbsp; RECT rt;<br>&nbsp;&nbsp; GetClientRect(hWnd, &amp;rt);<br>&nbsp;&nbsp; //DrawText(hdc, szHello, strlen(szHello), &amp;rt, DT_CENTER);<br>&nbsp;&nbsp; EndPaint(hWnd, &amp;ps);<br>&nbsp;&nbsp; break;<br>&nbsp; /*<br>&nbsp; case WM_DESTROY:<br>&nbsp;&nbsp; PostQuitMessage(0);<br>&nbsp;&nbsp; break;<br>&nbsp; //*/<br>&nbsp; case WM_LBUTTONDOWN:<br>&nbsp;&nbsp; break;<br>&nbsp; case WM_HOTKEY:<br>&nbsp;&nbsp; if(7777 == wParam)<br>&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; PostQuitMessage(0);<br>&nbsp;&nbsp; }<br>&nbsp;&nbsp; else if(7778 == wParam)<br>&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; SwitchDesktop(hDesktopCurrent);<br>&nbsp;&nbsp; }<br>&nbsp;&nbsp; else if(7779 == wParam)<br>&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; SwitchDesktop(hDesktopLlx);<br>&nbsp;&nbsp; }<br>&nbsp;&nbsp; break;<br>&nbsp; case WM_QUIT:<br>&nbsp; case WM_DESTROY:<br>&nbsp;&nbsp; SwitchDesktop(hDesktopCurrent);<br>&nbsp;&nbsp; return DefWindowProc(hWnd, message, wParam, lParam);<br>&nbsp; default:<br>&nbsp;&nbsp; return DefWindowProc(hWnd, message, wParam, lParam);<br>&nbsp;&nbsp; }<br>&nbsp;&nbsp; return 0;<br>}</p>
<p>void StartMyExplore(void)<br>{<br>&nbsp;STARTUPINFO sui;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Process startup info<br>&nbsp;PROCESS_INFORMATION pi;&nbsp; // info returned from CreateProcess<br>&nbsp;//<br>&nbsp;// Most sui members will be 0<br>&nbsp;//<br>&nbsp;ZeroMemory ((PVOID)&amp;sui, sizeof(sui));</p>
<p>&nbsp;sui.cb = sizeof (sui);<br>&nbsp;//<br>&nbsp;// Need the lpDesktop member so the new process runs on this desktop<br>&nbsp;// The lpDesktop member was reserved in previous versions of NT<br>&nbsp;//<br>&nbsp;sui.lpDesktop = _T("llx");<br>&nbsp;CreateProcess (NULL,&nbsp;&nbsp; // image name<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "explorer", // command line<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NULL,&nbsp;&nbsp; // process security attributes<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NULL,&nbsp;&nbsp; // thread security attributes<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TRUE,&nbsp;&nbsp; // inherit handles<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CREATE_DEFAULT_ERROR_MODE|CREATE_SEPARATE_WOW_VDM,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NULL,&nbsp;&nbsp; // environment block<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NULL,&nbsp;&nbsp; // current directory<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;sui,&nbsp;&nbsp; // STARTUPINFO<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;pi);&nbsp;&nbsp; // PROCESS_INFORMATION<br>}</p>
<p>int CALLBACK WinMain( HINSTANCE hInstance,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HINSTANCE hPrevInstance,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LPSTR lpCmdLine,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int nCmdShow)<br>{<br>&nbsp;WNDCLASS wc;<br>&nbsp;wc.style = CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW;<br>&nbsp;wc.lpfnWndProc = WndProc;<br>&nbsp;wc.cbClsExtra = 0;<br>&nbsp;wc.cbWndExtra = 0;<br>&nbsp;wc.hInstance = hInstance;<br>&nbsp;wc.hIcon = LoadIcon (NULL, "IDI_SETTHREADDESKTOP");<br>&nbsp;wc.hCursor = LoadCursor (NULL, IDC_ARROW);<br>&nbsp;wc.hbrBackground = (HBRUSH)GetStockObject (WHITE_BRUSH);<br>&nbsp;wc.lpszMenuName = NULL;<br>&nbsp;wc.lpszClassName = "lilinxiang";<br>&nbsp;if(!RegisterClass(&amp;wc))<br>&nbsp;{<br>&nbsp; return TRUE;<br>&nbsp;}</p>
<p>&nbsp;hDesktopCurrent = NULL;<br>&nbsp;hDesktopCurrent = GetThreadDesktop(GetCurrentThreadId());</p>
<p>&nbsp;hDesktopLlx = NULL;<br>&nbsp;hDesktopLlx = OpenDesktop("llx", 0, FALSE, NULL);<br>&nbsp;&nbsp;&nbsp; if (hDesktopLlx != NULL)<br>&nbsp;{<br>&nbsp; CloseDesktop(hDesktopLlx);<br>&nbsp;}</p>
<p>&nbsp;SECURITY_ATTRIBUTES sa;<br>&nbsp;sa.bInheritHandle = TRUE;<br>&nbsp;sa.nLength = sizeof(SECURITY_ATTRIBUTES);<br>&nbsp;sa.lpSecurityDescriptor = NULL;</p>
<p>&nbsp;hDesktopLlx = CreateDesktop("llx", NULL,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NULL,0,MAXIMUM_ALLOWED,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NULL);<br>&nbsp;if(hDesktopLlx == NULL)<br>&nbsp;{<br>&nbsp; return 0;<br>&nbsp;}</p>
<p>&nbsp;if(!SetThreadDesktop(hDesktopLlx))<br>&nbsp;{<br>&nbsp; char szError[256] = {0};<br>&nbsp; ltoa( (long)(GetLastError()) , szError, 10);<br>&nbsp;}<br>&nbsp;SwitchDesktop(hDesktopLlx);</p>
<p>&nbsp;HWND hWnd = NULL;<br>&nbsp;hWnd = CreateWindow ("lilinxiang",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "hello, world!",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WS_OVERLAPPEDWINDOW,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CW_USEDEFAULT, <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0, <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CW_USEDEFAULT, <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0, <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NULL, <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NULL, <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hInstance, <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NULL<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; );<br>&nbsp;if(NULL == hWnd)<br>&nbsp;{<br>&nbsp; return TRUE;<br>&nbsp;}</p>
<p>&nbsp;//register hotkey for exit this desktop or switch to another desktop<br>&nbsp;//ShowWindow(hWnd, SW_SHOW);<br>&nbsp;//UpdateWindow(hWnd);<br>&nbsp;if(!RegisterHotKey(hWnd, 7777, MOD_CONTROL, 'Q'))<br>&nbsp;{//exit process<br>&nbsp; return TRUE;<br>&nbsp;}<br>&nbsp;if(!RegisterHotKey(hWnd, 7778, MOD_CONTROL | MOD_SHIFT, 'Q'))<br>&nbsp;{//switch to new desktop<br>&nbsp; return TRUE;<br>&nbsp;}<br>&nbsp;if(!RegisterHotKey(hWnd, 7779, MOD_CONTROL | MOD_SHIFT, 'W'))<br>&nbsp;{//switch to original desktop<br>&nbsp; return TRUE;<br>&nbsp;}<br>&nbsp;<br>&nbsp;StartMyExplore();</p>
<p>&nbsp;MSG msg;<br>&nbsp;while (GetMessage(&amp;msg, NULL,&nbsp; 0, 0))<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TranslateMessage(&amp;msg);// Translates virtual key codes<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DispatchMessage(&amp;msg); // Dispatches message to window<br>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;SwitchDesktop(hDesktopCurrent);<br>&nbsp;return TRUE;<br>}</p>
<p><br>//&nbsp;&nbsp; : )&nbsp; 好东西噢</p>
<p>用CreateDesktop新建一个桌面，什么都没有的桌面，然后在新桌面环境中运行了explorer所以就有了和windows一样功能的桌面，这个时候你就有了两个桌面了，下面要做的就是用SwitchDesktop切换不同的桌面了</p>
<p>在不同桌面中打开的程序在其他桌面的任务栏包括系统托盘上不可见，不过任务管理器中还是可见的这样你就非常方便的做很多事了，很多...&nbsp; 而且还可以非常快的转到正常状态上可以让会责骂你的人比如老板什么的无话可说，因为他们什么也看不到&nbsp; : )</p>
<p>或者你也可以给你用户定制一个个性化的桌面。改改上面的代码可以得到你要的效果的。</p>
<p><br>本文来自CSDN博客，转载请标明出处：<a href="http://blog.csdn.net/goingup/archive/2006/03/07/618323.aspx">http://blog.csdn.net/goingup/archive/2006/03/07/618323.aspx</a><font color=#002c99>用向导建立一个Win32程序&#8220;hello, world!&#8221;，然后用下面的内容替换整个CPP文件内容就可以了</font></p>
<font color=#002c99>
<p><br>#include "stdafx.h"<br>#include "resource.h"</p>
<p>#include "ShellApi.h"</p>
<p>HINSTANCE hInst = NULL;</p>
<p>HDESK hDesktopCurrent;<br>HDESK hDesktopLlx;</p>
<p>LONG APIENTRY WndProc(<br>&nbsp;&nbsp;&nbsp; HWND hWnd,<br>&nbsp;&nbsp;&nbsp; UINT message,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // type of message<br>&nbsp;&nbsp;&nbsp; WPARAM wParam,&nbsp;&nbsp;&nbsp;&nbsp; // additional information<br>&nbsp;&nbsp;&nbsp; LPARAM lParam)&nbsp;&nbsp;&nbsp;&nbsp; // additional information<br>{<br>&nbsp;int wmId, wmEvent;<br>&nbsp;PAINTSTRUCT ps;<br>&nbsp;HDC hdc;</p>
<p>&nbsp;switch (message) <br>&nbsp;{<br>&nbsp; case WM_COMMAND:<br>&nbsp;&nbsp; wmId&nbsp;&nbsp;&nbsp; = LOWORD(wParam); <br>&nbsp;&nbsp; wmEvent = HIWORD(wParam); <br>&nbsp;&nbsp; // Parse the menu selections:<br>&nbsp;&nbsp; switch (wmId)<br>&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; case IDM_ABOUT:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp; case IDM_EXIT:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DestroyWindow(hWnd);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp; default:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return DefWindowProc(hWnd, message, wParam, lParam);<br>&nbsp;&nbsp; }<br>&nbsp;&nbsp; break;<br>&nbsp; case WM_PAINT:<br>&nbsp;&nbsp; hdc = BeginPaint(hWnd, &amp;ps);<br>&nbsp;&nbsp; // TODO: Add any drawing code here...<br>&nbsp;&nbsp; RECT rt;<br>&nbsp;&nbsp; GetClientRect(hWnd, &amp;rt);<br>&nbsp;&nbsp; //DrawText(hdc, szHello, strlen(szHello), &amp;rt, DT_CENTER);<br>&nbsp;&nbsp; EndPaint(hWnd, &amp;ps);<br>&nbsp;&nbsp; break;<br>&nbsp; /*<br>&nbsp; case WM_DESTROY:<br>&nbsp;&nbsp; PostQuitMessage(0);<br>&nbsp;&nbsp; break;<br>&nbsp; //*/<br>&nbsp; case WM_LBUTTONDOWN:<br>&nbsp;&nbsp; break;<br>&nbsp; case WM_HOTKEY:<br>&nbsp;&nbsp; if(7777 == wParam)<br>&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; PostQuitMessage(0);<br>&nbsp;&nbsp; }<br>&nbsp;&nbsp; else if(7778 == wParam)<br>&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; SwitchDesktop(hDesktopCurrent);<br>&nbsp;&nbsp; }<br>&nbsp;&nbsp; else if(7779 == wParam)<br>&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; SwitchDesktop(hDesktopLlx);<br>&nbsp;&nbsp; }<br>&nbsp;&nbsp; break;<br>&nbsp; case WM_QUIT:<br>&nbsp; case WM_DESTROY:<br>&nbsp;&nbsp; SwitchDesktop(hDesktopCurrent);<br>&nbsp;&nbsp; return DefWindowProc(hWnd, message, wParam, lParam);<br>&nbsp; default:<br>&nbsp;&nbsp; return DefWindowProc(hWnd, message, wParam, lParam);<br>&nbsp;&nbsp; }<br>&nbsp;&nbsp; return 0;<br>}</p>
<p>void StartMyExplore(void)<br>{<br>&nbsp;STARTUPINFO sui;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Process startup info<br>&nbsp;PROCESS_INFORMATION pi;&nbsp; // info returned from CreateProcess<br>&nbsp;//<br>&nbsp;// Most sui members will be 0<br>&nbsp;//<br>&nbsp;ZeroMemory ((PVOID)&amp;sui, sizeof(sui));</p>
<p>&nbsp;sui.cb = sizeof (sui);<br>&nbsp;//<br>&nbsp;// Need the lpDesktop member so the new process runs on this desktop<br>&nbsp;// The lpDesktop member was reserved in previous versions of NT<br>&nbsp;//<br>&nbsp;sui.lpDesktop = _T("llx");<br>&nbsp;CreateProcess (NULL,&nbsp;&nbsp; // image name<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "explorer", // command line<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NULL,&nbsp;&nbsp; // process security attributes<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NULL,&nbsp;&nbsp; // thread security attributes<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TRUE,&nbsp;&nbsp; // inherit handles<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CREATE_DEFAULT_ERROR_MODE|CREATE_SEPARATE_WOW_VDM,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NULL,&nbsp;&nbsp; // environment block<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NULL,&nbsp;&nbsp; // current directory<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;sui,&nbsp;&nbsp; // STARTUPINFO<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;pi);&nbsp;&nbsp; // PROCESS_INFORMATION<br>}</p>
<p>int CALLBACK WinMain( HINSTANCE hInstance,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HINSTANCE hPrevInstance,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LPSTR lpCmdLine,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int nCmdShow)<br>{<br>&nbsp;WNDCLASS wc;<br>&nbsp;wc.style = CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW;<br>&nbsp;wc.lpfnWndProc = WndProc;<br>&nbsp;wc.cbClsExtra = 0;<br>&nbsp;wc.cbWndExtra = 0;<br>&nbsp;wc.hInstance = hInstance;<br>&nbsp;wc.hIcon = LoadIcon (NULL, "IDI_SETTHREADDESKTOP");<br>&nbsp;wc.hCursor = LoadCursor (NULL, IDC_ARROW);<br>&nbsp;wc.hbrBackground = (HBRUSH)GetStockObject (WHITE_BRUSH);<br>&nbsp;wc.lpszMenuName = NULL;<br>&nbsp;wc.lpszClassName = "lilinxiang";<br>&nbsp;if(!RegisterClass(&amp;wc))<br>&nbsp;{<br>&nbsp; return TRUE;<br>&nbsp;}</p>
<p>&nbsp;hDesktopCurrent = NULL;<br>&nbsp;hDesktopCurrent = GetThreadDesktop(GetCurrentThreadId());</p>
<p>&nbsp;hDesktopLlx = NULL;<br>&nbsp;hDesktopLlx = OpenDesktop("llx", 0, FALSE, NULL);<br>&nbsp;&nbsp;&nbsp; if (hDesktopLlx != NULL)<br>&nbsp;{<br>&nbsp; CloseDesktop(hDesktopLlx);<br>&nbsp;}</p>
<p>&nbsp;SECURITY_ATTRIBUTES sa;<br>&nbsp;sa.bInheritHandle = TRUE;<br>&nbsp;sa.nLength = sizeof(SECURITY_ATTRIBUTES);<br>&nbsp;sa.lpSecurityDescriptor = NULL;</p>
<p>&nbsp;hDesktopLlx = CreateDesktop("llx", NULL,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NULL,0,MAXIMUM_ALLOWED,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NULL);<br>&nbsp;if(hDesktopLlx == NULL)<br>&nbsp;{<br>&nbsp; return 0;<br>&nbsp;}</p>
<p>&nbsp;if(!SetThreadDesktop(hDesktopLlx))<br>&nbsp;{<br>&nbsp; char szError[256] = {0};<br>&nbsp; ltoa( (long)(GetLastError()) , szError, 10);<br>&nbsp;}<br>&nbsp;SwitchDesktop(hDesktopLlx);</p>
<p>&nbsp;HWND hWnd = NULL;<br>&nbsp;hWnd = CreateWindow ("lilinxiang",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "hello, world!",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WS_OVERLAPPEDWINDOW,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CW_USEDEFAULT, <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0, <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CW_USEDEFAULT, <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0, <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NULL, <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NULL, <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hInstance, <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NULL<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; );<br>&nbsp;if(NULL == hWnd)<br>&nbsp;{<br>&nbsp; return TRUE;<br>&nbsp;}</p>
<p>&nbsp;//register hotkey for exit this desktop or switch to another desktop<br>&nbsp;//ShowWindow(hWnd, SW_SHOW);<br>&nbsp;//UpdateWindow(hWnd);<br>&nbsp;if(!RegisterHotKey(hWnd, 7777, MOD_CONTROL, 'Q'))<br>&nbsp;{//exit process<br>&nbsp; return TRUE;<br>&nbsp;}<br>&nbsp;if(!RegisterHotKey(hWnd, 7778, MOD_CONTROL | MOD_SHIFT, 'Q'))<br>&nbsp;{//switch to new desktop<br>&nbsp; return TRUE;<br>&nbsp;}<br>&nbsp;if(!RegisterHotKey(hWnd, 7779, MOD_CONTROL | MOD_SHIFT, 'W'))<br>&nbsp;{//switch to original desktop<br>&nbsp; return TRUE;<br>&nbsp;}<br>&nbsp;<br>&nbsp;StartMyExplore();</p>
<p>&nbsp;MSG msg;<br>&nbsp;while (GetMessage(&amp;msg, NULL,&nbsp; 0, 0))<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TranslateMessage(&amp;msg);// Translates virtual key codes<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DispatchMessage(&amp;msg); // Dispatches message to window<br>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;SwitchDesktop(hDesktopCurrent);<br>&nbsp;return TRUE;<br>}</p>
<p><br>//&nbsp;&nbsp; : )&nbsp; 好东西噢</p>
<p>用CreateDesktop新建一个桌面，什么都没有的桌面，然后在新桌面环境中运行了explorer所以就有了和windows一样功能的桌面，这个时候你就有了两个桌面了，下面要做的就是用SwitchDesktop切换不同的桌面了</p>
<p>在不同桌面中打开的程序在其他桌面的任务栏包括系统托盘上不可见，不过任务管理器中还是可见的这样你就非常方便的做很多事了，很多...&nbsp; 而且还可以非常快的转到正常状态上可以让会责骂你的人比如老板什么的无话可说，因为他们什么也看不到&nbsp; : )</p>
<p>或者你也可以给你用户定制一个个性化的桌面。改改上面的代码可以得到你要的效果的。</font></p>
<img src ="http://www.cppblog.com/AutomateProgram/aggbug/109977.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/AutomateProgram/" target="_blank">漂漂</a> 2010-03-18 13:41 <a href="http://www.cppblog.com/AutomateProgram/archive/2010/03/18/109977.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>RegisterHotKey注册热键</title><link>http://www.cppblog.com/AutomateProgram/archive/2010/03/18/109970.html</link><dc:creator>漂漂</dc:creator><author>漂漂</author><pubDate>Thu, 18 Mar 2010 03:49:00 GMT</pubDate><guid>http://www.cppblog.com/AutomateProgram/archive/2010/03/18/109970.html</guid><wfw:comment>http://www.cppblog.com/AutomateProgram/comments/109970.html</wfw:comment><comments>http://www.cppblog.com/AutomateProgram/archive/2010/03/18/109970.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/AutomateProgram/comments/commentRss/109970.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/AutomateProgram/services/trackbacks/109970.html</trackback:ping><description><![CDATA[利用RegisterHotKey注册多个热键。自己定义系统的WM_HOTKEY消息<br>hotKeyDlg.h<br>&nbsp;afx_msg LONG OnHotKey(WPARAM wPARAM, LPARAM lPARAM);<br><br>hotKeyDlg.cpp<br>#define ID_EXIT&nbsp;&nbsp;&nbsp;0x5000<br>#define ID_SHOW&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0X6000&nbsp;<br><br>BEGIN_MESSAGE_MAP(CHotKeyDlg, CDialog)<br>&nbsp;//{{AFX_MSG_MAP(CHotKeyDlg)<br>&nbsp;ON_WM_SYSCOMMAND()<br>&nbsp;ON_WM_PAINT()<br>&nbsp;ON_WM_QUERYDRAGICON()<br>&nbsp;ON_MESSAGE(WM_HOTKEY, OnHotKey)<br><br>BOOL CHotKeyDlg::OnInitDialog()<br>{<br>...&nbsp;<br>::RegisterHotKey(m_hWnd, ID_EXIT, MOD_ALT, '5');<br>&nbsp;::RegisterHotKey(m_hWnd, ID_SHOW, MOD_ALT, '6');<br>}<br><br><br>LONG CHotKeyDlg::OnHotKey(WPARAM wParam,LPARAM lParam)<br>{<br>&nbsp;if (wParam == ID_EXIT)<br>&nbsp;{<br>&nbsp;&nbsp;PostMessage(WM_QUIT, NULL, NULL);<br>&nbsp;}<br>&nbsp;if(wParam == ID_SHOW)<br>&nbsp;{<br>&nbsp;&nbsp;AfxMessageBox("ALT + 6", 0, 0);<br>&nbsp;}<br>&nbsp;return 0;<br>}<br><br>void CHotKeyDlg::OnDestroy() <br>{<br>&nbsp;CDialog::OnDestroy();<br>&nbsp;UnregisterHotKey(m_hWnd, ID_EXIT);<br>&nbsp;UnregisterHotKey(m_hWnd, ID_SHOW);<br>}
<img src ="http://www.cppblog.com/AutomateProgram/aggbug/109970.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/AutomateProgram/" target="_blank">漂漂</a> 2010-03-18 11:49 <a href="http://www.cppblog.com/AutomateProgram/archive/2010/03/18/109970.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>WM_NCLBUTTONDOWN 消息</title><link>http://www.cppblog.com/AutomateProgram/archive/2010/03/18/109963.html</link><dc:creator>漂漂</dc:creator><author>漂漂</author><pubDate>Thu, 18 Mar 2010 02:40:00 GMT</pubDate><guid>http://www.cppblog.com/AutomateProgram/archive/2010/03/18/109963.html</guid><wfw:comment>http://www.cppblog.com/AutomateProgram/comments/109963.html</wfw:comment><comments>http://www.cppblog.com/AutomateProgram/archive/2010/03/18/109963.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/AutomateProgram/comments/commentRss/109963.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/AutomateProgram/services/trackbacks/109963.html</trackback:ping><description><![CDATA[msdn的解释：<br>
<p>The <strong>WM_NCLBUTTONDOWN</strong> message is posted when the user presses the left mouse button while the cursor is within the nonclient area of a window. This message is posted to the window that contains the cursor. If a window has captured the mouse, this message is not posted.</p>
使用WM_NCLBUTTONDOWN 消息：<br>利用标题栏的消息，欺骗windows使得点击客户区可实现窗体的移动。在打击客户区的时候假传消息给windows，告诉他现在左击标题栏。<br><br>void CDragWindowDlg::OnLButtonDown(UINT nFlags, CPoint point) <br>{<br>&nbsp;// TODO: Add your message handler code here and/or call default<br>&nbsp;PostMessage(WM_NCLBUTTONDOWN, HTCAPTION, MAKELPARAM(point.x, point.y));<br>&nbsp;CDialog::OnLButtonDown(nFlags, point);<br>}<br><br><a id=ctl03_TitleUrl class=singleposttitle href="http://www.cnblogs.com/pisceanfoot/archive/2009/09/24/1573272.html"><u><font color=#800080>C# 使用WM_NCLBUTTONDOWN消息实现任意位置移动窗体</font></u></a> <br><br><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;WM_NCLBUTTONDOWN&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #800080">0xA1</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;HT_CAPTION&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #800080">0x2</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;[DllImportAttribute(</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">user32.dll</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">)]<br></span><span style="COLOR: #000000">&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">extern</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;SendMessage(IntPtr&nbsp;hWnd,<br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;Msg,&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;wParam,&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;lParam);<br></span><span style="COLOR: #000000">[DllImportAttribute(</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">user32.dll</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">)]<br></span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">extern</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">bool</span><span style="COLOR: #000000">&nbsp;ReleaseCapture();<br></span><span style="COLOR: #000000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;</span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;Form1_MouseDown(</span><span style="COLOR: #0000ff">object</span><span style="COLOR: #000000">&nbsp;sender,&nbsp;MouseEventArgs&nbsp;e)<br></span><span style="COLOR: #000000">&nbsp;&nbsp;</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_428_705_Closed_Text></span><span id=Codehighlighter1_428_705_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(e.Button&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;MouseButtons.Left)<br></span><span id=Codehighlighter1_489_695_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #000000">&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;((e.Clicks&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #800080">1</span><span style="COLOR: #000000">))<br></span><span id=Codehighlighter1_544_681_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #000000">ReleaseCapture();<br></span><span style="COLOR: #000000"><br></span><span style="COLOR: #000000">SendMessage(</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.Handle,&nbsp;WM_NCLBUTTONDOWN,&nbsp;HT_CAPTION,&nbsp;</span><span style="COLOR: #800080">0</span><span style="COLOR: #000000">);<br></span><span style="COLOR: #000000">&nbsp;}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #000000">&nbsp;}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #000000">&nbsp;}</span></span>
<img src ="http://www.cppblog.com/AutomateProgram/aggbug/109963.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/AutomateProgram/" target="_blank">漂漂</a> 2010-03-18 10:40 <a href="http://www.cppblog.com/AutomateProgram/archive/2010/03/18/109963.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>COM聚合 用到的c++的一些东西</title><link>http://www.cppblog.com/AutomateProgram/archive/2010/03/16/109840.html</link><dc:creator>漂漂</dc:creator><author>漂漂</author><pubDate>Tue, 16 Mar 2010 10:49:00 GMT</pubDate><guid>http://www.cppblog.com/AutomateProgram/archive/2010/03/16/109840.html</guid><wfw:comment>http://www.cppblog.com/AutomateProgram/comments/109840.html</wfw:comment><comments>http://www.cppblog.com/AutomateProgram/archive/2010/03/16/109840.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/AutomateProgram/comments/commentRss/109840.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/AutomateProgram/services/trackbacks/109840.html</trackback:ping><description><![CDATA[<p>#include &lt;iostream&gt;<br>using namespace std;</p>
<p>class A<br>{<br>public:<br>&nbsp;virtual void FA() = 0;<br>};<br>class B<br>{<br>public:<br>&nbsp;virtual void FB() = 0;<br>};<br>class C : public A , public B<br>{<br>public:<br>&nbsp;void FA(){cout&lt;&lt;"FA"&lt;&lt;endl;}<br>&nbsp;void FB(){cout&lt;&lt;"FB"&lt;&lt;endl;}<br>};<br>int main()<br>{<br>&nbsp;C* mc = new C();<br>&nbsp;B* mb = static_cast&lt;B*&gt;(mc);<br>&nbsp;((A*)mb)-&gt;FA();<br>&nbsp;return 0;<br>}<br><br>输出的是FB, com中利用这机制实现了聚合。</p>
<img src ="http://www.cppblog.com/AutomateProgram/aggbug/109840.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/AutomateProgram/" target="_blank">漂漂</a> 2010-03-16 18:49 <a href="http://www.cppblog.com/AutomateProgram/archive/2010/03/16/109840.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DllMain详解和DLL 实践说明 (DllMain的使用)</title><link>http://www.cppblog.com/AutomateProgram/archive/2010/03/15/109718.html</link><dc:creator>漂漂</dc:creator><author>漂漂</author><pubDate>Mon, 15 Mar 2010 01:24:00 GMT</pubDate><guid>http://www.cppblog.com/AutomateProgram/archive/2010/03/15/109718.html</guid><wfw:comment>http://www.cppblog.com/AutomateProgram/comments/109718.html</wfw:comment><comments>http://www.cppblog.com/AutomateProgram/archive/2010/03/15/109718.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/AutomateProgram/comments/commentRss/109718.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/AutomateProgram/services/trackbacks/109718.html</trackback:ping><description><![CDATA[<p>原文地址：<a href="http://blog.csdn.net/benkaoya/archive/2008/06/02/2504781.aspx">http://blog.csdn.net/benkaoya/archive/2008/06/02/2504781.aspx</a><br><br>1&nbsp; DLL的进入/退出函数<br>1.1&nbsp; DllMain简介<br>跟exe有个main或者WinMain入口函数一样，DLL也有一个入口函数，就是DllMain。以&#8220;DllMain&#8221;为关键字，来看看MSDN帮助文档怎么介绍这个函数的。<br>The DllMain function is an optional method of entry into a dynamic-link library (DLL)。（简要翻译：对于一个Dll模块，DllMain函数是可选的。）这句话很重要，很多初学者可能都认为一个动态链接库肯定要有DllMain函数。其实不然，像很多仅仅包含资源信息的DLL是没有DllMain函数的。<br>1.2 何时调用DllMain<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 系统是在什么时候调用DllMain函数的呢？静态链接时，或动态链接时调用LoadLibrary和FreeLibrary都会调用DllMain函数。DllMain的第三个参数fdwReason指明了系统调用Dll的原因，它可能是DLL_PROCESS_ATTACH、DLL_PROCESS_DETACH、DLL_THREAD_ATTACH和DLL_THREAD_DETACH。以下从这四种情况来分析系统何时调用了DllMain。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>1.2.1 DLL_PROCESS_ATTACH<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 大家都知道，一个程序要调用Dll里的函数，首先要先把DLL文件映射到进程的地址空间。要把一个DLL文件映射到进程的地址空间，有两种方法：静态链接和动态链接的LoadLibrary或者LoadLibraryEx。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当一个DLL文件被映射到进程的地址空间时，系统调用该DLL的DllMain函数，传递的fdwReason参数为DLL_PROCESS_ATTACH。这种调用只会发生在第一次映射时。如果同一个进程后来为已经映射进来的DLL再次调用LoadLibrary或者LoadLibraryEx，操作系统只会增加DLL的使用次数，它不会再用DLL_PROCESS_ATTACH调用DLL的DllMain函数。不同进程用LoadLibrary同一个DLL时，每个进程的第一次映射都会用DLL_PROCESS_ATTACH调用DLL的DllMain函数。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 可参考DllMainTest的DLL_PROCESS_ATTACH_Test函数。<br>1.2.2 DLL_PROCESS_DETACH<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当DLL被从进程的地址空间解除映射时，系统调用了它的DllMain，传递的fdwReason值是DLL_PROCESS_DETACH。当DLL处理该值时，它应该执行进程相关的清理工作。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 那么什么时候DLL被从进程的地址空间解除映射呢？两种情况：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ◆FreeLibrary解除DLL映射（有几个LoadLibrary，就要有几个FreeLibrary）<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ◆进程结束而解除DLL映射，在进程结束前还没有解除DLL的映射，进程结束后会解除DLL映射。（如果进程的终结是因为调用了TerminateProcess，系统就不会用DLL_PROCESS_DETACH来调用DLL的DllMain函数。这就意味着DLL在进程结束前没有机会执行任何清理工作。）<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 注意：当用DLL_PROCESS_ATTACH调用DLL的DllMain函数时，如果返回FALSE，说明没有初始化成功，系统仍会用DLL_PROCESS_DETACH调用DLL的DllMain函数。因此，必须确保没有清理那些没有成功初始化的东西。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 可参考DllMainTest的DLL_PROCESS_DETACH_Test函数。<br>1.2.3 DLL_THREAD_ATTACH<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当进程创建一线程时，系统查看当前映射到进程地址空间中的所有DLL文件映像，并用值DLL_THREAD_ATTACH调用DLL的DllMain函数。<br>新创建的线程负责执行这次的DLL的DllMain函数，只有当所有的DLL都处理完这一通知后，系统才允许进程开始执行它的线程函数。<br>注意跟DLL_PROCESS_ATTACH的区别，我们在前面说过，第n(n&gt;=2)次以后地把DLL映像文件映射到进程的地址空间时，是不再用DLL_PROCESS_ATTACH调用DllMain的。而DLL_THREAD_ATTACH不同，进程中的每次建立线程，都会用值DLL_THREAD_ATTACH调用DllMain函数，哪怕是线程中建立线程也一样。<br>1.2.4 DLL_THREAD_DETACH<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果线程调用了ExitThread来结束线程（线程函数返回时，系统也会自动调用ExitThread），系统查看当前映射到进程空间中的所有DLL文件映像，并用DLL_THREAD_DETACH来调用DllMain函数，通知所有的DLL去执行线程级的清理工作。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 注意：如果线程的结束是因为系统中的一个线程调用了TerminateThread，系统就不会用值DLL_THREAD_DETACH来调用所有DLL的DllMain函数。<br>1.3&nbsp; 为DllMain换名<br>在早期的SDK版本中，DllMain是叫做DllEntryPoint。其实有一件鲜为人知的事：一个Dll的入口函数名是可以自己定义的。下面我将以VC++6.0为例来演示如何更改。首先要说明一点，虽然DllMain可以换成其他函数名，但函数的参数和返回值必须和DllMain一样。而且这个函数要为__stdcall类型（DllMain本身也是__stdcall类型）。<br>打开VC++菜单Project\Settings\Link tab\ Output in the Category box，如下图，在Entry-point symbol中输入要替换DllMain的函数名（当然这个函数名是你程序中已经实现的函数）。Entry-point symbol是干么的呢？可以以关键字&#8220;Entry-point symbol&#8221;搜索MSDN帮助文档查看，搜索时，打钩&#8220;仅搜索标题&#8221;会更快定位。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 按OK后，如果马上编译的话会出现如下错误：<br>LIBCMTD.lib(crt0.obj) : error LNK2001: unresolved external symbol _main<br>Debug/Dll.dll : fatal error LNK1120: 1 unresolved externals<br>打开VC++菜单Project\Settings\C/C++选项卡，如下图，在Project Options：末尾的地方添加&#8221;/D&#8221;（图中蓝色高亮的地方），要注意位置，我试了，要把/D放到/GZ后面也会链接错误，我也不懂为什么，^_^。按OK，再次编译，成功。大家可以自己测试下到底有没有更改成功，什么，如果测试？打出调式信息啊。</p>
<p>1.4 DisableThreadLibraryCalls<br>看帮助就知道它是干么用的：<br>The DisableThreadLibraryCalls function disables the DLL_THREAD_ATTACH and DLL_THREAD_DETACH notifications for the dynamic-link library (DLL) specified by hLibModule. This can reduce the size of the working code set for some applications.<br><br>原文地址：<a href="http://www.blogjava.net/Yipak/articles/182025.html">http://www.blogjava.net/Yipak/articles/182025.html</a><br></p>
<div style="MARGIN: 15px">DllMain的使用：<br>DllMain函数是DLL模块的默认入口点。当Windows加载DLL模块时调用这一函数。系统首先调用全局对象的构造函数，然后调用全局函数 DLLMain。DLLMain函数不仅在将DLL链接加载到进程时被调用，在DLL模块与进程分离时（以及其它时候）也被调用。下面是一个框架 DLLMain函数的例子。<br><br>如果我们在DllMain中写入下面的代码（在原来的gandll.c中添加下面的代码）：<br><span style="COLOR: rgb(0,1,255)">BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)</span><br style="COLOR: rgb(0,1,255)"><span style="COLOR: rgb(0,1,255)">{</span><br style="COLOR: rgb(0,1,255)"><span style="COLOR: rgb(0,1,255)">&nbsp;&nbsp;&nbsp; printf("hModule.%p lpReserved.%p \n", hModule, lpReserved);</span><br style="COLOR: rgb(0,1,255)"><br style="COLOR: rgb(0,1,255)"><span style="COLOR: rgb(0,1,255)">&nbsp;&nbsp;&nbsp; switch (ul_reason_for_call)</span><br style="COLOR: rgb(0,1,255)"><span style="COLOR: rgb(0,1,255)">&nbsp;&nbsp;&nbsp; {</span><br style="COLOR: rgb(0,1,255)"><span style="COLOR: rgb(0,1,255)">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case DLL_PROCESS_ATTACH:</span><br style="COLOR: rgb(0,1,255)"><span style="COLOR: rgb(0,1,255)">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("Process attach. \n");</span><br style="COLOR: rgb(0,1,255)"><span style="COLOR: rgb(0,1,255)">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;</span><br style="COLOR: rgb(0,1,255)"><br style="COLOR: rgb(0,1,255)"><span style="COLOR: rgb(0,1,255)">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case DLL_PROCESS_DETACH:</span><br style="COLOR: rgb(0,1,255)"><span style="COLOR: rgb(0,1,255)">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("Process detach. \n");</span><br style="COLOR: rgb(0,1,255)"><span style="COLOR: rgb(0,1,255)">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;</span><br style="COLOR: rgb(0,1,255)"><br style="COLOR: rgb(0,1,255)"><span style="COLOR: rgb(0,1,255)">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case DLL_THREAD_ATTACH:</span><br style="COLOR: rgb(0,1,255)"><span style="COLOR: rgb(0,1,255)">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("Thread attach. \n");</span><br style="COLOR: rgb(0,1,255)"><span style="COLOR: rgb(0,1,255)">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;</span><br style="COLOR: rgb(0,1,255)"><br style="COLOR: rgb(0,1,255)"><span style="COLOR: rgb(0,1,255)">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case DLL_THREAD_DETACH:</span><br style="COLOR: rgb(0,1,255)"><span style="COLOR: rgb(0,1,255)">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("Thread detach. \n");</span><br style="COLOR: rgb(0,1,255)"><span style="COLOR: rgb(0,1,255)">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;</span><br style="COLOR: rgb(0,1,255)"><span style="COLOR: rgb(0,1,255)">&nbsp;&nbsp;&nbsp; }</span><br style="COLOR: rgb(0,1,255)"><br style="COLOR: rgb(0,1,255)"><span style="COLOR: rgb(0,1,255)">&nbsp;&nbsp;&nbsp; return (TRUE);</span><br style="COLOR: rgb(0,1,255)"><span style="COLOR: rgb(0,1,255)">}</span><br><br>同时将dlltest\dlltest.c修改为：<br><span style="COLOR: rgb(0,1,255)">#include &lt;stdio.h&gt;</span><br style="COLOR: rgb(0,1,255)"><span style="COLOR: rgb(0,1,255)">#include "dlltest.h"</span><br style="COLOR: rgb(0,1,255)"><br style="COLOR: rgb(0,1,255)"><span style="COLOR: rgb(0,1,255)">int main(int argc, char **argv)</span><br style="COLOR: rgb(0,1,255)"><span style="COLOR: rgb(0,1,255)">{</span><br style="COLOR: rgb(0,1,255)"><span style="COLOR: rgb(0,1,255)">&nbsp;&nbsp;&nbsp; printf("Simple DLL test start. \n");</span><br style="COLOR: rgb(0,1,255)"><br style="COLOR: rgb(0,1,255)"><span style="COLOR: rgb(0,1,255)">&nbsp;&nbsp;&nbsp; printf("Call DLL function: \n");</span><br style="COLOR: rgb(0,1,255)"><span style="COLOR: rgb(0,1,255)">&nbsp;&nbsp;&nbsp; printf("Test DLL values: %d \n", add2(1, 2));</span><br style="COLOR: rgb(0,1,255)"><span style="COLOR: rgb(0,1,255)">&nbsp;&nbsp;&nbsp; printf("Call DLL function end. \n");</span><br style="COLOR: rgb(0,1,255)"><br style="COLOR: rgb(0,1,255)"><span style="COLOR: rgb(0,1,255)">&nbsp;&nbsp;&nbsp; printf("Simple DLL test end. \n");</span><br style="COLOR: rgb(0,1,255)"><br style="COLOR: rgb(0,1,255)"><span style="COLOR: rgb(0,1,255)">&nbsp;&nbsp;&nbsp; return (0);</span><br style="COLOR: rgb(0,1,255)"><span style="COLOR: rgb(0,1,255)">}</span><br><br>我简单的测试一下输出结果为：<br><span style="COLOR: rgb(0,1,255)">C:\gandll\dlltest&gt;dlltest</span><br style="COLOR: rgb(0,1,255)"><span style="COLOR: rgb(0,1,255)">hModule.10000000 lpReserved.0012FD30</span><br style="COLOR: rgb(0,1,255)"><span style="COLOR: rgb(0,1,255)">Process attach.</span><br style="COLOR: rgb(0,1,255)"><span style="COLOR: rgb(0,1,255)">Simple DLL test start.</span><br style="COLOR: rgb(0,1,255)"><span style="COLOR: rgb(0,1,255)">Call DLL function:</span><br style="COLOR: rgb(0,1,255)"><span style="COLOR: rgb(0,1,255)">Test DLL values: 3</span><br style="COLOR: rgb(0,1,255)"><span style="COLOR: rgb(0,1,255)">Call DLL function end.</span><br style="COLOR: rgb(0,1,255)"><span style="COLOR: rgb(0,1,255)">Simple DLL test end.</span><br style="COLOR: rgb(0,1,255)"><span style="COLOR: rgb(0,1,255)">hModule.10000000 lpReserved.00000001</span><br style="COLOR: rgb(0,1,255)"><span style="COLOR: rgb(0,1,255)">Process detach.</span><br>也就是说DLL加载和应用程序退出的使用都会调用该函数（DllMain）的哦， 是应用程序一上来就调用的，不是用到该函数时才调用的！<br><br>好象有个问题：<br>下面的话来源：<a href="http://waiguai.blogdriver.com/waiguai/989918.html" target=_blank><font color=#2e9ce9>http://waiguai.blogdriver.com/waiguai/989918.html</font></a><br>采用隐式链接方式，程序员在建立一个DLL文件时，链接程序会自动生成一个与之对应的LIB导入文件。该文件包含了每一个DLL导出函数的符号名和可选的标识号，但是并不含有实际的代码。LIB文件作为DLL的替代文件被编译到应用程序项目中。当程序员通过静态链接方式编译生成应用程序时，应用程序中的调用函数与LIB文件中导出符号相匹配，这些符号或标识号进入到生成的EXE文件中。LIB文件中也包含了对应的DLL文件名（但不是完全的路径名），链接程序将其存储在EXE文件内部。当应用程序运行过程中需要加载DLL文件时，Windows根据这些信息发现并加载DLL，然后通过符号名或标识号实现对 DLL函数的动态链接。<br><br>我们看他说的&#8220;当应用程序运行过程中需要加载DLL文件时&#8221;， 我做的实验测试的是，在输出<br>Simple DLL test start.<br>Call DLL function:<br>这两行应该是不需要DLL的啊， 怎么应用程序在前面输出了：<br>hModule.10000000 lpReserved.0012FD30<br>Process attach.<br>这个呢？ 这就说明其实应用程序一上来就调用了DLL的（还有一种可能就是他是正确的，由于编译器优化的原因使的该DLL一上来就被调用了）。<br>到地是为什么？ 再查，再查。。。。。。 <br><br><br></div>
<div style="MARGIN: 15px">例子：<br>创建一个简单的DLL工程。<br>MyDllMain.<br>修改MyDllMain.cpp<br>#include "stdafx.h"<br>#include &lt;stdio.h&gt;</div>
<div style="MARGIN: 15px">BOOL APIENTRY DllMain( HANDLE hModule, <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DWORD&nbsp; ul_reason_for_call, <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LPVOID lpReserved<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br>{<br>&nbsp;printf("hModule.%p lpReserved.%p \n", hModule, lpReserved);<br>&nbsp; switch (ul_reason_for_call)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case DLL_PROCESS_ATTACH:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("Process attach. \n");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;</div>
<div style="MARGIN: 15px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case DLL_PROCESS_DETACH:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("Process detach. \n");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;</div>
<div style="MARGIN: 15px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case DLL_THREAD_ATTACH:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("Thread attach. \n");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;</div>
<div style="MARGIN: 15px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case DLL_THREAD_DETACH:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("Thread detach. \n");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; return TRUE;<br>}<br><br>创建一个.CPP文件<br>#include "StdAfx.h"</div>
<div style="MARGIN: 15px">extern "C" int _declspec(dllexport) add(int a, int b)<br>{<br>&nbsp;return a + b;<br>}<br><br>新建一个测试工程：<br>TestMainDll<br>TestMainDll.cpp<br><br>#include "stdafx.h"<br>#include &lt;iostream&gt;<br>#include &lt;windows.h&gt;<br>using namespace std;</div>
<div style="MARGIN: 15px">typedef int (*Fun)(int, int);<br>HINSTANCE hInstance;<br>Fun fun;</div>
<div style="MARGIN: 15px">int main(int argc, char* argv[])<br>{<br>&nbsp;hInstance = LoadLibrary("MyDllMain.dll");</div>
<div style="MARGIN: 15px">&nbsp;&nbsp;&nbsp; if (!hInstance)<br>&nbsp;&nbsp;cout&lt;&lt;"Not Find this Dll"&lt;&lt;endl;<br>&nbsp;&nbsp;&nbsp; fun = (Fun)GetProcAddress(hInstance, "add");<br>&nbsp;&nbsp;&nbsp; cout&lt;&lt;fun(12,3)&lt;&lt;endl;;<br>&nbsp;&nbsp;&nbsp; FreeLibrary(hInstance);</div>
<div style="MARGIN: 15px">&nbsp;<br>&nbsp;printf("Hello World!\n");<br>&nbsp;return 0;<br>}<br></div>
<img src ="http://www.cppblog.com/AutomateProgram/aggbug/109718.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/AutomateProgram/" target="_blank">漂漂</a> 2010-03-15 09:24 <a href="http://www.cppblog.com/AutomateProgram/archive/2010/03/15/109718.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DLL 中 .def文件的使用</title><link>http://www.cppblog.com/AutomateProgram/archive/2010/03/13/109614.html</link><dc:creator>漂漂</dc:creator><author>漂漂</author><pubDate>Sat, 13 Mar 2010 08:45:00 GMT</pubDate><guid>http://www.cppblog.com/AutomateProgram/archive/2010/03/13/109614.html</guid><wfw:comment>http://www.cppblog.com/AutomateProgram/comments/109614.html</wfw:comment><comments>http://www.cppblog.com/AutomateProgram/archive/2010/03/13/109614.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/AutomateProgram/comments/commentRss/109614.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/AutomateProgram/services/trackbacks/109614.html</trackback:ping><description><![CDATA[原文地址：<a href="http://www.cppblog.com/amyvmiwei/archive/2008/01/02/40203.html">http://www.cppblog.com/amyvmiwei/archive/2008/01/02/40203.html</a><br><br>DLL中导出函数的声明有两种方式：一种为在函数声明中加上__declspec(dllexport)，这里不再举例说明；另外一种方式是采用模块定义(.def) 文件声明，.def文件为链接器提供了有关被链接程序的导出、属性及其他方面的信息。<br><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 首先创建 一个DLL程序，.cpp中<br>int __stdcall Add(int numa, int numb)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return (numa + numb);<br>}
<p>int __stdcall Sub(int numa, int numb)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return (numa - numb);<br>}<br><br>然后创建一个.def的文件，在里面加上<br></p>
<p class=code>;DllTestDef.lib : 导出DLL函数<br>;作者：----<br>LIBRARY defDll.dll<br>EXPORTS <br>Add @ 1<br>Sub @ 2<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;最后创建一个测试程序：.cpp文件如下：<br>#include &lt;iostream&gt;<br>#include &lt;windows.h&gt;<br>using namespace std;</p>
<p class=code>typedef int (__stdcall *Fun)(int , int);<br>HINSTANCE hInstance;<br>Fun fun;</p>
<p class=code>int main()<br>{<br>&nbsp;hInstance = LoadLibrary("defDll.dll");</p>
<p class=code>&nbsp;if (!hInstance)<br>&nbsp;&nbsp;cout&lt;&lt;"Not Find this Dll"&lt;&lt;endl;<br>&nbsp;fun = (Fun)GetProcAddress(hInstance, MAKEINTRESOURCE(1));<br>&nbsp;cout&lt;&lt;fun(12,3)&lt;&lt;endl;;<br>&nbsp;fun = (Fun)GetProcAddress(hInstance, "Sub");<br>&nbsp;cout&lt;&lt;fun(7, 3)&lt;&lt;endl;<br>&nbsp;FreeLibrary(hInstance);<br>}</p>
<p class=code></p>
<br><br>说明：<br>.def文件的规则为：<br><br>　　(1)LIBRARY语句说明.def文件相应的DLL；<br><br>　　(2)EXPORTS语句后列出要导出函数的名称。可以在.def文件中的导出函数名后加@n，表示要导出函数的序号为n（在进行函数调用时，这个序号将发挥其作用）；<br><br>　　(3).def 文件中的注释由每个注释行开始处的分号 (;) 指定，且注释不能与语句共享一行。<br>
<img src ="http://www.cppblog.com/AutomateProgram/aggbug/109614.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/AutomateProgram/" target="_blank">漂漂</a> 2010-03-13 16:45 <a href="http://www.cppblog.com/AutomateProgram/archive/2010/03/13/109614.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CBitmap, HBITMAP和LoadImage</title><link>http://www.cppblog.com/AutomateProgram/archive/2010/01/24/106337.html</link><dc:creator>漂漂</dc:creator><author>漂漂</author><pubDate>Sun, 24 Jan 2010 07:40:00 GMT</pubDate><guid>http://www.cppblog.com/AutomateProgram/archive/2010/01/24/106337.html</guid><wfw:comment>http://www.cppblog.com/AutomateProgram/comments/106337.html</wfw:comment><comments>http://www.cppblog.com/AutomateProgram/archive/2010/01/24/106337.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/AutomateProgram/comments/commentRss/106337.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/AutomateProgram/services/trackbacks/106337.html</trackback:ping><description><![CDATA[<p><a href="http://blog.csdn.net/newstarao/archive/2009/05/22/4209656.aspx">http://blog.csdn.net/newstarao/archive/2009/05/22/4209656.aspx</a><br><br>hbitmap是bitmap的指针，</p>
<p>msdn中：</p>
<p>Handle to a bitmap.typedef HANDLE HBITMAP;</p>
<p>cbitmap是mfc中封装bitmap的类；</p>
<p>msdn中：</p>
<p>Encapsulates（囊括） a Windows graphics device interface (GDI) bitmap and provides member functions to manipulate（操作） the bitmap. </p>
<p>&nbsp; <br>class CBitmap : public CGdiObject转化方法两种，<br>Attach和FromHandle：<br>CBitmap bmp;<br>bmp.LoadBitmap(IDB_BITMAP1);<br>HBITMAP hbm = (HBITMAP)bmp;<br>CBitmap bmp1;<br>bmp1.Attach(hbm);<br>HBITMAP = CBitmap.m_hObject;<br>CBitmap* = CBitmap.FromHandle(HBITMAP)//已知<br>HBITMAP hbit;<br>CBitmap cb;<br>cb.FromHandle(hbit);//已知<br>CBitmap cb;<br>HBITMAP hbit=(HBITMAP)cb;<br>CBitmap bmp;HBITMAP hBmp;<br>相互转换：hBmp=(HBITMAP)bmp.GetSafeHandle();bmp.Attach(hBmp);<br>注意点：Attach和FromHandle的区别FromHandle得到的指针是临时变量，,通过Attach连接的句柄可以长久保留,但通过FromHandle得到的只是暂时的,大概只在一个消息区间内有效,很快便会被删除,所以基本上不能用。我用了FromHandle然后一直出错！！！ <br><br>CBitmap 无法从文件中加载位图，可以用下面的方法解决。</p>
&nbsp;HBITMAP hBitmap;<br>&nbsp;//hBitmap = (HBITMAP)::LoadImage(::AfxGetInstanceHandle(), "NetFriend.bmp", IMAGE_BITMAP, 0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION);//从文件中加载，<br>&nbsp;hBitmap = (HBITMAP)::LoadImage(::AfxGetInstanceHandle(), MAKEINTRESOURCE(IDB_BITMAP1), IMAGE_BITMAP, 0,0,LR_CREATEDIBSECTION);//从资源文件中加载 
<img src ="http://www.cppblog.com/AutomateProgram/aggbug/106337.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/AutomateProgram/" target="_blank">漂漂</a> 2010-01-24 15:40 <a href="http://www.cppblog.com/AutomateProgram/archive/2010/01/24/106337.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VC下显示位图的几种方法（转）</title><link>http://www.cppblog.com/AutomateProgram/archive/2010/01/24/106336.html</link><dc:creator>漂漂</dc:creator><author>漂漂</author><pubDate>Sun, 24 Jan 2010 07:36:00 GMT</pubDate><guid>http://www.cppblog.com/AutomateProgram/archive/2010/01/24/106336.html</guid><wfw:comment>http://www.cppblog.com/AutomateProgram/comments/106336.html</wfw:comment><comments>http://www.cppblog.com/AutomateProgram/archive/2010/01/24/106336.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/AutomateProgram/comments/commentRss/106336.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/AutomateProgram/services/trackbacks/106336.html</trackback:ping><description><![CDATA[VC下显示位图的几种方法<br>总结一下关于位图的几种用法。<br>说到这还是开头给大家介绍一下，有关位图的知识吧，以及对于我们比较有用的几个关于位图的结构体。<br>一.位图结构如下：
<div>&nbsp;</div>
<div>----&nbsp;一、BMP文件结构&nbsp;<br>----&nbsp;1.&nbsp;BMP文件组成&nbsp;<br>----&nbsp;BMP文件由文件头、位图信息头、颜色信息和图形数据四部分组成。&nbsp;<br>----&nbsp;2.&nbsp;BMP文件头&nbsp;<br>----&nbsp;BMP文件头数据结构含有BMP文件的类型、文件大小和位图起始位置等信息。&nbsp;<br>----&nbsp;其结构定义如下:&nbsp;&nbsp;<br>typedef&nbsp;struct&nbsp;tagBITMAPFILEHEADER<br>{<br>WORDbfType;&nbsp;&nbsp;&nbsp;//&nbsp;位图文件的类型，必须为BM<br>DWORD&nbsp;&nbsp;&nbsp;bfSize;&nbsp;&nbsp;&nbsp;//&nbsp;位图文件的大小，以字节为单位<br>WORDbfReserved1;&nbsp;&nbsp;//&nbsp;位图文件保留字，必须为0<br>WORDbfReserved2;&nbsp;&nbsp;//&nbsp;位图文件保留字，必须为0<br>DWORD&nbsp;&nbsp;&nbsp;bfOffBits;&nbsp;//&nbsp;位图数据的起始位置，以相对于位图<br>//&nbsp;文件头的偏移量表示，以字节为单位<br>}&nbsp;BITMAPFILEHEADER;<br>----&nbsp;3.&nbsp;位图信息头&nbsp;&nbsp;<br>BMP位图信息头数据用于说明位图的尺寸等信息。<br>typedef&nbsp;struct&nbsp;tagBITMAPINFOHEADER{<br>&nbsp;&nbsp;&nbsp;DWORD&nbsp;&nbsp;biSize;&nbsp;&nbsp;&nbsp;//&nbsp;本结构所占用字节数<br>&nbsp;&nbsp;&nbsp;LONGbiWidth;&nbsp;&nbsp;//&nbsp;位图的宽度，以像素为单位<br>&nbsp;&nbsp;&nbsp;LONGbiHeight;&nbsp;//&nbsp;位图的高度，以像素为单位<br>&nbsp;&nbsp;&nbsp;WORD&nbsp;&nbsp;&nbsp;biPlanes;&nbsp;//&nbsp;目标设备的级别，必须为1<br>&nbsp;&nbsp;&nbsp;WORD&nbsp;&nbsp;&nbsp;biBitCount//&nbsp;每个像素所需的位数，必须是1(双色),<br>&nbsp;&nbsp;//&nbsp;4(16色)，8(256色)或24(真彩色)之一<br>&nbsp;&nbsp;&nbsp;DWORD&nbsp;&nbsp;biCompression;&nbsp;&nbsp;&nbsp;//&nbsp;位图压缩类型，必须是&nbsp;0(不压缩),<br>&nbsp;&nbsp;//&nbsp;1(BI_RLE8压缩类型)或2(BI_RLE4压缩类型)之一<br>&nbsp;&nbsp;&nbsp;DWORD&nbsp;&nbsp;biSizeImage;&nbsp;//&nbsp;位图的大小，以字节为单位<br>&nbsp;&nbsp;&nbsp;LONGbiXPelsPerMeter;&nbsp;//&nbsp;位图水平分辨率，每米像素数<br>&nbsp;&nbsp;&nbsp;LONGbiYPelsPerMeter;&nbsp;&nbsp;//&nbsp;位图垂直分辨率，每米像素数<br>&nbsp;&nbsp;&nbsp;DWORD&nbsp;&nbsp;biClrUsed;//&nbsp;位图实际使用的颜色表中的颜色数<br>&nbsp;&nbsp;&nbsp;DWORD&nbsp;&nbsp;biClrImportant;//&nbsp;位图显示过程中重要的颜色数<br>}&nbsp;BITMAPINFOHEADER;&nbsp;<br>----&nbsp;4.&nbsp;颜色表&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;颜色表用于说明位图中的颜色，它有若干个表项，每一个表项是一个RGBQUAD类型的结构，定义一种颜色。RGBQUAD结构的定义如下:&nbsp;<br>typedef&nbsp;struct&nbsp;tagRGBQUAD&nbsp;{</div>
<div>BYTErgbBlue;//&nbsp;蓝色的亮度(值范围为0-255)<br>BYTErgbGreen;&nbsp;&nbsp;&nbsp;//&nbsp;绿色的亮度(值范围为0-255)<br>BYTErgbRed;&nbsp;//&nbsp;红色的亮度(值范围为0-255)<br>BYTErgbReserved;//&nbsp;保留，必须为0<br>}&nbsp;RGBQUAD;<br>颜色表中RGBQUAD结构数据的个数有biBitCount来确定:<br>当biBitCount=1,4,8时，分别有2,16,256个表项;<br>当biBitCount=24时，没有颜色表项。<br>&nbsp;&nbsp;&nbsp;位图信息头和颜色表组成位图信息，BITMAPINFO结构定义如下:<br>typedef&nbsp;struct&nbsp;tagBITMAPINFO&nbsp;{<br>&nbsp;&nbsp;&nbsp;BITMAPINFOHEADER&nbsp;bmiHeader;&nbsp;&nbsp;&nbsp;//&nbsp;位图信息头<br>&nbsp;&nbsp;&nbsp;RGBQUAD&nbsp;&nbsp;bmiColors[1];&nbsp;&nbsp;//&nbsp;颜色表<br>}&nbsp;BITMAPINFO;<br>下面我们介绍第一种办法：<br>//第一种方法，使用WM__CTRLCOLOR来实现<br>/*******************OnCtlColor中添加的代码*****************/<br>HBRUSH&nbsp;CDemoBitmapDlg::OnCtlColor(CDC*&nbsp;pDC,&nbsp;CWnd*&nbsp;pWnd,&nbsp;UINT&nbsp;nCtlColor)&nbsp;<br>{<br>&nbsp;HBRUSH&nbsp;hbr&nbsp;=&nbsp;CDialog::OnCtlColor(pDC,&nbsp;pWnd,&nbsp;nCtlColor);<br>&nbsp;<br>&nbsp;//&nbsp;TODO:&nbsp;Change&nbsp;any&nbsp;attributes&nbsp;of&nbsp;the&nbsp;DC&nbsp;here<br>&nbsp;//第一种实现方法<br>&nbsp;if(nCtlColor=CTLCOLOR_DLG)<br>&nbsp;{<br>&nbsp;&nbsp;return&nbsp;brush;<br>&nbsp;}<br>&nbsp;//&nbsp;TODO:&nbsp;Return&nbsp;a&nbsp;different&nbsp;brush&nbsp;if&nbsp;the&nbsp;default&nbsp;is&nbsp;not&nbsp;desired<br>&nbsp;return&nbsp;hbr;<br>}</div>
<div>BOOL&nbsp;CDemoBitmapDlg::OnInitDialog()<br>{<br>&nbsp;//第一种方法，使用wm_ctlcolor来实现<br>&nbsp;CBitmap&nbsp;bitmap;<br>&nbsp;bitmap.LoadBitmap(IDB_BITMAP1);<br>&nbsp;brush.CreatePatternBrush(&amp;bitmap);//brush定义在头文件中CBrush&nbsp;burush<br>&nbsp;bitmap.DeleteObject();<br>}<br>第二种方法使用资源文件中导入的IDB_BITMAP来实现<br>第一步先在资源中导入一个位图:IDB_BITMAP1<br>void&nbsp;CDemoBitmapDlg::OnBtnBitmap()&nbsp;<br>{<br>&nbsp;//&nbsp;TODO:&nbsp;Add&nbsp;your&nbsp;control&nbsp;notification&nbsp;handler&nbsp;code&nbsp;here<br>&nbsp;/***************显示BITMAP的第二种方法**********************/<br>&nbsp;HBITMAP&nbsp;hBitmap;<br>&nbsp;CBitmap&nbsp;bitmap;<br>&nbsp;CClientDC&nbsp;*pDC;<br>&nbsp;pDC=new&nbsp;CClientDC(this);<br>&nbsp;hBitmap=(HBITMAP)::LoadImage(::AfxGetInstanceHandle(),"NetFriend.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION);<br>&nbsp;bitmap.Attach(hBitmap);<br>&nbsp;CDC&nbsp;CDCompatible;<br>&nbsp;CDCompatible.CreateCompatibleDC(pDC);//创建兼容DC<br>&nbsp;CDCompatible.SelectObject(&amp;bitmap);<br>&nbsp;/*********其它几种显示方式********/<br>/*&nbsp;pDC-&gt;BitBlt(0,0,200,200,&amp;CDCompatible,0,0,SRCCOPY);<br>&nbsp;CDCompatible.SetBkMode(TRANSPARENT);<br>&nbsp;pDC-&gt;StretchBlt(0,0,352,288,&amp;CDCompatible,0,0,352,288,SRCCOPY);<br>&nbsp;&nbsp;&nbsp;&nbsp;CDCompatible.CreateCompatibleDC(this-&gt;GetDC());<br>&nbsp;&nbsp;&nbsp;&nbsp;CDCompatible.SelectObject(&amp;bitmap);&nbsp;*/&nbsp;//选择绘图对象<br>&nbsp;BITMAP&nbsp;bmp;<br>&nbsp;bitmap.GetBitmap(&amp;bmp);<br>&nbsp;&nbsp;&nbsp;&nbsp;pDC-&gt;StretchBlt(0,0,bmp.bmWidth,bmp.bmHeight,&amp;CDCompatible,0,0,bmp.bmWidth,bmp.bmHeight,SRCCOPY);&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;CDCompatible.DeleteDC();&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;::DeleteObject(&amp;bitmap);&nbsp;<br>}<br>第三种方法是通过读取指定目录中的位图文件来显示(这里分别把它们显示在Picture<a href="http://www.programbbs.com/com/"><font color=#0000ff><u>控件</u></font></a>和Static上面这也是大家通常要用到的)：<br>void&nbsp;CDemoBitmapDlg::OnBtnPic()&nbsp;<br>{<br>&nbsp;//&nbsp;TODO:&nbsp;Add&nbsp;your&nbsp;control&nbsp;notification&nbsp;handler&nbsp;code&nbsp;here<br>&nbsp;/****************向PICTURE<a href="http://www.programbbs.com/com/"><font color=#0000ff><u>控件</u></font></a>中动态添加位图****************************/<br>&nbsp;HBITMAP&nbsp;hBitmap;<br>&nbsp;CBitmap&nbsp;bitmap;<br>&nbsp;hBitmap=(HBITMAP)::LoadImage(::AfxGetInstanceHandle(),"NetFriend.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION);<br>&nbsp;bitmap.Attach(hBitmap);<br>&nbsp;m_Pic.SetBitmap(hBitmap);</div>
<div>}<br>/****************在STATIC中显示位图*********************/<br>void&nbsp;CDemoBitmapDlg::OnBtnStatic()&nbsp;<br>{<br>&nbsp;//&nbsp;TODO:&nbsp;Add&nbsp;your&nbsp;control&nbsp;notification&nbsp;handler&nbsp;code&nbsp;here<br>&nbsp;CBitmap&nbsp;hbmp;<br>&nbsp;HBITMAP&nbsp;hbitmap;<br>&nbsp;//将pStatic指向要显示的地方<br>&nbsp;CStatic&nbsp;*pStaic;<br>&nbsp;pStaic=(CStatic*)GetDlgItem(IDC_IMAGE);<br>//&nbsp;pStaic=(CStatic*)GetDlgItem(IDC_BUTTON1);<br>&nbsp;//装载资源&nbsp;MM.bmp是我的一个文件名，用你的替换<br>&nbsp;hbitmap=(HBITMAP)::LoadImage&nbsp;(::AfxGetInstanceHandle(),"NetFriend.bmp",<br>&nbsp;&nbsp;IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION);&nbsp;<br>&nbsp;<br>&nbsp;hbmp.Attach(hbitmap);<br>&nbsp;//获取图片格式<br>&nbsp;BITMAP&nbsp;bm;<br>&nbsp;hbmp.GetBitmap(&amp;bm);<br>&nbsp;CDC&nbsp;dcMem;<br>&nbsp;dcMem.CreateCompatibleDC(GetDC());<br>&nbsp;CBitmap&nbsp;*poldBitmap=(CBitmap*)dcMem.SelectObject(hbmp);<br>&nbsp;CRect&nbsp;lRect;<br>&nbsp;pStaic-&gt;GetClientRect(&amp;lRect);<br>&nbsp;//显示位图<br>&nbsp;pStaic-&gt;GetDC()-&gt;StretchBlt(lRect.left&nbsp;,lRect.top&nbsp;,lRect.Width(),lRect.Height(),&nbsp;&nbsp;&amp;dcMem,0&nbsp;,0,bm.bmWidth,bm.bmHeight,SRCCOPY);<br>&nbsp;dcMem.SelectObject(&amp;poldBitmap);<br>}<br>/*****************向BUTTON中添加ICON*****************************/<br>//方法和导入其它位图类似，在这里就只做一个说明一下就是了。&nbsp;<br>HICON&nbsp;hIco;<br>&nbsp;hIco=AfxGetApp()-&gt;LoadIcon(IDI_ICON1);<br>&nbsp;m_BtnBitmap.SetIcon(hIco);<br>第四种读取位图文件来显示位图:<br>void&nbsp;CDemoBitmapDlg::OnBtnBtmfile()&nbsp;<br>{<br>&nbsp;//&nbsp;TODO:&nbsp;Add&nbsp;your&nbsp;control&nbsp;notification&nbsp;handler&nbsp;code&nbsp;here<br>&nbsp;/*******************通过读取位图文件来显示位图**********************/<br>&nbsp;CString&nbsp;strFileName;<br>&nbsp;strFileName.Format("%s","NetFriend.bmp");<br>&nbsp;//成位图信息BITMAPINFO<br>&nbsp;BITMAPINFO&nbsp;*bitmapinfo=NULL;<br>&nbsp;BYTE&nbsp;*BmpData=NULL;<br>&nbsp;CFile&nbsp;file;//读取位图信息<br>&nbsp;//设置文件的打开方式<br>&nbsp;if(!file.Open(strFileName,C<em>file:</em>:modeRead|C<em>file:</em>:typeBinary))<br>&nbsp;{<br>&nbsp;&nbsp;return;<br>&nbsp;}<br>&nbsp;//BITMAP文件头结构体<br>&nbsp;BITMAPFILEHEADER&nbsp;BitmapHead;<br>&nbsp;//读取位图文件头<br>&nbsp;if(file.Read(&amp;BitmapHead,sizeof(BITMAPFILEHEADER))!=sizeof(BITMAPFILEHEADER))<br>&nbsp;{<br>&nbsp;&nbsp;MessageBox("读取文件头失败!");<br>&nbsp;&nbsp;return;<br>&nbsp;}<br>&nbsp;if(BitmapHead.bfType!=0x4d42)<br>&nbsp;{<br>&nbsp;&nbsp;MessageBox("对不起,您读取的不是位图文件!");<br>&nbsp;&nbsp;return;<br>&nbsp;}<br>&nbsp;//位图信息<br>&nbsp;BITMAPINFOHEADER&nbsp;&nbsp;BitmapInfo;<br>&nbsp;if(file.Read(&amp;BitmapInfo,sizeof(BITMAPINFOHEADER))!=sizeof(BITMAPINFOHEADER))<br>&nbsp;{<br>&nbsp;&nbsp;MessageBox("读取位图信息失败!");<br>&nbsp;&nbsp;return;<br>&nbsp;}<br>&nbsp;if(BitmapInfo.biBitCount!=24)<br>&nbsp;{<br>&nbsp;&nbsp;MessageBox("对不起,当前<a href="http://www.programbbs.com/doc/"><font color=#0000ff><u>程序</u></font></a>只支持24位位图信息!");<br>&nbsp;&nbsp;return;<br>&nbsp;}<br>&nbsp;bitmapinfo=(BITMAPINFO*)new&nbsp;char[sizeof(BITMAPINFOHEADER)];<br>&nbsp;if(!bitmapinfo)<br>&nbsp;{<br>&nbsp;&nbsp;MessageBox("内存分配失败!");<br>&nbsp;&nbsp;return;<br>&nbsp;}<br>&nbsp;/*把BMP位图信息头中的数据读取到位图信息结构中去.*/<br>&nbsp;memcpy(bitmapinfo,&amp;BitmapInfo,sizeof(BITMAPINFOHEADER));<br>&nbsp;/*用来得到位图文件的大小*/<br>&nbsp;DWORD&nbsp;dataByte=BitmapHead.bfSize-BitmapHead.bfOffBits;<br>&nbsp;BmpData=(BYTE*)new&nbsp;char[dataByte];<br>&nbsp;if(!BmpData)<br>&nbsp;{<br>&nbsp;&nbsp;MessageBox("内存分配失败!");<br>&nbsp;&nbsp;delete&nbsp;bitmapinfo;<br>&nbsp;&nbsp;delete&nbsp;BmpData;<br>&nbsp;&nbsp;return;<br>&nbsp;}<br>&nbsp;if(file.Read(BmpData,dataByte)!=dataByte)<br>&nbsp;{<br>&nbsp;&nbsp;MessageBox("读取位图数据失败!");<br>&nbsp;&nbsp;return;<br>&nbsp;}<br>&nbsp;file.Close();<br>&nbsp;CClientDC&nbsp;*pDC=new&nbsp;CClientDC(this);<br>&nbsp;pDC-&gt;SetStretchBltMode(COLORONCOLOR);<br>&nbsp;StretchDIBits(pDC-&gt;GetSafeHdc(),200,0,BitmapInfo.biWidth,BitmapInfo.biHeight,&nbsp;&nbsp;0,0,BitmapInfo.biWidth,BitmapInfo.biHeight,BmpData,bitmapinfo,DIB_RGB_COLORS,SRCCOPY);<br>}<br>最后给大家介绍两个显示位图的特效的例子更多的特效显示</div>
<div>1&gt;&nbsp;水平交错显示位图<br>void&nbsp;CListBmap::OnButton1()&nbsp;<br>{<br>&nbsp;//&nbsp;TODO:&nbsp;Add&nbsp;your&nbsp;control&nbsp;notification&nbsp;handler&nbsp;code&nbsp;here<br>&nbsp;HBITMAP&nbsp;hBitmap;<br>&nbsp;CBitmap&nbsp;cBitmap;<br>&nbsp;hBitmap=(HBITMAP)::LoadImage(::AfxGetInstanceHandle(),"NetFriend.bmp",&nbsp;&nbsp;IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION);<br>&nbsp;cBitmap.Attach(hBitmap);<br>&nbsp;cBitmap.GetBitmap(&amp;bitmap);<br>&nbsp;int&nbsp;i=0,j=0;<br>&nbsp;CClientDC&nbsp;*pDC=new&nbsp;CClientDC(this);<br>&nbsp;CDC&nbsp;memDC;<br>&nbsp;memDC.CreateCompatibleDC(GetDC());<br>&nbsp;memDC.SelectObject(&amp;cBitmap);<br>&nbsp;for(i=0;i&lt;bitmap.bmHeight;i+=2)<br>&nbsp;{<br>&nbsp;&nbsp;j=i;<br>&nbsp;&nbsp;while(j&gt;0)<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;pDC-&gt;StretchBlt(0,j-1,bitmap.bmWidth,1,&amp;memDC,0,bitmap.bmHeight-(i-j+1),&nbsp;&nbsp;&nbsp;&nbsp;bitmap.bmWidth,1,SRCCOPY);<br>&nbsp;&nbsp;&nbsp;pDC-&gt;StretchBlt(0,bitmap.bmHeight-j,bitmap.bmWidth,1,&amp;memDC,0,i-j,&nbsp;&nbsp;&nbsp;&nbsp;bitmap.bmWidth,1,SRCCOPY);<br>&nbsp;&nbsp;&nbsp;j-=2;<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;Sleep(50);<br>&nbsp;}</div>
<div>}</div>
<div>2&gt;雨点显示：<br>void&nbsp;CListBmap::OnButton2()&nbsp;<br>{<br>&nbsp;//&nbsp;TODO:&nbsp;Add&nbsp;your&nbsp;control&nbsp;notification&nbsp;handler&nbsp;code&nbsp;here</div>
<div>&nbsp;HBITMAP&nbsp;hBitmap;<br>&nbsp;CBitmap&nbsp;cBitmap;<br>&nbsp;hBitmap=(HBITMAP)::LoadImage(::AfxGetInstanceHandle(),"NetFriend.bmp",&nbsp;&nbsp;IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION);<br>&nbsp;cBitmap.Attach(hBitmap);<br>&nbsp;cBitmap.GetBitmap(&amp;bitmap);<br>&nbsp;int&nbsp;i=0,j=0;<br>&nbsp;CClientDC&nbsp;*pDC=new&nbsp;CClientDC(this);<br>&nbsp;CDC&nbsp;memDC;<br>&nbsp;memDC.CreateCompatibleDC(GetDC());<br>&nbsp;memDC.SelectObject(&amp;cBitmap);<br>&nbsp;for&nbsp;(&nbsp;i=0;&nbsp;i&lt;=bitmap.bmHeight;&nbsp;i++&nbsp;)&nbsp;&nbsp;&nbsp;<br>&nbsp;{<br>&nbsp;&nbsp;for&nbsp;(&nbsp;j=0;&nbsp;j&lt;=bitmap.bmHeight-i;&nbsp;j++&nbsp;)&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;pDC-&gt;StretchBlt(&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;0,j,&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;//目标设备逻辑横、纵坐标&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;bitmap.bmWidth,1,&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;//显示位图的像素宽、高度&nbsp;<br>&nbsp;&nbsp;&nbsp;&amp;memDC,&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;//源位图设备情境对象&nbsp;<br>&nbsp;&nbsp;&nbsp;0,bitmap.bmHeight-i,&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;//源位图的起始横、纵坐标&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;bitmap.bmWidth,1,&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;//源位图的像素宽、高度&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;SRCCOPY);&nbsp;&nbsp;<br>&nbsp;&nbsp;Sleep(20);&nbsp;&nbsp;<br>&nbsp;}<br>}<br></div>
<img src ="http://www.cppblog.com/AutomateProgram/aggbug/106336.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/AutomateProgram/" target="_blank">漂漂</a> 2010-01-24 15:36 <a href="http://www.cppblog.com/AutomateProgram/archive/2010/01/24/106336.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>动态的创建CStatic并显示位图。</title><link>http://www.cppblog.com/AutomateProgram/archive/2010/01/24/106335.html</link><dc:creator>漂漂</dc:creator><author>漂漂</author><pubDate>Sun, 24 Jan 2010 07:34:00 GMT</pubDate><guid>http://www.cppblog.com/AutomateProgram/archive/2010/01/24/106335.html</guid><wfw:comment>http://www.cppblog.com/AutomateProgram/comments/106335.html</wfw:comment><comments>http://www.cppblog.com/AutomateProgram/archive/2010/01/24/106335.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/AutomateProgram/comments/commentRss/106335.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/AutomateProgram/services/trackbacks/106335.html</trackback:ping><description><![CDATA[&nbsp;注意风格的设定否则无法显示位图。<br><br>if(m_createPic.m_hWnd == NULL)<br>&nbsp;&nbsp;m_createPic.Create("", WS_CHILD | <span style="COLOR: red">WS_VISIBLE</span> | WS_TABSTOP | WS_CLIPSIBLINGS | SS_NOTIFY | <span style="COLOR: red">SS_BITMAP</span> , CRect(0,0,150,220),this);<br>&nbsp;CBitmap bmp;<br>&nbsp;bmp.LoadBitmap(IDB_BITMAP1);<br>&nbsp;m_createPic.SetBitmap((HBITMAP)bmp.GetSafeHandle());
<img src ="http://www.cppblog.com/AutomateProgram/aggbug/106335.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/AutomateProgram/" target="_blank">漂漂</a> 2010-01-24 15:34 <a href="http://www.cppblog.com/AutomateProgram/archive/2010/01/24/106335.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PreTranslateMessage作用和使用方法(转)</title><link>http://www.cppblog.com/AutomateProgram/archive/2010/01/18/105917.html</link><dc:creator>漂漂</dc:creator><author>漂漂</author><pubDate>Mon, 18 Jan 2010 01:22:00 GMT</pubDate><guid>http://www.cppblog.com/AutomateProgram/archive/2010/01/18/105917.html</guid><wfw:comment>http://www.cppblog.com/AutomateProgram/comments/105917.html</wfw:comment><comments>http://www.cppblog.com/AutomateProgram/archive/2010/01/18/105917.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/AutomateProgram/comments/commentRss/105917.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/AutomateProgram/services/trackbacks/105917.html</trackback:ping><description><![CDATA[<p>原文地址：<a href="http://blog.csdn.net/wzyzb/archive/2009/03/05/3959564.aspx">http://blog.csdn.net/wzyzb/archive/2009/03/05/3959564.aspx</a><br>PreTranslateMessage是消息在送给TranslateMessage函数之前被调用的，绝大多数本窗口的消息都要通过这里，比较常用，当需要在MFC之前处理某些消息时，常常要在这里添加代码.&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MFC 消息控制流最具特色的地方是CWnd类的虚拟函数PreTranslateMessage()，通过重载这个函数，可以改变MFC的消息控制流程，甚至可以作一个全新的控制流出来。只有穿过消息队列的消息才受PreTranslateMessage()影响，采用SendMessage()或其他类似的方式向窗口直接发送的而不经过消息队列的消息根本不会理睬PreTranslateMessage()的存在。&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 是否调用TranslateMessage()和DispatchMessage()是由一个名称为PreTranslateMessage()函数的返回值决定的，如果该函数返回TRUE，则不会把该消息分发给窗口函数处理。 </p>
<p>传给PreTranslateMessage()的消息是未经翻译过的消息，它没有经过TranslateMessage()处理。可以在该函数中使用(pMsg-&gt;wParam==VK_RETURN)来拦截回车键。wParam中存放的是键盘上字符的虚拟码。 </p>
<p>PeekMessage和GetMessage的区别： </p>
<p>GetMessage在没有消息的时候等待消息，cpu当然低 </p>
<p>PeekMessage没有消息的时候立刻返回，所以cpu占用率高。 </p>
<p>因为游戏不能靠windows消息驱动，所以要用PeekMessage(); </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; PretranslateMessage 的实现，不得不谈到MFC消息循环的实现。MFC通过CWinApp类中的Pumpmessage函数实现消息循环，但是实际的消息循环代码位于 CWinThread中，CWinApp只是从CWinThread继承过来。其简化后的代码大概如下： <br>　　BOOL CWinThread::PumpMessage() <br>　　{ <br>　　_AFX_THREAD_STATE *pState = AfxGetThreadState(); <br>　　 <br>　　::GetMessage(&amp;(pState-&gt;m_msgCur), NULL, NULL, NULL)) <br>　　 <br>　　if (!AfxPreTranslateMessage(&amp;(pState-&gt;m_msgCur))) <br>　　{ <br>　　::TranslateMessage(&amp;(pState-&gt;m_msgCur)); <br>　　::DispatchMessage(&amp;(pState-&gt;m_msgCur)); <br>　　} <br>　　return TRUE; <br>　　} <br>　　可以看到，PumpMessage在实际的TranslateMessage和DispatchMessage发生之前会调用 AfxPreTranslateMessage，AfxPreTranslateMessage又会调用 CWnd::WalkPreTranslateTree(虽然也会调用其他函数，但是这个最为关键），其代码如下： <br>　　BOOL PASCAL CWnd::WalkPreTranslateTree(HWND hWndStop, MSG* pMsg) <br>　　{ <br>　　ASSERT(hWndStop == NULL || ::IsWindow(hWndStop)); <br>　　ASSERT(pMsg != NULL); <br>　　 <br>　　// walk from the target window up to the hWndStop window checking <br>　　// if any window wants to translate this message <br>　　 <br>　　for (HWND hWnd = pMsg-&gt;hwnd; hWnd != NULL; hWnd = ::GetParent(hWnd)) <br>　　{ <br>　　CWnd* pWnd = CWnd::FromHandlePermanent(hWnd); <br>　　if (pWnd != NULL) <br>　　{ <br>　　// target window is a C window <br>　　if (pWnd-&gt;PreTranslateMessage(pMsg)) <br>　　return TRUE; // trapped by target window (eg: accelerators) <br>　　} <br>　　 <br>　　// got to hWndStop window without interest <br>　　if (hWnd == hWndStop) <br>　　break; <br>　　} <br>　　return FALSE; // no special processing <br>　　} <br>　　 <br>　　可以看到，代码还是很直接的。从接受到消息的窗口层层往上遍历，并调用PretranslateMessage看是否返回TRUE，是则结束，否则继续。 <br>　　这里有一个地方非常关键：CWnd *pWnd = CWnd::FromHandlePermanent(hWnd) 这一句代码从当前AfxModuleThreadState拿到Permanent句柄表，从而找到hWnd对应的CWnd </p>
<p><br>MFC 中PreTranslateMessage是GetMessage(...)函数的下一级操作，即GetMessage(...)从消息队列中获取消息后，交由PreTranslateMessage（）处理，若其返回FALSE则再交给TranslateMessage和 DispatchMessage处理（进入WindowProc）；&nbsp;&nbsp; <br>如果用SendMessage,&nbsp;&nbsp; 则消息直接交到WindowProc处理，所以GetMessage不会取得SendMessage的消息，当然PreTranslateMessage也就不会被调用。&nbsp;&nbsp; [Page]<br>如果用PostMessage,则消息进入消息队列，由GetMessage取得，PreTranslateMessage就有机会进行处理。 </p>
<p>例子：<br>按Enter,ESC按是不会退出了<br><br>BOOL CComboBoxExDlg::PreTranslateMessage(MSG* pMsg) <br>{ <br>if(WM_KEYDOWN == pMsg-&gt;message ) <br>{ <br>UINT nKey = (int) pMsg-&gt;wParam;&nbsp; <br>if( VK_RETURN == nKey || VK_ESCAPE == nKey ) <br>return&nbsp;TRUE ; <br>} <br><br>return CDialog::PreTranslateMessage(pMsg); <br>} <br><br>编辑框，如何响应的这个回车的信息<br>如果你的编辑框定义如下 &nbsp; <br>&nbsp; CEdidt &nbsp; m_cName; &nbsp; &nbsp; &nbsp; //ID号为IDC_E_NAME &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; BOOL &nbsp; CSecondDlg::PreTranslateMessage(MSG* &nbsp; pMsg) &nbsp; &nbsp; <br>&nbsp; { &nbsp; <br>&nbsp; // &nbsp; TODO: &nbsp; Add &nbsp; your &nbsp; specialized &nbsp; code &nbsp; here &nbsp; and/or &nbsp; call &nbsp; class &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if &nbsp; (pMsg-&gt;message==WM_KEYDOWN) &nbsp; <br>&nbsp; { &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //CWnd &nbsp; *p=GetDlgItem(IDC_E_NAME); &nbsp; <br>&nbsp; CWnd &nbsp; * &nbsp; hWnd=GetFocus(); &nbsp; <br>&nbsp; //if(pMsg-&gt;wParam==13 &nbsp; &amp;&amp; &nbsp; pMsg-&gt;hwnd==m_cName) &nbsp; <br>&nbsp; if(pMsg-&gt;wParam==13 &nbsp; &amp;&amp; &nbsp; hWnd==&amp;m_cName) &nbsp; <br>&nbsp; { &nbsp; <br>&nbsp; 处理函数 &nbsp; <br>&nbsp; return &nbsp; TRUE; &nbsp; <br>&nbsp; } &nbsp; <br>&nbsp; else &nbsp; <br>&nbsp; { &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 处理函数 &nbsp; <br>&nbsp; } &nbsp; <br>&nbsp; } &nbsp; <br>&nbsp; return &nbsp; CDialog::PreTranslateMessage(pMsg); &nbsp; <br>&nbsp; }<br></p>
<img src ="http://www.cppblog.com/AutomateProgram/aggbug/105917.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/AutomateProgram/" target="_blank">漂漂</a> 2010-01-18 09:22 <a href="http://www.cppblog.com/AutomateProgram/archive/2010/01/18/105917.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>