﻿<?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++博客-牵着老婆满街逛-文章分类-Windows编程</title><link>http://www.cppblog.com/tx7do/category/1514.html</link><description>严以律己,宽以待人. 三思而后行.&lt;/br&gt;
GMail/GTalk: yanglinbo#google.com;&lt;/br&gt;
MSN/Email: tx7do#yahoo.com.cn;&lt;/br&gt;
QQ: 3 0 3 3 9 6 9 2 0 .</description><language>zh-cn</language><lastBuildDate>Fri, 08 Jun 2012 03:32:31 GMT</lastBuildDate><pubDate>Fri, 08 Jun 2012 03:32:31 GMT</pubDate><ttl>60</ttl><item><title>开源日志系统log4cplus(七)</title><link>http://www.cppblog.com/tx7do/articles/11721.html</link><dc:creator>杨粼波</dc:creator><author>杨粼波</author><pubDate>Fri, 25 Aug 2006 20:51:00 GMT</pubDate><guid>http://www.cppblog.com/tx7do/articles/11721.html</guid><wfw:comment>http://www.cppblog.com/tx7do/comments/11721.html</wfw:comment><comments>http://www.cppblog.com/tx7do/articles/11721.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/tx7do/comments/commentRss/11721.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/tx7do/services/trackbacks/11721.html</trackback:ping><description><![CDATA[<p>&#160;</p>
<p>经过短暂的熟悉过程，log4cplus已经被成功应用到了我的项目中去了，效果还不错，：）除了上文提及的<br>功能之外，下面将介绍log4cplus提供的线程和套接字的使用情况。<br></p>
<pre>### NDC ###</pre>
<pre>首先我们先了解一下log4cplus中嵌入诊断上下文（Nested Diagnostic Context），即NDC。对log系统而言，<br>当输入源可能不止一个，而只有一个输出时，往往需要分辩所要输出消息的来源，比如服务器处理来自不同<br>客户端的消息时就需要作此判断，NDC可以为交错显示的信息打上一个标记(stamp)， 使得辨认工作看起来<br>比较容易些，呵呵。这个标记是线程特有的，利用了线程局部存储机制，称为线程私有数据（Thread-specific<br>&nbsp;Data，或TSD）。 看了一下源代码，相关定义如下，包括定义、初始化、获取、设置和清除操作：</pre>
<pre>linux pthread</pre>
<pre>
<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">#&nbsp;&nbsp;&nbsp;define&nbsp;LOG4CPLUS_THREAD_LOCAL_TYPE&nbsp;pthread_key_t</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>#&nbsp;&nbsp;&nbsp;define&nbsp;LOG4CPLUS_THREAD_LOCAL_INIT&nbsp;::log4cplus::thread::createPthreadKey()<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>#&nbsp;&nbsp;&nbsp;define&nbsp;LOG4CPLUS_GET_THREAD_LOCAL_VALUE(&nbsp;key&nbsp;)&nbsp;pthread_getspecific(</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">key)<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>#&nbsp;&nbsp;&nbsp;define&nbsp;LOG4CPLUS_SET_THREAD_LOCAL_VALUE(&nbsp;key,&nbsp;value&nbsp;)&nbsp;pthread_setspecific(</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">key,&nbsp;value)<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>#&nbsp;&nbsp;&nbsp;define&nbsp;LOG4CPLUS_THREAD_LOCAL_CLEANUP(&nbsp;key&nbsp;)&nbsp;pthread_key_delete(</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">key)</span></div>
<br></pre>
<pre>win32</pre>
<pre>
<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">#&nbsp;&nbsp;&nbsp;define&nbsp;LOG4CPLUS_THREAD_LOCAL_TYPE&nbsp;DWORD<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>#&nbsp;&nbsp;&nbsp;define&nbsp;LOG4CPLUS_THREAD_LOCAL_INIT&nbsp;TlsAlloc()<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>#&nbsp;&nbsp;&nbsp;define&nbsp;LOG4CPLUS_GET_THREAD_LOCAL_VALUE(&nbsp;key&nbsp;)&nbsp;TlsGetValue(key)<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>#&nbsp;&nbsp;&nbsp;define&nbsp;LOG4CPLUS_SET_THREAD_LOCAL_VALUE(&nbsp;key,&nbsp;value&nbsp;)&nbsp;\&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TlsSetValue(key,&nbsp;static_cast(value))<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>#&nbsp;&nbsp;&nbsp;define&nbsp;LOG4CPLUS_THREAD_LOCAL_CLEANUP(&nbsp;key&nbsp;)&nbsp;TlsFree(key)</span></div>
</pre>
<pre>				<br>使用起来比较简单，在某个线程中：</pre>
<pre>
<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">&nbsp;&nbsp;&nbsp;&nbsp;NDC</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;ndc&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;log4cplus::getNDC();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;ndc.push(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">ur&nbsp;ndc&nbsp;string</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;LOG4CPLUS_DEBUG(logger,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">this&nbsp;is&nbsp;a&nbsp;NDC&nbsp;test</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.cppblog.com/Images/dot.gif">&nbsp;<img src="http://www.cppblog.com/Images/dot.gif"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;ndc.pop();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.cppblog.com/Images/dot.gif">&nbsp;<img src="http://www.cppblog.com/Images/dot.gif"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;LOG4CPLUS_DEBUG(logger,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">There&nbsp;should&nbsp;be&nbsp;no&nbsp;NDC<img src="http://www.cppblog.com/Images/dot.gif"></span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;ndc.remove();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span></div>
<br><br>&nbsp;&nbsp;&nbsp; <br>当设定输出格式(Layout)为TTCCLayout时，输出如下：</pre>
<pre>10-21-04 21:32:58, [3392] DEBUG test <ur ndc="" string="" /> - this is a NDC test<br>10-21-04 21:32:58, [3392] DEBUG test &lt;&gt; - There should be no NDC...</pre>
<pre>也可以在自定义的输出格式中使用NDC(用%x) ，比如：</pre>
<pre>
<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">&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.cppblog.com/Images/dot.gif">&nbsp;<img src="http://www.cppblog.com/Images/dot.gif"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;std::</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&nbsp;pattern&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">NDC:[%x]&nbsp;&nbsp;-&nbsp;%m&nbsp;%n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;std::auto_ptr&nbsp;_layout(</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;PatternLayout(pattern));<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.cppblog.com/Images/dot.gif">&nbsp;<img src="http://www.cppblog.com/Images/dot.gif"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;LOG4CPLUS_DEBUG(_logger,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">This&nbsp;is&nbsp;the&nbsp;FIRST&nbsp;log&nbsp;message<img src="http://www.cppblog.com/Images/dot.gif"></span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">)<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;NDC</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;ndc&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;log4cplus::getNDC();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;ndc.push(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">ur&nbsp;ndc&nbsp;string</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;LOG4CPLUS_WARN(_logger,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">This&nbsp;is&nbsp;the&nbsp;SECOND&nbsp;log&nbsp;message<img src="http://www.cppblog.com/Images/dot.gif"></span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">)<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;ndc.pop();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;ndc.remove();&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;<img src="http://www.cppblog.com/Images/dot.gif">&nbsp;<img src="http://www.cppblog.com/Images/dot.gif"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span></div>
<br>&nbsp;&nbsp;&nbsp; <br>输出如下：</pre>
<pre>NDC:[]&nbsp; - This is the FIRST log message...<br>NDC:[ur ndc string]&nbsp; - This is the SECOND log message...</pre>
<pre>				<br>另外一种更简单的使用方法是在线程中直接用NDCContextCreator：</pre>
<pre>
<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">&nbsp;&nbsp;&nbsp;&nbsp;NDCContextCreator&nbsp;_first_ndc(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">ur&nbsp;ndc&nbsp;string</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;LOG4CPLUS_DEBUG(logger,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">this&nbsp;is&nbsp;a&nbsp;NDC&nbsp;test</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">)</span></div>
<br>&nbsp;&nbsp;&nbsp; <br>不必显式地调用push/pop了，而且当出现异常时，能够确保push与pop的调用是匹配的。</pre>
<pre>&nbsp;&nbsp;&nbsp; <br>### 线程 ###</pre>
<pre>线程是log4cplus中的副产品， 而且仅作了最基本的实现，使用起来也异常简单，只要且必须要<br>在派生类中重载run函数即可：</pre>
<pre>
<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: #0000ff">class</span><span style="COLOR: #000000">&nbsp;TestThread&nbsp;:&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;AbstractThread<br><img id=Codehighlighter1_41_75_Open_Image onclick="this.style.display='none'; Codehighlighter1_41_75_Open_Text.style.display='none'; Codehighlighter1_41_75_Closed_Image.style.display='inline'; Codehighlighter1_41_75_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_41_75_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_41_75_Closed_Text.style.display='none'; Codehighlighter1_41_75_Open_Image.style.display='inline'; Codehighlighter1_41_75_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_41_75_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_41_75_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">virtual</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;run();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;TestThread::run()<br><img id=Codehighlighter1_106_138_Open_Image onclick="this.style.display='none'; Codehighlighter1_106_138_Open_Text.style.display='none'; Codehighlighter1_106_138_Closed_Image.style.display='inline'; Codehighlighter1_106_138_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_106_138_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_106_138_Closed_Text.style.display='none'; Codehighlighter1_106_138_Open_Image.style.display='inline'; Codehighlighter1_106_138_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_106_138_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_106_138_Open_Text><span style="COLOR: #000000">{&nbsp;<br><img id=Codehighlighter1_112_124_Open_Image onclick="this.style.display='none'; Codehighlighter1_112_124_Open_Text.style.display='none'; Codehighlighter1_112_124_Closed_Image.style.display='inline'; Codehighlighter1_112_124_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_112_124_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_112_124_Closed_Text.style.display='none'; Codehighlighter1_112_124_Open_Image.style.display='inline'; Codehighlighter1_112_124_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_112_124_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</span><span id=Codehighlighter1_112_124_Open_Text><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">&nbsp;do&nbsp;sth.&nbsp;</span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000">&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;<img src="http://www.cppblog.com/Images/dot.gif">&nbsp;<img src="http://www.cppblog.com/Images/dot.gif"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span></div>
</pre>
<pre>log4cplus的线程没有考虑同步、死锁，有互斥，实现线程切换的小函数挺别致的：</pre>
<pre>
<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: #0000ff">void</span><span style="COLOR: #000000">&nbsp;log4cplus::thread::yield()<br><img id=Codehighlighter1_32_157_Open_Image onclick="this.style.display='none'; Codehighlighter1_32_157_Open_Text.style.display='none'; Codehighlighter1_32_157_Closed_Image.style.display='inline'; Codehighlighter1_32_157_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_32_157_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_32_157_Closed_Text.style.display='none'; Codehighlighter1_32_157_Open_Image.style.display='inline'; Codehighlighter1_32_157_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_32_157_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_32_157_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #0000ff">#if</span><span style="COLOR: #000000">&nbsp;defined(LOG4CPLUS_USE_PTHREADS)</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;::sched_yield();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #0000ff">#elif</span><span style="COLOR: #000000">&nbsp;defined(LOG4CPLUS_USE_WIN32_THREADS)</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;::Sleep(</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #0000ff">#endif</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span></div>
</pre>
<pre>				<br>### 套接字 ###</pre>
<pre>套接字也是log4cplus中的副产品，在namespace log4cplus::helpers中，实现了C/S方式的日志记录。</pre>
<pre>1. 客户端程序需要做的工作：</pre>
<pre>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img id=Codehighlighter1_0_29_Open_Image onclick="this.style.display='none'; Codehighlighter1_0_29_Open_Text.style.display='none'; Codehighlighter1_0_29_Closed_Image.style.display='inline'; Codehighlighter1_0_29_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_0_29_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_0_29_Closed_Text.style.display='none'; Codehighlighter1_0_29_Open_Image.style.display='inline'; Codehighlighter1_0_29_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top><span id=Codehighlighter1_0_29_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</span><span id=Codehighlighter1_0_29_Open_Text><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">&nbsp;定义一个SocketAppender类型的挂接器&nbsp;</span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000">SharedAppenderPtr&nbsp;_append(</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;SocketAppender(host,&nbsp;</span><span style="COLOR: #000000">8888</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">ServerName</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">));<br><img id=Codehighlighter1_103_126_Open_Image onclick="this.style.display='none'; Codehighlighter1_103_126_Open_Text.style.display='none'; Codehighlighter1_103_126_Closed_Image.style.display='inline'; Codehighlighter1_103_126_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_103_126_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_103_126_Closed_Text.style.display='none'; Codehighlighter1_103_126_Open_Image.style.display='inline'; Codehighlighter1_103_126_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_103_126_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</span><span id=Codehighlighter1_103_126_Open_Text><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">&nbsp;把_append加入到logger中&nbsp;</span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000">Logger::getRoot().addAppender(_append);<br><img id=Codehighlighter1_167_226_Open_Image onclick="this.style.display='none'; Codehighlighter1_167_226_Open_Text.style.display='none'; Codehighlighter1_167_226_Closed_Image.style.display='inline'; Codehighlighter1_167_226_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_167_226_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_167_226_Closed_Text.style.display='none'; Codehighlighter1_167_226_Open_Image.style.display='inline'; Codehighlighter1_167_226_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_167_226_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</span><span id=Codehighlighter1_167_226_Open_Text><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">&nbsp;&nbsp;SocketAppender类型不需要Layout,&nbsp;直接调用宏就可以将信息发往loggerServer了&nbsp;</span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000">LOG4CPLUS_INFO(Logger::getRoot(),&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">This&nbsp;is&nbsp;a&nbsp;test:&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">)<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span></div>
<br>【注】 这里对宏的调用其实是调用了SocketAppender::append，里面有一个数据传输约定，即先发送<br>一个后续数据的总长度，然后再发送实际的数据：</pre>
<pre>
<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">&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.cppblog.com/Images/dot.gif">&nbsp;<img src="http://www.cppblog.com/Images/dot.gif"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;SocketBuffer&nbsp;buffer&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;convertToBuffer(</span><span style="COLOR: #0000ff">event</span><span style="COLOR: #000000">,&nbsp;serverName);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;SocketBuffer&nbsp;msgBuffer(LOG4CPLUS_MAX_MESSAGE_SIZE);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;msgBuffer.appendSize_t(buffer.getSize());<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;msgBuffer.appendBuffer(buffer);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.cppblog.com/Images/dot.gif">&nbsp;<img src="http://www.cppblog.com/Images/dot.gif"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span></div>
</pre>
<pre>				<br>2. 服务器端程序需要做的工作：</pre>
<pre>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img id=Codehighlighter1_0_21_Open_Image onclick="this.style.display='none'; Codehighlighter1_0_21_Open_Text.style.display='none'; Codehighlighter1_0_21_Closed_Image.style.display='inline'; Codehighlighter1_0_21_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_0_21_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_0_21_Closed_Text.style.display='none'; Codehighlighter1_0_21_Open_Image.style.display='inline'; Codehighlighter1_0_21_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top><span id=Codehighlighter1_0_21_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</span><span id=Codehighlighter1_0_21_Open_Text><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">&nbsp;定义一个ServerSocket&nbsp;</span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000">ServerSocket&nbsp;serverSocket(port);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;<br><img id=Codehighlighter1_57_90_Open_Image onclick="this.style.display='none'; Codehighlighter1_57_90_Open_Text.style.display='none'; Codehighlighter1_57_90_Closed_Image.style.display='inline'; Codehighlighter1_57_90_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_57_90_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_57_90_Closed_Text.style.display='none'; Codehighlighter1_57_90_Open_Image.style.display='inline'; Codehighlighter1_57_90_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_57_90_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</span><span id=Codehighlighter1_57_90_Open_Text><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">&nbsp;调用accept函数创建一个新的socket与客户端连接&nbsp;</span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000">Socket&nbsp;sock&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;serverSocket.accept();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span></div>
</pre>
<pre>				<br>此后即可用该sock进行数据read/write了,形如：</pre>
<pre>
<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">SocketBuffer&nbsp;msgSizeBuffer(</span><span style="COLOR: #0000ff">sizeof</span><span style="COLOR: #000000">(unsigned&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">));<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000">clientsock.read(msgSizeBuffer))<br><img id=Codehighlighter1_86_100_Open_Image onclick="this.style.display='none'; Codehighlighter1_86_100_Open_Text.style.display='none'; Codehighlighter1_86_100_Closed_Image.style.display='inline'; Codehighlighter1_86_100_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_86_100_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_86_100_Closed_Text.style.display='none'; Codehighlighter1_86_100_Open_Image.style.display='inline'; Codehighlighter1_86_100_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_86_100_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_86_100_Open_Text><span style="COLOR: #000000">{<br><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">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>unsigned&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;msgSize&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;msgSizeBuffer.readInt();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>SocketBuffer&nbsp;buffer(msgSize);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000">clientsock.read(buffer))<br><img id=Codehighlighter1_209_223_Open_Image onclick="this.style.display='none'; Codehighlighter1_209_223_Open_Text.style.display='none'; Codehighlighter1_209_223_Closed_Image.style.display='inline'; Codehighlighter1_209_223_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_209_223_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_209_223_Closed_Text.style.display='none'; Codehighlighter1_209_223_Open_Image.style.display='inline'; Codehighlighter1_209_223_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_209_223_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_209_223_Open_Text><span style="COLOR: #000000">{<br><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">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span></div>
</pre>
<pre>为了将读到的数据正常显示出来，需要将SocketBuffer存放的内容转换成InternalLoggingEvent格式：</pre>
<pre>
<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">spi::InternalLoggingEvent&nbsp;</span><span style="COLOR: #0000ff">event</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;readFromBuffer(buffer);</span></div>
</pre>
<pre>然后输出：<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">Logger&nbsp;logger&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;Logger::getInstance(</span><span style="COLOR: #0000ff">event</span><span style="COLOR: #000000">.getLoggerName());<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>logger.callAppenders(</span><span style="COLOR: #0000ff">event</span><span style="COLOR: #000000">);</span></div>
</pre>
<pre>				<br>【注】 read/write是按照阻塞方式实现的，意味着对其调用直到满足了所接收或发送的个数才返回。</pre>
<img src ="http://www.cppblog.com/tx7do/aggbug/11721.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/tx7do/" target="_blank">杨粼波</a> 2006-08-26 04:51 <a href="http://www.cppblog.com/tx7do/articles/11721.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>开源日志系统log4cplus(六)</title><link>http://www.cppblog.com/tx7do/articles/11720.html</link><dc:creator>杨粼波</dc:creator><author>杨粼波</author><pubDate>Fri, 25 Aug 2006 20:50:00 GMT</pubDate><guid>http://www.cppblog.com/tx7do/articles/11720.html</guid><wfw:comment>http://www.cppblog.com/tx7do/comments/11720.html</wfw:comment><comments>http://www.cppblog.com/tx7do/articles/11720.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/tx7do/comments/commentRss/11720.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/tx7do/services/trackbacks/11720.html</trackback:ping><description><![CDATA[
		<p>log4cplus在很多方面做的都很出色，但是使用过程有些地方感觉不爽。在继续吹捧之前我先把不爽之处<br />稍微提一提，然后继续介绍关于线程和套接字的知识。<br /></p>
		<pre>### 一些可以改进之处 ###</pre>
		<pre>1. 用户自定义LogLevel的实现机制不够开放</pre>
		<pre>在第五篇中曾经介绍过如何实现用户自行定义LogLevel，为了实现比较理想的效果，甚至还需要改log4cplus<br />的源代码。：（</pre>
		<pre>2. 生成Logger对象的机制可以改进</pre>
		<pre>我在使用时候，经常需要在不同的文件、函数中操作同一个logger，虽然log4cplus实现了树状存储以及根据<br />名称生成Logger，却没有充分利用这样的特点确保同一个名称对应的logger对象的唯一性，比如以下代码：</pre>
		<pre>    ... ...<br />    <br />    Logger logger1 = Logger::getInstance("test");<br />    Logger logger2 = Logger::getInstance("test");</pre>
		<pre>    Logger * plogger1 = &amp;logger1;<br />    Logger * plogger2 = &amp;logger2;</pre>
		<pre>    std::cout &lt;&lt; "plogger1: " &lt;&lt; plogger1 &lt;&lt; std::endl &lt;&lt; "plogger2: " &lt;&lt; plogger2 &lt;&lt; std::endl;<br />    <br />    ... ...<br />    <br />    <br />运行结果：</pre>
		<pre>plogger1: 0xbfffe5a0<br />plogger2: 0xbfffe580</pre>
		<pre>
				<br />从结果可以看出，明明是同一个Logger，但每次调用都会产生一个Logger副本，虽然结果是正确的（因为将存<br />储和操作分开了），但是资源有些浪费，我看了一下log4cplus的代码，其实可以按照如下方式实现（示意性<br />的）：</pre>
		<pre>#include &lt;iostream&gt;<br />#include &lt;string&gt;<br />#include &lt;map&gt;<map></map></pre>
		<pre>/* forward declaration */<br />class Logger;</pre>
		<pre>class LoggerContainer<br />{<br />public:</pre>
		<pre>    ~LoggerContainer();</pre>
		<pre>    Logger * getinstance(const std::string &amp; strLogger);</pre>
		<pre>private:</pre>
		<pre>    typedef std::map&lt;:string,&gt; LoggerMap;<br />    LoggerMap loggerPtrs;<br />};</pre>
		<pre>class Logger<br />{<br />public:<br />     Logger() {std::cout &lt;&lt; "ctor of Logger " &lt;&lt; std::endl; }<br />    ~Logger() {std::cout &lt;&lt; "dtor of Logger " &lt;&lt; std::endl; }</pre>
		<pre>    static Logger * getInstance( const std::string &amp; strLogger)<br />    {<br />        static LoggerContainer defaultLoggerContainer;<br />        return defaultLoggerContainer.getinstance(strLogger);<br />    }<br />};</pre>
		<pre>LoggerContainer::~LoggerContainer()<br />{<br />    /* release all ptr in LoggerMap */<br />    LoggerMap::iterator itr = loggerPtrs.begin();</pre>
		<pre>    for( ; itr != loggerPtrs.end(); ++itr )<br /> {<br />     delete (*itr).second;<br /> }</pre>
		<pre>}</pre>
		<pre>Logger * LoggerContainer::getinstance(const std::string &amp; strLogger)<br />{<br />   LoggerMap::iterator itr = loggerPtrs.find(strLogger);</pre>
		<pre>   if(itr != loggerPtrs.end())<br />   {<br />       /* logger exist, just return it */<br />       return (*itr).second;<br />   }<br />   else<br />   {<br />       /* return a new logger */<br />       Logger * plogger = new Logger();<br />       loggerPtrs.insert(std::make_pair(strLogger, plogger));</pre>
		<pre>       return plogger;<br />   }<br />}</pre>
		<pre>int main()<br />{<br />    Logger * plogger1 = Logger::getInstance("test");<br />    Logger * plogger2 = Logger::getInstance("test");</pre>
		<pre>    std::cout &lt;&lt; "plogger1: " &lt;&lt; plogger1 &lt;&lt; std::endl &lt;&lt; "plogger2: " &lt;&lt; plogger2 &lt;&lt; std::endl;</pre>
		<pre>    return 0;<br />}</pre>
		<pre>
				<br />运行结果：</pre>
		<pre>ctor of Logger<br />plogger1: 0x804fc30<br />plogger2: 0x804fc30<br />dtor of Logger</pre>
		<pre>这里的LoggerContainer相当于log4cplus中的Hierarchy类，结果可以看出，通过同一个名称可以获取相同的<br />Logger实例。</pre>
		<pre>
				<br />还有一些小毛病比如RollingFileAppender和DailyRollingFileAppender的参数输入顺序可以调整成统一方式<br />等等，就不细说了。</pre>
		<pre>本部分提到了使用log4cplus时候感觉不爽的地方，最后一部分将介绍一下log4cplus中线程和套接字实现情况<br /></pre>
<img src ="http://www.cppblog.com/tx7do/aggbug/11720.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/tx7do/" target="_blank">杨粼波</a> 2006-08-26 04:50 <a href="http://www.cppblog.com/tx7do/articles/11720.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>开源日志系统log4cplus(五)</title><link>http://www.cppblog.com/tx7do/articles/11719.html</link><dc:creator>杨粼波</dc:creator><author>杨粼波</author><pubDate>Fri, 25 Aug 2006 20:50:00 GMT</pubDate><guid>http://www.cppblog.com/tx7do/articles/11719.html</guid><wfw:comment>http://www.cppblog.com/tx7do/comments/11719.html</wfw:comment><comments>http://www.cppblog.com/tx7do/articles/11719.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/tx7do/comments/commentRss/11719.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/tx7do/services/trackbacks/11719.html</trackback:ping><description><![CDATA[
		<pre>日志系统的另一个基本功能就是能够让使用者按照自己的意愿来控制什么时候，哪些log信息可以输出。<br />如果能够让用户在任意时刻设置允许输出的LogLevel的信息就好了，log4cplus通过LogLevelManager、<br />LogLog、Filter三种方式实现了上述功能。</pre>
		<br />
		<pre>
				<br />### 优先级控制 ###</pre>
		<pre>在研究LogLevelManager之前，首先介绍一下log4cplus中logger的存储机制，在log4cplus中，所有<br />logger都通过一个层次化的结构（其实内部是hash表）来组织的，有一个Root级别的logger,可以通<br />过以下方法获取：</pre>
		<pre>    Logger root = Logger::getRoot();<br />    <br />用户定义的logger都有一个名字与之对应，比如：</pre>
		<pre>    Logger test = Logger::getInstance("test");<br />    <br />可以定义该logger的子logger:</pre>
		<pre>    Logger subTest = Logger::getInstance("test.subtest");<br />    <br />注意Root级别的logger只有通过getRoot方法获取，Logger::getInstance("root")获得的是它的<br />子对象而已。有了这些具有父子关系的logger之后可分别设置其LogLevel,比如：</pre>
		<pre>root.setLogLevel( ... );<br />Test.setLogLevel( ... );<br />subTest.setLogLevel( ... );</pre>
		<pre>
				<br />logger的这种父子关联性会体现在优先级控制方面，log4cplus将输出的log信息按照LogLevel<br />（从低到高）分为：</pre>
		<pre>NOT_SET_LOG_LEVEL (   -1) ：接受缺省的LogLevel，如果有父logger则继承它的LogLevel<br />ALL_LOG_LEVEL     (    0) ：开放所有log信息输出<br />TRACE_LOG_LEVEL   (    0) ：开放trace信息输出(即ALL_LOG_LEVEL)<br />DEBUG_LOG_LEVEL   (10000) ：开放debug信息输出<br />INFO_LOG_LEVEL    (20000) ：开放info信息输出<br />WARN_LOG_LEVEL    (30000) ：开放warning信息输出<br />ERROR_LOG_LEVEL   (40000) ：开放error信息输出<br />FATAL_LOG_LEVEL   (50000) ：开放fatal信息输出<br />OFF_LOG_LEVEL     (60000) ：关闭所有log信息输出</pre>
		<pre>LogLevelManager负责设置logger的优先级，各个logger可以通过setLogLevel设置自己的优先级，<br />当某个logger的LogLevel设置成NOT_SET_LOG_LEVEL时，该logger会继承父logger的优先级，另外，<br />如果定义了重名的多个logger, 对其中任何一个的修改都会同时改变其它logger,我们举例说明：</pre>
		<pre>〖例6〗</pre>
		<pre>#include "log4cplus/logger.h"<br />#include "log4cplus/consoleappender.h"<br />#include "log4cplus/loglevel.h"<br />#include &lt;iostream&gt;<iostream /></pre>
		<pre>using namespace std;<br />using namespace log4cplus;</pre>
		<pre>int main()<br />{<br />    SharedAppenderPtr _append(new ConsoleAppender());<br />    _append-&gt;setName("test");<br />    Logger::getRoot().addAppender(_append);<br />    Logger root = Logger::getRoot();</pre>
		<pre>    Logger test = Logger::getInstance("test");<br />    Logger subTest = Logger::getInstance("test.subtest");<br />    LogLevelManager&amp; llm = getLogLevelManager();</pre>
		<pre>    cout &lt;&lt; endl &lt;&lt; "Before Setting, Default LogLevel" &lt;&lt; endl;<br />    LOG4CPLUS_FATAL(root, "root: " &lt;&lt; llm.toString(root.getChainedLogLevel()))<br />    LOG4CPLUS_FATAL(root, "test: " &lt;&lt; llm.toString(test.getChainedLogLevel()))<br />    LOG4CPLUS_FATAL(root, "test.subtest: " &lt;&lt; llm.toString(subTest.getChainedLogLevel()))</pre>
		<pre>    cout &lt;&lt; endl &lt;&lt; "Setting test.subtest to WARN" &lt;&lt; endl;<br />    subTest.setLogLevel(WARN_LOG_LEVEL);<br />    LOG4CPLUS_FATAL(root, "root: " &lt;&lt; llm.toString(root.getChainedLogLevel()))<br />    LOG4CPLUS_FATAL(root, "test: " &lt;&lt; llm.toString(test.getChainedLogLevel()))<br />    LOG4CPLUS_FATAL(root, "test.subtest: " &lt;&lt; llm.toString(subTest.getChainedLogLevel()))</pre>
		<pre>    cout &lt;&lt; endl &lt;&lt; "Setting test.subtest to TRACE" &lt;&lt; endl;<br />    test.setLogLevel(TRACE_LOG_LEVEL);<br />    LOG4CPLUS_FATAL(root, "root: " &lt;&lt; llm.toString(root.getChainedLogLevel()))<br />    LOG4CPLUS_FATAL(root, "test: " &lt;&lt; llm.toString(test.getChainedLogLevel()))<br />    LOG4CPLUS_FATAL(root, "test.subtest: " &lt;&lt; llm.toString(subTest.getChainedLogLevel()))</pre>
		<pre>    cout &lt;&lt; endl &lt;&lt; "Setting test.subtest to NO_LEVEL" &lt;&lt; endl;<br />    subTest.setLogLevel(NOT_SET_LOG_LEVEL);<br />    LOG4CPLUS_FATAL(root, "root: " &lt;&lt; llm.toString(root.getChainedLogLevel()))<br />    LOG4CPLUS_FATAL(root, "test: " &lt;&lt; llm.toString(test.getChainedLogLevel()))<br />    LOG4CPLUS_FATAL(root, "test.subtest: " &lt;&lt; llm.toString(subTest.getChainedLogLevel()) &lt;&lt; '\n')</pre>
		<pre>    cout &lt;&lt; "create a logger test_bak, named \"test_\", too. " &lt;&lt; endl;<br />    Logger test_bak = Logger::getInstance("test");<br />    cout &lt;&lt; "Setting test to INFO, so test_bak also be set to INFO" &lt;&lt; endl;<br />    test.setLogLevel(INFO_LOG_LEVEL);<br />    LOG4CPLUS_FATAL(root, "test: " &lt;&lt; llm.toString(test.getChainedLogLevel()))<br />    LOG4CPLUS_FATAL(root, "test_bak: " &lt;&lt; llm.toString(test_bak.getChainedLogLevel()))</pre>
		<pre>    return 0;<br />}</pre>
		<pre>输出结果：</pre>
		<pre>Before Setting, Default LogLevel<br />FATAL - root: DEBUG<br />FATAL - test: DEBUG<br />FATAL - test.subtest: DEBUG</pre>
		<pre>Setting test.subtest to WARN<br />FATAL - root: DEBUG<br />FATAL - test: DEBUG<br />FATAL - test.subtest: WARN</pre>
		<pre>Setting test.subtest to TRACE<br />FATAL - root: DEBUG<br />FATAL - test: TRACE<br />FATAL - test.subtest: WARN</pre>
		<pre>Setting test.subtest to NO_LEVEL<br />FATAL - root: DEBUG<br />FATAL - test: TRACE<br />FATAL - test.subtest: TRACE</pre>
		<pre>create a logger test_bak, named "test_", too.<br />Setting test to INFO, so test_bak also be set to INFO<br />FATAL - test: INFO<br />FATAL - test_bak: INFO</pre>
		<pre>
				<br />下面的例子演示了如何通过设置LogLevel来控制用户的log信息输出：</pre>
		<pre>〖例7〗</pre>
		<pre>#include "log4cplus/logger.h"<br />#include "log4cplus/consoleappender.h"<br />#include "log4cplus/loglevel.h"<br />#include &lt;iostream&gt;<iostream /></pre>
		<pre>using namespace std;<br />using namespace log4cplus;</pre>
		<pre>void ShowMsg(void)<br />{<br />    LOG4CPLUS_TRACE(Logger::getRoot(),"info")<br />    LOG4CPLUS_DEBUG(Logger::getRoot(),"info")<br />    LOG4CPLUS_INFO(Logger::getRoot(),"info")<br />    LOG4CPLUS_WARN(Logger::getRoot(),"info")<br />    LOG4CPLUS_ERROR(Logger::getRoot(),"info")<br />    LOG4CPLUS_FATAL(Logger::getRoot(),"info")<br />}</pre>
		<pre>int main()<br />{<br />    SharedAppenderPtr _append(new ConsoleAppender());<br />    _append-&gt;setName("test");<br />    _append-&gt;setLayout(std::auto_ptr<layout />(new TTCCLayout()));<br />    Logger root = Logger::getRoot();<br />    root.addAppender(_append);</pre>
		<pre>    cout &lt;&lt; endl &lt;&lt; "all-log allowed" &lt;&lt; endl;<br />    root.setLogLevel(ALL_LOG_LEVEL);<br />    ShowMsg();</pre>
		<pre>    cout &lt;&lt; endl &lt;&lt; "trace-log and above allowed" &lt;&lt; endl;<br />    root.setLogLevel(TRACE_LOG_LEVEL);<br />    ShowMsg();</pre>
		<pre>    cout &lt;&lt; endl &lt;&lt; "debug-log and above allowed" &lt;&lt; endl;<br />    root.setLogLevel(DEBUG_LOG_LEVEL);<br />    ShowMsg();</pre>
		<pre>    cout &lt;&lt; endl &lt;&lt; "info-log and above allowed" &lt;&lt; endl;<br />    root.setLogLevel(INFO_LOG_LEVEL);<br />    ShowMsg();</pre>
		<pre>    cout &lt;&lt; endl &lt;&lt; "warn-log and above allowed" &lt;&lt; endl;<br />    root.setLogLevel(WARN_LOG_LEVEL);<br />    ShowMsg();</pre>
		<pre>    cout &lt;&lt; endl &lt;&lt; "error-log and above allowed" &lt;&lt; endl;<br />    root.setLogLevel(ERROR_LOG_LEVEL);<br />    ShowMsg();</pre>
		<pre>    cout &lt;&lt; endl &lt;&lt; "fatal-log and above allowed" &lt;&lt; endl;<br />    root.setLogLevel(FATAL_LOG_LEVEL);<br />    ShowMsg();</pre>
		<pre>    cout &lt;&lt; endl &lt;&lt; "log disabled" &lt;&lt; endl;<br />    root.setLogLevel(OFF_LOG_LEVEL);<br />    ShowMsg();</pre>
		<pre>    return 0;<br />}</pre>
		<pre>输出结果：</pre>
		<pre>all-log allowed<br />10-17-04 10:11:40,587 [1075298944] TRACE root &lt;&gt; - info<br />10-17-04 10:11:40,590 [1075298944] DEBUG root &lt;&gt; - info<br />10-17-04 10:11:40,591 [1075298944] INFO root &lt;&gt; - info<br />10-17-04 10:11:40,591 [1075298944] WARN root &lt;&gt; - info<br />10-17-04 10:11:40,592 [1075298944] ERROR root &lt;&gt; - info<br />10-17-04 10:11:40,592 [1075298944] FATAL root &lt;&gt; - info</pre>
		<pre>trace-log and above allowed<br />10-17-04 10:11:40,593 [1075298944] TRACE root &lt;&gt; - info<br />10-17-04 10:11:40,593 [1075298944] DEBUG root &lt;&gt; - info<br />10-17-04 10:11:40,594 [1075298944] INFO root &lt;&gt; - info<br />10-17-04 10:11:40,594 [1075298944] WARN root &lt;&gt; - info<br />10-17-04 10:11:40,594 [1075298944] ERROR root &lt;&gt; - info<br />10-17-04 10:11:40,594 [1075298944] FATAL root &lt;&gt; - info</pre>
		<pre>debug-log and above allowed<br />10-17-04 10:11:40,595 [1075298944] DEBUG root &lt;&gt; - info<br />10-17-04 10:11:40,595 [1075298944] INFO root &lt;&gt; - info<br />10-17-04 10:11:40,596 [1075298944] WARN root &lt;&gt; - info<br />10-17-04 10:11:40,596 [1075298944] ERROR root &lt;&gt; - info<br />10-17-04 10:11:40,596 [1075298944] FATAL root &lt;&gt; - info</pre>
		<pre>info-log and above allowed<br />10-17-04 10:11:40,597 [1075298944] INFO root &lt;&gt; - info<br />10-17-04 10:11:40,597 [1075298944] WARN root &lt;&gt; - info<br />10-17-04 10:11:40,597 [1075298944] ERROR root &lt;&gt; - info<br />10-17-04 10:11:40,598 [1075298944] FATAL root &lt;&gt; - info</pre>
		<pre>warn-log and above allowed<br />10-17-04 10:11:40,598 [1075298944] WARN root &lt;&gt; - info<br />10-17-04 10:11:40,598 [1075298944] ERROR root &lt;&gt; - info<br />10-17-04 10:11:40,599 [1075298944] FATAL root &lt;&gt; - info</pre>
		<pre>error-log and above allowed<br />10-17-04 10:11:40,599 [1075298944] ERROR root &lt;&gt; - info<br />10-17-04 10:11:40,600 [1075298944] FATAL root &lt;&gt; - info</pre>
		<pre>fatal-log and above allowed<br />10-17-04 10:11:40,600 [1075298944] FATAL root &lt;&gt; - info</pre>
		<pre>log disabled</pre>
		<pre> </pre>
		<pre>用户也可以自行定义LogLevel，操作比较简单，首先要定义LEVEL值，比如HELLO_LOG_LEVEL定义如下：</pre>
		<pre>/* DEBUG_LOG_LEVEL  &lt; HELLO_LOG_LEVEL &lt; INFO_LOG_LEVEL */<br />const LogLevel HELLO_LOG_LEVEL = 15000;</pre>
		<pre>然后定义以下宏即可：</pre>
		<pre>/* define MACRO LOG4CPLUS_HELLO */<br />#define LOG4CPLUS_HELLO(logger, logEvent) \<br />    if(logger.isEnabledFor(HELLO_LOG_LEVEL)) { \<br />        log4cplus::tostringstream _log4cplus_buf; \<br />        _log4cplus_buf &lt;&lt; logEvent; \<br /> logger.forcedLog(HELLO_LOG_LEVEL, _log4cplus_buf.str(), __FILE__, __LINE__); \<br />    }</pre>
		<pre>不过log4cplus没有提供给用户一个接口来实现LEVEL值与字符串的转换，所以当带格式输出LogLevel字符<br />串时候会显示"UNKNOWN"， 不够理想。比如用TTCCLayout控制输出的结果可能会如下所示：</pre>
		<pre>10-17-04 11:17:51,124 [1075298944] UNKNOWN root &lt;&gt; - info</pre>
		<pre>而不是期望的以下结果：<br />10-17-04 11:17:51,124 [1075298944] HELLO root &lt;&gt; - info</pre>
		<pre>要想实现第二种结果，按照log4cplus现有的接口机制，只能改其源代码后重新编译，方法是在loglevel.cxx<br />中加入：</pre>
		<pre>#define _HELLO_STRING LOG4CPLUS_TEXT("HELLO")</pre>
		<pre>然后修改log4cplus::tstring  defaultLogLevelToStringMethod(LogLevel ll)函数，增加一个判断：</pre>
		<pre>case HELLO_LOG_LEVEL:    return _HELLO_STRING;</pre>
		<pre>重新编译log4cplus源代码后生成库文件，再使用时即可实现满意效果。</pre>
		<pre>
				<br />### 调试模式 ###</pre>
		<pre>即通过loglog来控制输出调试、警告或错误信息，见例4，这里不再赘述。</pre>
		<pre> </pre>
		<pre>### 基于脚本配置来过滤log信息 ###</pre>
		<pre>除了通过程序实现对log环境的配置之外，log4cplus通过PropertyConfigurator类实现了基于脚本配置的功能。<br />通过脚本可以完成对logger、appender和layout的配置，因此可以解决怎样输出，输出到哪里的问题，我将在<br />全文的最后一部分中提到多线程环境中如何利用脚本配置来配合实现性能测试，本节将重点介绍基脚本实现过<br />滤log信息的功能。</pre>
		<pre>首先简单介绍一下脚本的语法规则：</pre>
		<pre>包括Appender的配置语法和logger的配置语法，其中：</pre>
		<pre>1.Appender的配置语法:</pre>
		<pre>（1）设置名称：</pre>
		<pre>/*设置方法*/<br />log4cplus.appender.appenderName=fully.qualified.name.of.appender.class</pre>
		<pre>例如（列举了所有可能的Appender，其中SocketAppender后面会讲到）：<br />log4cplus.appender.append_1=log4cplus::ConsoleAppender<br />log4cplus.appender.append_2=log4cplus::FileAppender<br />log4cplus.appender.append_3=log4cplus::RollingFileAppender<br />log4cplus.appender.append_4=log4cplus::DailyRollingFileAppender<br />log4cplus.appender.append_4=log4cplus::SocketAppender</pre>
		<pre>（2）设置Filter：</pre>
		<pre>包括选择过滤器和设置过滤条件，可选择的过滤器包括：LogLevelMatchFilter、LogLevelRangeFilter、<br />和StringMatchFilter：</pre>
		<pre>对LogLevelMatchFilter来说，过滤条件包括LogLevelToMatch和AcceptOnMatch（true|false）， 只有<br />当log信息的LogLevel值与LogLevelToMatch相同，且AcceptOnMatch为true时才会匹配。</pre>
		<pre>LogLevelRangeFilter来说，过滤条件包括LogLevelMin、LogLevelMax和AcceptOnMatch，只有当log信息<br />的LogLevel在LogLevelMin、LogLevelMax之间同时AcceptOnMatch为true时才会匹配。</pre>
		<pre>对StringMatchFilter来说，过滤条件包括StringToMatch和AcceptOnMatch，只有当log信息的LogLevel值<br />与StringToMatch对应的LogLevel值与相同， 且AcceptOnMatch为true时会匹配。</pre>
		<pre>
				<br />过滤条件处理机制类似于IPTABLE的Responsibility chain，（即先deny、再allow）不过执行顺序刚好相反，<br />后写的条件会被先执行，比如：</pre>
		<pre>log4cplus.appender.append_1.filters.1=log4cplus::spi::LogLevelMatchFilter<br />log4cplus.appender.append_1.filters.1.LogLevelToMatch=TRACE<br />log4cplus.appender.append_1.filters.1.AcceptOnMatch=true<br />#log4cplus.appender.append_1.filters.2=log4cplus::spi::DenyAllFilter</pre>
		<pre>会首先执行filters.2的过滤条件，关闭所有过滤器，然后执行filters.1，仅匹配TRACE信息。</pre>
		<pre>（3）设置Layout</pre>
		<pre>可以选择不设置、TTCCLayout、或PatternLayout</pre>
		<pre>如果不设置，会输出简单格式的log信息。</pre>
		<pre>设置TTCCLayout如下所示：<br />log4cplus.appender.ALL_MSGS.layout=log4cplus::TTCCLayout</pre>
		<pre>设置PatternLayout如下所示：<br />log4cplus.appender.append_1.layout=log4cplus::PatternLayout<br />log4cplus.appender.append_1.layout.ConversionPattern=%d{%m/%d/%y %H:%M:%S,%Q} [%t] %-5p - %m%n</pre>
		<pre>
				<br />2.logger的配置语法</pre>
		<pre>包括rootLogger和non-root logger。</pre>
		<pre>对于rootLogger来说：<br />log4cplus.rootLogger=[LogLevel], appenderName, appenderName, ...</pre>
		<pre>对于non-root logger来说：<br />log4cplus.logger.logger_name=[LogLevel|INHERITED], appenderName, appenderName, ...</pre>
		<pre>
				<br />脚本方式使用起来非常简单，只要首先加载配置即可（urconfig.properties是自行定义的配置文件）：</pre>
		<pre>PropertyConfigurator::doConfigure("urconfig.properties");</pre>
		<pre>
				<br />下面我们通过例子体会一下log4cplus强大的基于脚本过滤log信息的功能。</pre>
		<pre>
				<br />〖例8〗</pre>
		<pre>/*<br /> *    urconfig.properties<br /> */<br />log4cplus.rootLogger=TRACE, ALL_MSGS, TRACE_MSGS, DEBUG_INFO_MSGS, FATAL_MSGS</pre>
		<pre>log4cplus.appender.ALL_MSGS=log4cplus::RollingFileAppender<br />log4cplus.appender.ALL_MSGS.File=all_msgs.log<br />log4cplus.appender.ALL_MSGS.layout=log4cplus::TTCCLayout</pre>
		<pre>log4cplus.appender.TRACE_MSGS=log4cplus::RollingFileAppender<br />log4cplus.appender.TRACE_MSGS.File=trace_msgs.log<br />log4cplus.appender.TRACE_MSGS.layout=log4cplus::TTCCLayout<br />log4cplus.appender.TRACE_MSGS.filters.1=log4cplus::spi::LogLevelMatchFilter<br />log4cplus.appender.TRACE_MSGS.filters.1.LogLevelToMatch=TRACE<br />log4cplus.appender.TRACE_MSGS.filters.1.AcceptOnMatch=true<br />log4cplus.appender.TRACE_MSGS.filters.2=log4cplus::spi::DenyAllFilter</pre>
		<pre>log4cplus.appender.DEBUG_INFO_MSGS=log4cplus::RollingFileAppender<br />log4cplus.appender.DEBUG_INFO_MSGS.File=debug_info_msgs.log<br />log4cplus.appender.DEBUG_INFO_MSGS.layout=log4cplus::TTCCLayout<br />log4cplus.appender.DEBUG_INFO_MSGS.filters.1=log4cplus::spi::LogLevelRangeFilter<br />log4cplus.appender.DEBUG_INFO_MSGS.filters.1.LogLevelMin=DEBUG<br />log4cplus.appender.DEBUG_INFO_MSGS.filters.1.LogLevelMax=INFO<br />log4cplus.appender.DEBUG_INFO_MSGS.filters.1.AcceptOnMatch=true<br />log4cplus.appender.DEBUG_INFO_MSGS.filters.2=log4cplus::spi::DenyAllFilter</pre>
		<pre>log4cplus.appender.FATAL_MSGS=log4cplus::RollingFileAppender<br />log4cplus.appender.FATAL_MSGS.File=fatal_msgs.log<br />log4cplus.appender.FATAL_MSGS.layout=log4cplus::TTCCLayout<br />log4cplus.appender.FATAL_MSGS.filters.1=log4cplus::spi::StringMatchFilter<br />log4cplus.appender.FATAL_MSGS.filters.1.StringToMatch=FATAL<br />log4cplus.appender.FATAL_MSGS.filters.1.AcceptOnMatch=true<br />log4cplus.appender.FATAL_MSGS.filters.2=log4cplus::spi::DenyAllFilter</pre>
		<pre>
				<br />/*<br /> *    main.cpp<br /> */<br />#include &lt;log4cplus/logger.h&gt;<br />#include &lt;log4cplus/configurator.h&gt;<br />#include &lt;log4cplus/helpers/stringhelper.h&gt;<log4cplus /></pre>
		<pre>using namespace log4cplus;</pre>
		<pre>static Logger logger = Logger::getInstance("log");</pre>
		<pre>void printDebug()<br />{<br />    LOG4CPLUS_TRACE_METHOD(logger, "::printDebug()");<br />    LOG4CPLUS_DEBUG(logger, "This is a DEBUG message");<br />    LOG4CPLUS_INFO(logger, "This is a INFO message");<br />    LOG4CPLUS_WARN(logger, "This is a WARN message");<br />    LOG4CPLUS_ERROR(logger, "This is a ERROR message");<br />    LOG4CPLUS_FATAL(logger, "This is a FATAL message");<br />}<br />int main()<br />{<br />    Logger root = Logger::getRoot();<br />    PropertyConfigurator::doConfigure("urconfig.properties");<br />    printDebug();</pre>
		<pre>    return 0;<br />}</pre>
		<pre>运行结果：</pre>
		<pre>1. all_msgs.log<br />10-17-04 14:55:25,858 [1075298944] TRACE log &lt;&gt; - ENTER: ::printDebug()<br />10-17-04 14:55:25,871 [1075298944] DEBUG log &lt;&gt; - This is a DEBUG message<br />10-17-04 14:55:25,873 [1075298944] INFO log &lt;&gt; - This is a INFO message<br />10-17-04 14:55:25,873 [1075298944] WARN log &lt;&gt; - This is a WARN message<br />10-17-04 14:55:25,874 [1075298944] ERROR log &lt;&gt; - This is a ERROR message<br />10-17-04 14:55:25,874 [1075298944] FATAL log &lt;&gt; - This is a FATAL message<br />10-17-04 14:55:25,875 [1075298944] TRACE log &lt;&gt; - EXIT:  ::printDebug()</pre>
		<pre>2. trace_msgs.log<br />10-17-04 14:55:25,858 [1075298944] TRACE log &lt;&gt; - ENTER: ::printDebug()<br />10-17-04 14:55:25,875 [1075298944] TRACE log &lt;&gt; - EXIT:  ::printDebug()</pre>
		<pre>3. debug_info_msgs.log<br />10-17-04 14:55:25,871 [1075298944] DEBUG log &lt;&gt; - This is a DEBUG message<br />10-17-04 14:55:25,873 [1075298944] INFO log &lt;&gt; - This is a INFO message</pre>
		<pre>4. fatal_msgs.log<br />10-17-04 14:55:25,874 [1075298944] FATAL log &lt;&gt; - This is a FATAL message</pre>
		<pre> </pre>
		<pre>本部分详细介绍了如何有选择地控制log信息的输出，最后一部分我们将介绍一下多线程、<br />和C/S模式下该如何操作，顺便提一下NDC的概念。</pre>
<img src ="http://www.cppblog.com/tx7do/aggbug/11719.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/tx7do/" target="_blank">杨粼波</a> 2006-08-26 04:50 <a href="http://www.cppblog.com/tx7do/articles/11719.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>开源日志系统log4cplus(四)</title><link>http://www.cppblog.com/tx7do/articles/11718.html</link><dc:creator>杨粼波</dc:creator><author>杨粼波</author><pubDate>Fri, 25 Aug 2006 20:50:00 GMT</pubDate><guid>http://www.cppblog.com/tx7do/articles/11718.html</guid><wfw:comment>http://www.cppblog.com/tx7do/comments/11718.html</wfw:comment><comments>http://www.cppblog.com/tx7do/articles/11718.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/tx7do/comments/commentRss/11718.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/tx7do/services/trackbacks/11718.html</trackback:ping><description><![CDATA[
		<p>将log信息记录到文件应该说是日志系统的一个基本功能，log4cplus在此基础上，提供了更多的功能，可以按照你预先设定的大小来决定是否转储，当超过该大小，后续log信息会另存到新文件中，依次类推；或者按照日期来决定是否转储。本文将详细介绍这些用法。</p>
		<br />
		<pre>
				<br />### 如何将log记录到文件 ###</pre>
		<pre>我们在例5中给出了一个将log记录到文件的例子，用的是FileAppender类实现的，log4cplus提供了三个类用于<br />文件操作，它们是FileAppender类、RollingFileAppender类、DailyRollingFileAppender类。</pre>
		<pre>1. FileAppender类</pre>
		<pre>实现了基本的文件操作功能，构造函数如下：</pre>
		<pre>FileAppender(const log4cplus::tstring&amp; filename,<br />                     LOG4CPLUS_OPEN_MODE_TYPE mode = LOG4CPLUS_FSTREAM_NAMESPACE::ios::trunc,<br />                     bool immediateFlush = true);<br />                     <br />filename       : 文件名<br />mode           : 文件类型，可选择的文件类型包括app、ate、binary、in、out、trunc，因为实际上只是对<br />                 stl的一个简单包装，呵呵，这里就不多讲了。缺省是trunc，表示将先前文件删除。<br />immediateFlush ：缓冲刷新标志，如果为true表示每向文件写一条记录就刷新一次缓存，否则直到FileAppender<br />                 被关闭或文件缓存已满才更新文件，一般是要设置true的，比如你往文件写的过程中出现<br />                 了错误（如程序非正常退出），即使文件没有正常关闭也可以保证程序终止时刻之前的所有<br />                 记录都会被正常保存。</pre>
		<pre>FileAppender类的使用情况请参考例5，这里不再赘述。</pre>
		<pre>
				<br />2. RollingFileAppender类</pre>
		<pre>构造函数如下：<br />log4cplus::RollingFileAppender::RollingFileAppender(const log4cplus::tstring&amp; filename,<br />                                                    long maxFileSize,<br />                                                    int maxBackupIndex,<br />                                                    bool immediateFlush)</pre>
		<pre>filename       : 文件名<br />maxFileSize    : 文件的最大尺寸<br />maxBackupIndex : 最大记录文件数<br />immediateFlush : 缓冲刷新标志<br />                                                    <br />RollingFileAppender类可以根据你预先设定的大小来决定是否转储，当超过该大小，后续log信息会另存到新<br />文件中，除了定义每个记录文件的大小之外，你还要确定在RollingFileAppender类对象构造时最多需要多少个<br />这样的记录文件(maxBackupIndex+1)，当存储的文件数目超过maxBackupIndex+1时，会删除最早生成的文件，<br />保证整个文件数目等于maxBackupIndex+1。然后继续记录，比如以下代码片段：</pre>
		<pre>    ... ...<br />    <br />    #define LOOP_COUNT 200000<br />    <br />    SharedAppenderPtr _append(new RollingFileAppender("Test.log", 5*1024, 5));<br />    _append-&gt;setName("file test");<br />    _append-&gt;setLayout( std::auto_ptr<layout />(new TTCCLayout()) );<br />    Logger::getRoot().addAppender(_append);</pre>
		<pre>    Logger root = Logger::getRoot();<br />    Logger test = Logger::getInstance("test");<br />    Logger subTest = Logger::getInstance("test.subtest");</pre>
		<pre>    for(int i=0; i<loop_count; />    {<br />        NDCContextCreator _context("loop");<br />        LOG4CPLUS_DEBUG(subTest, "Entering loop #" &lt;&lt; i)<br />    }<br />    <br />    ... ...<br />    </pre>
		<pre>运行结果：</pre>
		<pre>运行后会产生6个输出文件，Test.log、Test.log.1、Test.log.2、Test.log.3、Test.log.4、Test.log.5<br />其中Test.log存放着最新写入的信息，而最后一个文件中并不包含第一个写入信息，说明已经被不断更新了。<br />需要指出的是，这里除了Test.log之外，每个文件的大小都是200K,而不是我们想像中的5K，这是因为<br />log4cplus中隐含定义了文件的最小尺寸是200K，只有大于200K的设置才生效，&lt;= 200k的设置都会被认为是<br />200K.</pre>
		<pre>
				<br />3. DailyRollingFileAppender类</pre>
		<pre>构造函数如下：<br />DailyRollingFileAppender::DailyRollingFileAppender(const log4cplus::tstring&amp; filename,<br />                                                   DailyRollingFileSchedule schedule,<br />                                                   bool immediateFlush,<br />                                                   int maxBackupIndex)<br />                                                   <br />filename       : 文件名<br />schedule       : 存储频度<br />immediateFlush : 缓冲刷新标志<br />maxBackupIndex : 最大记录文件数</pre>
		<pre>DailyRollingFileAppender类可以根据你预先设定的频度来决定是否转储，当超过该频度，后续log信息会另存<br />到新文件中，这里的频度包括：MONTHLY（每月）、WEEKLY（每周）、DAILY（每日）、TWICE_DAILY（每两天）、<br />HOURLY（每时）、MINUTELY（每分）。maxBackupIndex的含义同上所述，比如以下代码片段：</pre>
		<pre>    ... ...<br />    <br />    SharedAppenderPtr _append(new DailyRollingFileAppender("Test.log", MINUTELY, true, 5));<br />    _append-&gt;setName("file test");<br />    _append-&gt;setLayout( std::auto_ptr<layout />(new TTCCLayout()) );<br />    Logger::getRoot().addAppender(_append);</pre>
		<pre>    Logger root = Logger::getRoot();<br />    Logger test = Logger::getInstance("test");<br />    Logger subTest = Logger::getInstance("test.subtest");</pre>
		<pre>    for(int i=0; i<loop_count; />    {<br />        NDCContextCreator _context("loop");<br />        LOG4CPLUS_DEBUG(subTest, "Entering loop #" &lt;&lt; i)<br />    }<br />    <br />    ... ...</pre>
		<pre>
				<br />运行结果：</pre>
		<pre>运行后会以分钟为单位，分别生成名为Test.log.2004-10-17-03-03、Test.log.2004-10-17-03-04和<br />Test.log.2004-10-17-03-05这样的文件。</pre>
		<pre>需要指出的是，刚看到按照频度（如HOURLY、MINUTELY）转储这样的概念，以为log4cplus提供了内部定时器，<br />感觉很奇怪，因为日志系统不应该主动记录，而loging事件总是应该被动触发的啊。仔细看了源代码后才知道<br />这里的"频度"并不是你写入文件的速度，其实是否转储的标准并不依赖你写入文件的速度，而是依赖于写入<br />的那一时刻是否满足了频度条件，即是否超过了以分钟、小时、周、月为单位的时间刻度，如果超过了就另存。</pre>
		<pre>本部分详细介绍log信息的几种文件操作方式，下面将重点介绍一下如何有选择地控制log信息的输出。</pre>
<img src ="http://www.cppblog.com/tx7do/aggbug/11718.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/tx7do/" target="_blank">杨粼波</a> 2006-08-26 04:50 <a href="http://www.cppblog.com/tx7do/articles/11718.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>开源日志系统log4cplus(三)</title><link>http://www.cppblog.com/tx7do/articles/11717.html</link><dc:creator>杨粼波</dc:creator><author>杨粼波</author><pubDate>Fri, 25 Aug 2006 20:49:00 GMT</pubDate><guid>http://www.cppblog.com/tx7do/articles/11717.html</guid><wfw:comment>http://www.cppblog.com/tx7do/comments/11717.html</wfw:comment><comments>http://www.cppblog.com/tx7do/articles/11717.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/tx7do/comments/commentRss/11717.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/tx7do/services/trackbacks/11717.html</trackback:ping><description><![CDATA[
		<p>本文介绍了三种控制输出格式的布局管理器的概念和使用情况，通过掌握这些知识，可以更有效地控制log系统输出尽可能贴近你需求的信息来。<br /></p>
		<pre>
				<br />### 如何控制输出消息的格式 ###</pre>
		<pre>前面已经讲过，log4cplus通过布局器（Layouts）来控制输出的格式，log4cplus提供了三种类型的Layouts，<br />分别是SimpleLayout、PatternLayout、和TTCCLayout。其中：</pre>
		<pre>1. SimpleLayout<br />是一种简单格式的布局器，在输出的原始信息之前加上LogLevel和一个"-"。</pre>
		<pre>比如以下代码片段：</pre>
		<pre>    ... ...</pre>
		<pre>    /* step 1: Instantiate an appender object */<br />    SharedObjectPtr _append (new ConsoleAppender());<br />    _append-&gt;setName("append for test");</pre>
		<pre>    /* step 2: Instantiate a layout object */<br />    std::auto_ptr  _layout(new log4cplus::SimpleLayout());</pre>
		<pre>    /* step 3: Attach the layout object to the appender */<br />    _append-&gt;setLayout( _layout );</pre>
		<pre>    /* step 4: Instantiate a logger object */<br />    Logger _logger = Logger::getInstance("test");</pre>
		<pre>    /* step 5: Attach the appender object to the logger  */<br />    _logger.addAppender(_append);</pre>
		<pre>     /* log activity */<br />    LOG4CPLUS_DEBUG(_logger, "This is the simple formatted log message...")<br />    <br />    ... ...<br />    <br />    <br />将打印结果：<br />DEBUG - This is the simple formatted log message...</pre>
		<pre>2. PatternLayout<br />是一种有词法分析功能的模式布局器，一提起模式就会想起正则表达式，这里的模式和正则表达式类似，但是<br />远比后者简单，能够对预定义的标识符（称为conversion specifiers）进行解析，转换成特定格式输出。以下<br />代码片段演示了如何使用PatternLayout：</pre>
		<pre>    ... ...</pre>
		<pre>    /* step 1: Instantiate an appender object */<br />    SharedObjectPtr _append (new ConsoleAppender());<br />    _append-&gt;setName("append for test");<br />   <br />    /* step 2: Instantiate a layout object */<br />    std::string pattern = "%d{%m/%d/%y %H:%M:%S}  - %m [%l]%n";<br />    std::auto_ptr _layout(new PatternLayout(pattern));<br />    <br />    /* step 3: Attach the layout object to the appender */<br />    _append-&gt;setLayout( _layout );</pre>
		<pre>    /* step 4: Instantiate a logger object */<br />    Logger _logger = Logger::getInstance("test_logger.subtest");</pre>
		<pre>    /* step 5: Attach the appender object to the logger  */<br />    _logger.addAppender(_append);</pre>
		<pre>     /* log activity */<br />    LOG4CPLUS_DEBUG(_logger, "teststr")<br />    <br />    ... ...<br />    <br />输出结果：<br />10/16/04 18:51:25  - teststr [main.cpp:51]</pre>
		<pre>可以看出通过填写特定格式的模式字符串"pattern"，原始信息被包含到一堆有格式的信息当中了，这就使得<br />用户可以根据自身需要来定制显示内容。"pattern"可以包含普通字符串和预定义的标识符，其中：</pre>
		<pre>（1）普通字符串，能够被直接显示的信息。<br />（2）预定义标识符，通过"%"与一个或多个字符共同构成预定义的标识符，能够产生出特定格式信息。</pre>
		<pre>关于预定义标识符，log4cplus文档中提供了详细的格式说明，我每种都试了一下，以上述代码为例，根据不同<br />的pattern，各种消息格式使用情况列举如下：</pre>
		<pre>（1）"%%"，转义为%, 即，std::string pattern = "%%" 时输出: "%"<br />（2）"%c"，输出logger名称，比如std::string pattern ="%c" 时输出: "test_logger.subtest"，<br />     也可以控制logger名称的显示层次，比如"%c{1}"时输出"test_logger"，其中数字表示层次。<br />（3）"%D"，显示本地时间，当std::string pattern ="%D" 时输出:"2004-10-16 18:55:45"，%d显示标准时间，<br />     所以当std::string pattern ="%d" 时输出 "2004-10-16 10:55:45" （因为我们是东8区，差8个小时啊）。<br />     可以通过%d{...}定义更详细的显示格式，比如%d{%H:%M:%s}表示要显示小时:分钟：秒。大括号中可显示的<br />     预定义标识符如下：<br />     <br />%a -- 表示礼拜几，英文缩写形式，比如"Fri"<br />%A -- 表示礼拜几，比如"Friday"<br />%b -- 表示几月份，英文缩写形式，比如"Oct"<br />%B -- 表示几月份，"October"<br />%c -- 标准的日期＋时间格式，如 "Sat Oct 16 18:56:19 2004"<br />%d -- 表示今天是这个月的几号(1-31)"16"<br />%H -- 表示当前时刻是几时(0-23)，如 "18"<br />%I -- 表示当前时刻是几时(1-12)，如 "6"<br />%j -- 表示今天是哪一天(1-366)，如 "290"<br />%m -- 表示本月是哪一月(1-12)，如 "10"<br />%M -- 表示当前时刻是哪一分钟(0-59)，如 "59"<br />%p -- 表示现在是上午还是下午， AM or PM<br />%q -- 表示当前时刻中毫秒部分(0-999)，如 "237"<br />%Q -- 表示当前时刻中带小数的毫秒部分(0-999.999)，如 "430.732"<br />%S -- 表示当前时刻的多少秒(0-59)，如 "32"<br />%U -- 表示本周是今年的第几个礼拜，以周日为第一天开始计算(0-53)，如 "41"<br />%w -- 表示礼拜几，(0-6, 礼拜天为0)，如 "6"<br />%W -- 表示本周是今年的第几个礼拜，以周一为第一天开始计算(0-53)，如 "41"<br />%x -- 标准的日期格式，如 "10/16/04"<br />%X -- 标准的时间格式，如 "19:02:34"<br />%y -- 两位数的年份(0-99)，如 "04"<br />%Y -- 四位数的年份，如 "2004"<br />%Z -- 时区名，比如 "GMT"</pre>
		<pre>（4）"%F"，输出当前记录器所在的文件名称，比如std::string pattern ="%F" 时输出: "main.cpp"<br />（5）"%L"，输出当前记录器所在的文件行号，比如std::string pattern ="%L" 时输出: "51"<br />（6）"%l"，输出当前记录器所在的文件名称和行号，比如std::string pattern ="%L" 时输出:<br />     "main.cpp:51"<br />（7）"%m"，输出原始信息，比如std::string pattern ="%m" 时输出: "teststr"，即上述代码中<br />     LOG4CPLUS_DEBUG的第二个参数，这种实现机制可以确保原始信息被嵌入到带格式的信息中。<br />（8）"%n"，换行符，没什么好解释的<br />（9）"%p"，输出LogLevel，比如std::string pattern ="%p" 时输出: "DEBUG"<br />（10）"%t"，输出记录器所在的线程ID，比如std::string pattern ="%t" 时输出: "1075298944"<br />（11）"%x"，嵌套诊断上下文NDC (nested diagnostic context) 输出，从堆栈中弹出上下文信息，NDC可以用对<br />      不同源的log信息（同时地）交叉输出进行区分，关于NDC方面的详细介绍会在下文中提到。<br />（12）格式对齐，比如std::string pattern ="%-10m"时表示左对齐，宽度是10，此时会输出"teststr   "，当<br />      然其它的控制字符也可以相同的方式来使用，比如"%-12d"，"%-5p"等等（刚接触log4cplus文档时还以为<br />      "%-5p"整个字符串代表LogLevel呢，呵呵）。</pre>
		<pre>      <br />3. TTCCLayout<br />是在PatternLayout基础上发展的一种缺省的带格式输出的布局器， 其格式由时间，线程ID，Logger和NDC 组<br />成（consists of time, thread, Logger and nested diagnostic context information, hence the name），<br />因而得名（怎么得名的？Logger里哪里有那个"C"的缩写啊！名字起得真够烂的，想扁人）。提供给那些想显示<br />典型的信息（一般情况下够用了）又懒得配置pattern的同志们。</pre>
		<pre>TTCCLayout在构造时有机会选择显示本地时间或GMT时间，缺省是按照本地时间显示：<br />TTCCLayout::TTCCLayout(bool use_gmtime  = false)</pre>
		<pre>以下代码片段演示了如何使用TTCCLayout：</pre>
		<pre>    ... ...</pre>
		<pre>    /* step 1: Instantiate an appender object */<br />    SharedObjectPtr _append (new ConsoleAppender());<br />    _append-&gt;setName("append for test");</pre>
		<pre>    /* step 2: Instantiate a layout object */<br />    std::auto_ptr _layout(new TTCCLayout());</pre>
		<pre>    /* step 3: Attach the layout object to the appender */<br />    _append-&gt;setLayout( _layout );</pre>
		<pre>    /* step 4: Instantiate a logger object */<br />    Logger _logger = Logger::getInstance("test_logger");</pre>
		<pre>    /* step 5: Attach the appender object to the logger  */<br />    _logger.addAppender(_append);</pre>
		<pre>     /* log activity */<br />    LOG4CPLUS_DEBUG(_logger, "teststr")<br />    <br />    ... ...<br />    <br />输出结果：<br />10-16-04 19:08:27,501 [1075298944] DEBUG test_logger &lt;&gt; - teststr</pre>
		<pre>
				<br />当构造TTCCLayout对象时选择GMT时间格式时：</pre>
		<pre>    ... ...<br />    <br />    /* step 2: Instantiate a layout object */<br />    std::auto_ptr _layout(new TTCCLayout(true));<br />    <br />    ... ...<br />    <br />输出结果：<br />10-16-04 11:12:47,678 [1075298944] DEBUG test_logger &lt;&gt; - teststr</pre>
		<pre>
				<br />本文介绍了控制log信息格式的相关知识，下一部分将详细介绍log信息的几种文件操作方式。</pre>
<img src ="http://www.cppblog.com/tx7do/aggbug/11717.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/tx7do/" target="_blank">杨粼波</a> 2006-08-26 04:49 <a href="http://www.cppblog.com/tx7do/articles/11717.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>开源日志系统log4cplus(二)</title><link>http://www.cppblog.com/tx7do/articles/11716.html</link><dc:creator>杨粼波</dc:creator><author>杨粼波</author><pubDate>Fri, 25 Aug 2006 20:49:00 GMT</pubDate><guid>http://www.cppblog.com/tx7do/articles/11716.html</guid><wfw:comment>http://www.cppblog.com/tx7do/comments/11716.html</wfw:comment><comments>http://www.cppblog.com/tx7do/articles/11716.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/tx7do/comments/commentRss/11716.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/tx7do/services/trackbacks/11716.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 本文介绍了使用log4cplus有六个步骤，并提供了一些例子引导你了解log4cplus的基本使用。				### 基本使用 ###使用log4cplus有六个基本步骤：1. 实例化一个appender对象2. 实例化一个layout对象3. 将layout对象绑定(attach)到appender对象4. 实例化一个logger对象,调用静态函数：log4cplus::Logge...&nbsp;&nbsp;<a href='http://www.cppblog.com/tx7do/articles/11716.html'>阅读全文</a><img src ="http://www.cppblog.com/tx7do/aggbug/11716.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/tx7do/" target="_blank">杨粼波</a> 2006-08-26 04:49 <a href="http://www.cppblog.com/tx7do/articles/11716.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>开源日志系统log4cplus(一)</title><link>http://www.cppblog.com/tx7do/articles/11715.html</link><dc:creator>杨粼波</dc:creator><author>杨粼波</author><pubDate>Fri, 25 Aug 2006 20:45:00 GMT</pubDate><guid>http://www.cppblog.com/tx7do/articles/11715.html</guid><wfw:comment>http://www.cppblog.com/tx7do/comments/11715.html</wfw:comment><comments>http://www.cppblog.com/tx7do/articles/11715.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/tx7do/comments/commentRss/11715.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/tx7do/services/trackbacks/11715.html</trackback:ping><description><![CDATA[<p>log4cplus是C++编写的开源的日志系统，功能非常全面，用到自己开发的工程中会比较专业的，：），本文介绍了log4cplus基本概念，以及如何安装，配置。 <br></p>
<pre>				<br>### 简介 ###</pre>
<pre>log4cplus是C++编写的开源的日志系统，前身是java编写的log4j系统.受Apache Software License<br>保护。作者是Tad E. Smith。log4cplus具有线程安全、灵活、以及多粒度控制的特点，通过将信息划分<br>优先级使其可以面向程序调试、运行、测试、和维护等全生命周期； 你可以选择将信息输出到屏幕、文件、<br>NT event log、甚至是远程服务器；通过指定策略对日志进行定期备份等等。</pre>
<pre>&nbsp;</pre>
<pre>### 下载 ###</pre>
<pre>最新的log4cplus可以从以下网址下载 <a href="http://log4cplus.sourceforge.net/"><font color=#002c99>http://log4cplus.sourceforge.net</font></a><br>本文使用的版本为：1.0.2</pre>
<pre>&nbsp;</pre>
<pre>### 安装 ###</pre>
<pre>&nbsp;</pre>
<pre>1. linux下安装</pre>
<pre>
<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">tar&nbsp;xvzf&nbsp;log4cplus</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">x.x.x.tar.gz<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>cd&nbsp;log4cplus</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">x.x.x.<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">configure&nbsp;</span><span style="COLOR: #000000">--</span><span style="COLOR: #000000">prefix</span><span style="COLOR: #000000">=/</span><span style="COLOR: #000000">where</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">to</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">install<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>make<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>make&nbsp;install</span></div>
<br></pre>
<pre>这里我采用缺省安装路径：/usr/local，下文如无特别说明，均以此路径为准。</pre>
<pre>&nbsp;</pre>
<pre>2. windows下安装</pre>
<pre>不需要安装，有一个msvc6存放包括源代码和用例在内的开发工程（for VC6 only），使用之前请先编译<br>"log4cplus_dll class"工程生成dll，或者编译"log4cplus_static class"工程生成lib.</pre>
<pre>&nbsp;</pre>
<pre>### 使用前的配置 ###</pre>
<pre>1. linux下的配置</pre>
<pre>确保你的Makefile中包含 /usr/local/lib/liblog4cplus.a（静态库）或&nbsp; -llog4cplus（动态库）即可，<br>头文件在/usr/local/include/log4cplus目录下。对于动态库，要想正常使用，还得将库安装路径加入到<br>LD_LIBRARY_PATH 中，我一般是这样做的：以管理员身份登录，在/etc/ld.so.conf中加入安装路径，这里<br>是/usr/local/lib，然后执行ldconfig使设置生效即可。</pre>
<pre>2. windows下的配置</pre>
<pre>将"log4cplus_dll class"工程或"log4cplus_static class"工程的dsp 文件插入到你的工程中，或者直接<br>把两个工程编译生成的库以及头文件所在目录放到你的工程的搜索路径中，如果你使用静态库，请在你的工程中<br>"project/setting/C++"的preprocessor definitions中加入LOG4CPLUS_STATIC。</pre>
<pre>&nbsp;</pre>
<pre>### 构成要素介绍 ###</pre>
<pre>虽然功能强大，应该说log4cplus用起来还是比较复杂的，为了更好地使用它，先介绍一下它的基本要素。</pre>
<pre>Layouts&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ：布局器，控制输出消息的格式.<br>Appenders&nbsp;&nbsp;&nbsp; ：挂接器，与布局器紧密配合，将特定格式的消息输出到所挂接的设备终端<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; （如屏幕，文件等等)。<br>Logger&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ：记录器，保存并跟踪对象日志信息变更的实体，当你需要对一个对象进行<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 记录时，就需要生成一个logger。<br>Categories&nbsp;&nbsp; ：分类器，层次化（hierarchy）的结构，用于对被记录信息的分类，层次中<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 每一个节点维护一个logger的所有信息。<br>Priorities&nbsp;&nbsp; ：优先权，包括TRACE, DEBUG, INFO, WARNING, ERROR, FATAL。</pre>
<pre>				<br>本文介绍了log4cplus基本概念，以及如何安装，配置，下一篇将通过例子介绍如何使用log4cplus。</pre>
<img src ="http://www.cppblog.com/tx7do/aggbug/11715.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/tx7do/" target="_blank">杨粼波</a> 2006-08-26 04:45 <a href="http://www.cppblog.com/tx7do/articles/11715.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VC中加入定时机制的几种方法</title><link>http://www.cppblog.com/tx7do/articles/8923.html</link><dc:creator>杨粼波</dc:creator><author>杨粼波</author><pubDate>Fri, 23 Jun 2006 13:48:00 GMT</pubDate><guid>http://www.cppblog.com/tx7do/articles/8923.html</guid><wfw:comment>http://www.cppblog.com/tx7do/comments/8923.html</wfw:comment><comments>http://www.cppblog.com/tx7do/articles/8923.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/tx7do/comments/commentRss/8923.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/tx7do/services/trackbacks/8923.html</trackback:ping><description><![CDATA[
		<p>
				<font style="BACKGROUND-COLOR: yellow" color="red">定时</font>机制是指在程序运行当中间隔特定的时间引发指定的事件。在DOS下编程时，主要依靠时钟中断Int 8及其调用中断 Int 1cH来实现，应用程序通过修改这些系统中断来达到实现<font style="BACKGROUND-COLOR: yellow" color="red">定时</font>触发。而在Windows下，若想象在DOS下肆无忌惮的修改系统是不现实的，那么应当如何实现<font style="BACKGROUND-COLOR: yellow" color="red">定时</font>机制呢？下面在下就在学习当中的几点体会谈谈这个问题，提出几种方案供大家参考。</p>
		<p>第一种方案是大家熟悉的截获<font style="BACKGROUND-COLOR: yellow" color="red">定时</font>消息的途径。在Windows提供给我们使用的系统资源当中，有一种称为“<font style="BACKGROUND-COLOR: yellow" color="red">定时</font>器（Timer）”的特殊资源，在申请了这类资源的程序当中每间隔一段时间会接收到值为WM_TIMER的消息。需要<font style="BACKGROUND-COLOR: yellow" color="red">定时</font>执行的代码可以放在该消息的处理部分。如果在VC中，我们可以具体按照以下步骤实现这一目的：</p>
		<ol>
				<p>
				</p>
				<li>利用MFC AppWizard创建一个标准的工程，接受所有缺省选项。名为s1 
<p></p><p></p></li>
				<li>在Classview中选中“CMainFrame”类，然后按Ctrl+W激活ClassWizard，在“Message Map”选项卡中Class Name选“CMainFrame”，接着在“Message”中选“WM_TIMER”，最后按下“Add Funcation”。以上步骤加入了对WM_TIMER消息的映射处理。 
<p></p><p></p></li>
				<li>回到Classview中，双击“OnCreate”成员函数，在函数的末尾添加申请Timer的语句：<br />SetTimer(100,1000,NULL);//申请一个标识值为100的Timer，<font style="BACKGROUND-COLOR: yellow" color="red">定时</font>间隔为1000毫秒（1秒）。 
<p></p><p></p></li>
				<li>在“Classview”中双击OnTimer函数，输入要<font style="BACKGROUND-COLOR: yellow" color="red">定时</font>实现的代码。本例子中为：<br />MessageBeep(1000);;//每隔一秒发出通告声 
<p></p><p></p></li>
				<li>编译并执行之，我们可以每隔一秒就听到声音。这正是我们在OnTimer函数内要求执行的。 
<p></p></li>
		</ol>
		<p>实际当中，我们可以将“MessageBeep(1000);”换成任何我们想完成的任务，譬如<font style="BACKGROUND-COLOR: yellow" color="red">定时</font>存盘等。</p>
		<p>第二种方案也利用Timer资源，但却是采用已经编写好的代码&amp;#0;&amp;#0;我们可以加入一个具有<font style="BACKGROUND-COLOR: yellow" color="red">定时</font>功能的组件至当前工程当中。这种方法特别适用于基于对话框的工程。具体步骤如下：</p>
		<ol>
				<p>
				</p>
				<li>利用MFC AppWizard创建一个基于对话框的工程，其余接受所有缺省选项。名为s2。 
<p></p><p></p></li>
				<li>在ResourceView中，双击IDD_S2_DIALOG，显示对话框，将其中的“To do:”改为“<font style="BACKGROUND-COLOR: yellow" color="red">定时</font>触发演示的例子”，表明工程的作用。 
<p></p><p></p></li>
				<li>右击对话框编辑区，在弹出的右键菜单中选择“Insert ActiveX Control”，从弹出的列表框中选择“Timer Object”，确定后会在对话框内出现一个Timer对象。 
<p></p><p></p></li>
				<li>我们右击Timer对象，从弹出的菜单中选择“Properties”，接着选“All”选项卡，将其中的Interval值设为5000，即每隔5秒发生一次Timer事件。 
<p></p><p></p></li>
				<li>回到对话框编辑界面，双击Timer，产生一个CS2Dlg::OnTimerTimer1成员函数，接受缺省值，并在函数实现部分输入：<br />MessageBox("<font style="BACKGROUND-COLOR: yellow" color="red">定时</font>触发消息框","<font style="BACKGROUND-COLOR: yellow" color="red">定时</font>演示" ,MB_OK); 
<p></p><p></p></li>
				<li>编译并运行此工程，将会在产生的对话框运行期间，每隔5秒弹出一个消息框。 
<p></p></li>
		</ol>
		<p>同样，我们可以以任何自己的代码来替换5中的消息框语句。详细见附例s2。</p>
		<p>第三种方法是采用线程技术。众所周知，Windows 9X是一个基于多线程的多任务操作系统，在内核中以线程作为调度的基本单位，由系统分时间片进行调度。利用这一点，我们可以在程序当中创建一个“司职”计时的线程，通过线程间的同步来<font style="BACKGROUND-COLOR: yellow" color="red">定时</font>触发我们要完成的任务的代码。不象前两种方法需要至少有一个窗口作为接受消息的主窗口，采用线程技术实现<font style="BACKGROUND-COLOR: yellow" color="red">定时</font>触发将免去创建窗口的麻烦以及带来的系统各种资源的消耗。下面我们来举一个例子来说明这个问题：我们在CmyApp类的Initstance成员中不建立主窗口而是创建一个工作线程，该线程休眠一定的时间后，自动调用主线程的SomeThing函数。为了支持线程的运行，我们需要给CmyApp类增加相应的线程函数。下面，我们还是一步一步的实现：</p>
		<ol>
				<p>
				</p>
				<li>利用MFC AppWizard创建一个标准工程，其中为不产生多余的代码，不选文档/视图支持，并选择单文档。工程名为S3。 
<p></p><p></p></li>
				<li>在CS3App:: InitInstance()中用“/* … */”注释掉“return TRUE;”之前的所有代码。这是为了不建立窗口。并添加以下代码：<br />ExitFlag=TRUE;//是否结束主线程的循环的标志变量。因为子线程严重依赖主线程，所以在本例子中为了避免没有主窗口而提前结束应用程序，从而使子线程无法存在，所以给主线程一个循环，知道全局变量ExitFlag在子线程退出前被设置成FALSE为止.<br />StartThread();//启动线程<br />do{}while(ExitFlag);//直到结束子线程<br />::MessageBox(NULL,"主线程结束！","<font style="BACKGROUND-COLOR: yellow" color="red">定时</font>触发演示",MB_OK);<br />return TRUE; 
<p></p><p></p></li>
				<li>在Globals中增加一标志变量“ExitFlag”，类型为BOOL。它被主线程用来判断是否结束自身运行。 
<p></p><p></p></li>
				<li>通过ClassView在CS3App的Public部分声明以下函数:<br />void StartThread(void); //启动线程<br />static UINT ThreadFunction(void); //主要执行代码的函数<br />static UINT StaticThreadFunc(LPVOID lpparam);//设置线程时用到的函数<br />需要特别指出的是，用AfxBeginThread进行线程设置时，第一参数必须象本例所指出的那样声明为Static ，不然参数转换的错误会扰得你不得安宁。 
<p></p><p></p></li>
				<li>在StartThread中输入如下代码：<br />AfxBeginThread(StaticThreadFunc,this);//建立并启动线程 
<p></p><p></p></li>
				<li>在StaticThreadFunc中输入如下代码：<br />return ThreadFunc();//调用完成主要线程代码的函数，注意一定要是Static. 
<p></p><p></p></li>
				<li>实现ThreadFunction：<br />int i;<br />i=5;//触发5次<br />while(i--)<br />{<br />Sleep(5000);//间隔5秒<br />::MessageBox (NULL,"我被<font style="BACKGROUND-COLOR: yellow" color="red">定时</font>触发了！","<font style="BACKGROUND-COLOR: yellow" color="red">定时</font>触发演示",MB_OK);<br />}<br />ExitFlag=FALSE;//ExitFlag是一全局变量，通知主线程结束运行。<br />return 0; <br />} 
<p></p><p></p></li>
				<li>编译并运行工程，将看不到应用程序窗口，但可以看到每隔5秒，桌面上出现一个消息框，5次后弹出主线程结束的消息框。 
<p></p></li>
		</ol>
		<p>以上即本人在学习当中解决 Windows下实现<font style="BACKGROUND-COLOR: yellow" color="red">定时</font>触发而采取的一些办法，各自方法的特点也在介绍当中指出。希望所述能给大家一点帮助，更希望能得到大家的指正。如果您有什么意见和设想，欢迎发E-Mail给我（<a href="mailto:yangshanhe@21cn.com"><font color="#000080">yangshanhe@21cn.com</font></a>）。</p>
		<p> </p>
		<p>==</p>
		<p>很早之前2000年的拙作，集在一起，免得自己都不清楚干过什么。</p>
<img src ="http://www.cppblog.com/tx7do/aggbug/8923.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/tx7do/" target="_blank">杨粼波</a> 2006-06-23 21:48 <a href="http://www.cppblog.com/tx7do/articles/8923.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>INF文件格式说明</title><link>http://www.cppblog.com/tx7do/articles/8922.html</link><dc:creator>杨粼波</dc:creator><author>杨粼波</author><pubDate>Fri, 23 Jun 2006 13:48:00 GMT</pubDate><guid>http://www.cppblog.com/tx7do/articles/8922.html</guid><wfw:comment>http://www.cppblog.com/tx7do/comments/8922.html</wfw:comment><comments>http://www.cppblog.com/tx7do/articles/8922.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/tx7do/comments/commentRss/8922.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/tx7do/services/trackbacks/8922.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: INF				文件必须包含以下规则：														       								节（				Sections				）开始于由中括号				([])				扩起来的节名								必须包含版本信息节以表明自己属于				win95				还是				winnt4				格式。								值...&nbsp;&nbsp;<a href='http://www.cppblog.com/tx7do/articles/8922.html'>阅读全文</a><img src ="http://www.cppblog.com/tx7do/aggbug/8922.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/tx7do/" target="_blank">杨粼波</a> 2006-06-23 21:48 <a href="http://www.cppblog.com/tx7do/articles/8922.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何对webbrowser和IE编程（十一）</title><link>http://www.cppblog.com/tx7do/articles/8921.html</link><dc:creator>杨粼波</dc:creator><author>杨粼波</author><pubDate>Fri, 23 Jun 2006 13:46:00 GMT</pubDate><guid>http://www.cppblog.com/tx7do/articles/8921.html</guid><wfw:comment>http://www.cppblog.com/tx7do/comments/8921.html</wfw:comment><comments>http://www.cppblog.com/tx7do/articles/8921.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/tx7do/comments/commentRss/8921.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/tx7do/services/trackbacks/8921.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 仅仅用于Internet Explorer的事件														有些是仅仅可用于自动化 Internet Explorer,:												·         																												OnQuit																																					...&nbsp;&nbsp;<a href='http://www.cppblog.com/tx7do/articles/8921.html'>阅读全文</a><img src ="http://www.cppblog.com/tx7do/aggbug/8921.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/tx7do/" target="_blank">杨粼波</a> 2006-06-23 21:46 <a href="http://www.cppblog.com/tx7do/articles/8921.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何对webbrowser和IE编程（十）</title><link>http://www.cppblog.com/tx7do/articles/8920.html</link><dc:creator>杨粼波</dc:creator><author>杨粼波</author><pubDate>Fri, 23 Jun 2006 13:46:00 GMT</pubDate><guid>http://www.cppblog.com/tx7do/articles/8920.html</guid><wfw:comment>http://www.cppblog.com/tx7do/comments/8920.html</wfw:comment><comments>http://www.cppblog.com/tx7do/articles/8920.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/tx7do/comments/commentRss/8920.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/tx7do/services/trackbacks/8920.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 由Internet Explorer 5激发事件														如你所知， Internet Explorer像其他COM对象一样激发事件—通过连接点.但实际上Internet Explorer如何激发事件呢?每次 Internet Explorer需要向客户提供关于当前活动状态的信息, Internet Explorer 激发通过DWebBrowserEvents2 ...&nbsp;&nbsp;<a href='http://www.cppblog.com/tx7do/articles/8920.html'>阅读全文</a><img src ="http://www.cppblog.com/tx7do/aggbug/8920.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/tx7do/" target="_blank">杨粼波</a> 2006-06-23 21:46 <a href="http://www.cppblog.com/tx7do/articles/8920.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何对webbrowser和IE编程（九） </title><link>http://www.cppblog.com/tx7do/articles/8919.html</link><dc:creator>杨粼波</dc:creator><author>杨粼波</author><pubDate>Fri, 23 Jun 2006 13:45:00 GMT</pubDate><guid>http://www.cppblog.com/tx7do/articles/8919.html</guid><wfw:comment>http://www.cppblog.com/tx7do/comments/8919.html</wfw:comment><comments>http://www.cppblog.com/tx7do/articles/8919.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/tx7do/comments/commentRss/8919.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/tx7do/services/trackbacks/8919.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 接收事件的途径 依靠开发工具你创建客户应用程序,你可以接收事件通过不同的途径. 显然, 在Vb中接收事件同在VC中接收事件相比是如此不同和容易.在 C++ 应用中,你可以用不同的技术，通过使用 ATL, MFC, 或者标准C++. Visual Basic 中接收事件 Visual Basic是创建大多数类型应用的最轻松的工具, 所以我告诉你VB是处理事件最溶的工具时也不要惊奇. AT...&nbsp;&nbsp;<a href='http://www.cppblog.com/tx7do/articles/8919.html'>阅读全文</a><img src ="http://www.cppblog.com/tx7do/aggbug/8919.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/tx7do/" target="_blank">杨粼波</a> 2006-06-23 21:45 <a href="http://www.cppblog.com/tx7do/articles/8919.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> 如何对webbrowser和IE编程（八）</title><link>http://www.cppblog.com/tx7do/articles/8918.html</link><dc:creator>杨粼波</dc:creator><author>杨粼波</author><pubDate>Fri, 23 Jun 2006 13:44:00 GMT</pubDate><guid>http://www.cppblog.com/tx7do/articles/8918.html</guid><wfw:comment>http://www.cppblog.com/tx7do/comments/8918.html</wfw:comment><comments>http://www.cppblog.com/tx7do/articles/8918.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/tx7do/comments/commentRss/8918.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/tx7do/services/trackbacks/8918.html</trackback:ping><description><![CDATA[
		<h1 style="MARGIN: auto 0cm">
				<span lang="EN-US">
						<font face="宋体">Internet Explorer 事件</font>
				</span>
		</h1>
		<p>
				<span lang="EN-US">
						<font face="宋体">
								<font size="3">
										<p>
										</p>
								</font>
						</font>
				</span>
		</p>
		<p>
		</p>
		<p>
				<font face="宋体">
						<font size="3">
								<i>
										<span lang="EN-US">IWebBrowser2 </span>
								</i>的属性和方法给了你确切的控制导航和用户接口的途径，但是如果你不能够检测到浏览器正在处理什么以及何时处理什么，你还是没有全面的控制它<span lang="EN-US">.因此，WebBrowser控件和Internet Explorer暴露出事件，通过此你可以必要时监视活动以及处理某些活动. 举例来说，假设你建立一个intranet应用程序, 你想限制用户用户访问某些web页.利用Internet Explorer的时间处理句柄,你可以指令应用程序在用户试图访问受限的URL时候取消导航完成。</span></font>
				</font>
		</p>
		<p>
				<span lang="EN-US">
						<font face="宋体">
								<font size="3">
										<p>
										</p>
								</font>
						</font>
				</span>
		</p>
		<p>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 10.5pt; TEXT-INDENT: -10.5pt; mso-char-indent-count: -1.0; mso-char-indent-size: 10.5pt">
				<span lang="EN-US">
						<font size="3">
								<font face="Times New Roman">
										<p>
										</p>
								</font>
						</font>
				</span>
		</p>
		<p>
		</p>
		<h1 style="MARGIN: auto 0cm">
				<font face="宋体">事件 和 引出的接口</font>
		</h1>
		<p>
				<font size="3">
						<font face="宋体">无论何时一个<span lang="EN-US">COM 对象需要客户应用程序一个事件发生了, COM 对象发送一个叫做事件的消息. 发送消息的处理过程会激发一个事件. 但如果事件没有任何监听者会如何？ 事件每次都发生吗? 显然, 客户应用程序监听这些事件并控制COM对象.如果一个客户应用想接收来自COM 对象的事件,它"advises" 实际的COM 对象的.</span></font>
				</font>
		</p>
		<p>
				<font size="3">
						<font face="宋体">一个<span lang="EN-US">COM 对象为了通客户通信, 对象自身必须支持一个或者多个外引接口.一个 COM 对象支持的外引接口是作为可连接对象引用. 要成为一个可连接对象，COM对象必须实现<i>IConnectionPointContainer </i>接口。通过此接口，客户可认识到那些外引接口被服务器支持. 外引接口实际通过连接点由客户挂接入COM实现。实现外引接口的客户部分众所周知是通过事件接收槽（event sink）实现的.</span></font>
				</font>
		</p>
		<p>
				<font size="3">
						<font face="宋体">单一的连接点由服务器支持每一个外引接口<span lang="EN-US">.每一个连接点能够操纵一种类型的外引接口且至少支持<i>IConnectionPoint</i> 接口. 图7-1 描述了可连接的对象和它的客户之间的关系.</span></font>
				</font>
		</p>
		<p>
				<span lang="EN-US">
						<font size="3">
								<font face="宋体">
										<shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600">
												<stroke joinstyle="miter">
												</stroke>
												<formulas>
														<f eqn="if lineDrawn pixelLineWidth 0">
														</f>
														<f eqn="sum @0 1 0">
														</f>
														<f eqn="sum 0 0 @1">
														</f>
														<f eqn="prod @2 1 2">
														</f>
														<f eqn="prod @3 21600 pixelWidth">
														</f>
														<f eqn="prod @3 21600 pixelHeight">
														</f>
														<f eqn="sum @0 0 1">
														</f>
														<f eqn="prod @6 1 2">
														</f>
														<f eqn="prod @7 21600 pixelWidth">
														</f>
														<f eqn="sum @8 21600 0">
														</f>
														<f eqn="prod @7 21600 pixelHeight">
														</f>
														<f eqn="sum @10 21600 0">
														</f>
												</formulas>
												<path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f">
												</path>
												<lock aspectratio="t" v:ext="edit">
												</lock>
										</shapetype>
										<shape id="_x0000_i1025" style="WIDTH: 297pt; HEIGHT: 143.25pt" type="#_x0000_t75">
												<imagedata o:title="CH7-1_Events" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image001.jpg">
												</imagedata>
										</shape>
								</font>
						</font>
				</span>
		</p>
		<p>
				<font size="3">
						<font face="宋体">
								<b>
										<span lang="EN-US">Figure 7-1.</span>
								</b>
								<span lang="EN-US">
										<i>Connectable object and its client.</i>
								</span>
						</font>
				</font>
		</p>
		<p>
				<font size="3">
						<font face="宋体">每一个服务器必须实现<span lang="EN-US">2个接口以便实现客户可以接收事件—<i>IConnectionPointContainer</i> 和 <i>IConnectionPoint</i>. 我们将先看看这些接口之后将检视实现事件的不同途径.</span></font>
				</font>
		</p>
		<h2 style="MARGIN: auto 0cm">
				<i>
						<span lang="EN-US">
								<font face="宋体">IConnectionPointContainer</font>
						</span>
				</i>
		</h2>
		<p>
				<font face="宋体">
						<font size="3">每一个可连接对象实现了<i><span lang="EN-US">IConnectionPointContainer</span></i><span lang="EN-US">. 通过此接口, 试图接收事件的客户可找出关于可连接对象支持的不同的连接点. 通过调用<i>QueryInterface </i>using 客户可以获得服务器支持的任何接口的指针. (你可以使用任何接口指针调用<i>QueryInterface</i>, 因为全部 COM 接口继承自<i>IUnknown</i>.) 之后客户可以使用<i>IConnectionPointContainer</i> 接口的2个方法中的之一获取可连接点。 如表7-1, 获得可连接点</span></font>
				</font>
		</p>
		<p>
				<font face="宋体">
						<font size="3">
								<b>
										<span lang="EN-US">Table 7-1</span>
								</b>
								<span lang="EN-US">
										<i>Methods of the</i> IConnectionPointContainer<i> Interface</i></span>
						</font>
				</font>
		</p>
		<table style="WIDTH: 95%; mso-cellspacing: 1.5pt; mso-padding-alt: 3.75pt 3.75pt 3.75pt 3.75pt" cellpadding="0" width="95%" border="0">
				<tbody>
						<tr>
								<td style="BORDER-RIGHT: #d4d0c8; PADDING-RIGHT: 3.75pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 3.75pt; PADDING-BOTTOM: 3.75pt; BORDER-LEFT: #d4d0c8; PADDING-TOP: 3.75pt; BORDER-BOTTOM: #d4d0c8; BACKGROUND-COLOR: transparent">
										<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align="center">
												<font size="3">
														<b>
																<i>
																		<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方法</span>
																</i>
														</b>
														<b>
																<span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体">
																		<p>
																		</p>
																</span>
														</b>
												</font>
										</p>
										<p>
										</p>
								</td>
								<td style="BORDER-RIGHT: #d4d0c8; PADDING-RIGHT: 3.75pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 3.75pt; PADDING-BOTTOM: 3.75pt; BORDER-LEFT: #d4d0c8; PADDING-TOP: 3.75pt; BORDER-BOTTOM: #d4d0c8; BACKGROUND-COLOR: transparent">
										<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align="center">
												<font size="3">
														<b>
																<i>
																		<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">描述</span>
																</i>
														</b>
														<b>
																<span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体">
																		<p>
																		</p>
																</span>
														</b>
												</font>
										</p>
										<p>
										</p>
								</td>
						</tr>
						<tr>
								<td style="BORDER-RIGHT: #d4d0c8; PADDING-RIGHT: 3.75pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 3.75pt; PADDING-BOTTOM: 3.75pt; BORDER-LEFT: #d4d0c8; PADDING-TOP: 3.75pt; BORDER-BOTTOM: #d4d0c8; BACKGROUND-COLOR: transparent" valign="top">
										<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
												<font face="Times New Roman">
														<font size="3">
																<i>
																		<span lang="EN-US">EnumConnectionPoints</span>
																</i>
																<span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体">
																		<p>
																		</p>
																</span>
														</font>
												</font>
										</p>
										<p>
										</p>
								</td>
								<td style="BORDER-RIGHT: #d4d0c8; PADDING-RIGHT: 3.75pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 3.75pt; PADDING-BOTTOM: 3.75pt; BORDER-LEFT: #d4d0c8; PADDING-TOP: 3.75pt; BORDER-BOTTOM: #d4d0c8; BACKGROUND-COLOR: transparent" valign="top">
										<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
												<font size="3">
														<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">列举可连接对象支持的全部可连接对象</span>
														<span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体">
																<p>
																</p>
														</span>
												</font>
										</p>
										<p>
										</p>
								</td>
						</tr>
						<tr>
								<td style="BORDER-RIGHT: #d4d0c8; PADDING-RIGHT: 3.75pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 3.75pt; PADDING-BOTTOM: 3.75pt; BORDER-LEFT: #d4d0c8; PADDING-TOP: 3.75pt; BORDER-BOTTOM: #d4d0c8; BACKGROUND-COLOR: transparent" valign="top">
										<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
												<font face="Times New Roman">
														<font size="3">
																<i>
																		<span lang="EN-US">FindConnectionPoint</span>
																</i>
																<span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体">
																		<p>
																		</p>
																</span>
														</font>
												</font>
										</p>
										<p>
										</p>
								</td>
								<td style="BORDER-RIGHT: #d4d0c8; PADDING-RIGHT: 3.75pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 3.75pt; PADDING-BOTTOM: 3.75pt; BORDER-LEFT: #d4d0c8; PADDING-TOP: 3.75pt; BORDER-BOTTOM: #d4d0c8; BACKGROUND-COLOR: transparent" valign="top">
										<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
												<font size="3">
														<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">让客户查询可连接对象关于它是否支持一个特殊接口。客户指定特殊的接口（可连接点）的接口标示</span>
														<span lang="EN-US">
																<font face="Times New Roman"> (IID) </font>
														</span>
														<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。如果可连接对象支持此接口，返回</span>
														<font face="Times New Roman">
																<i>
																		<span lang="EN-US">IConnectionPoint</span>
																</i>
																<span lang="EN-US">
																</span>
														</font>
														<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">接口的指针。</span>
														<span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体">
																<p>
																</p>
														</span>
												</font>
										</p>
										<p>
										</p>
								</td>
						</tr>
				</tbody>
		</table>
		<h2 style="MARGIN: auto 0cm">
				<i>
						<span lang="EN-US">
								<font face="宋体">IConnectionPoint</font>
						</span>
				</i>
		</h2>
		<p>
				<font face="宋体">
						<font size="3">一旦客户知道哪个连接点可被连接对象服务器支持<span lang="EN-US">, 客户就可建立同可连接对象的连接。客户通知可连接对象将要在全部事件中接收那些事件.当客户不再需要接收来自可连接对象的事件,客户解除对对象的通知. 表7-2 展示了 <i>IConnectionPoint</i> 接口可被客户连接的. (大多数时候,你将连接到仅仅表中头两个)</span></font>
				</font>
		</p>
		<p>
				<font face="宋体">
						<font size="3">
								<b>
										<span lang="EN-US">Table 7-2</span>
								</b>
								<span lang="EN-US">
										<i>Methods of the </i>IConnectionPoint<i> Interface</i></span>
						</font>
				</font>
		</p>
		<table style="WIDTH: 95%; mso-cellspacing: 1.5pt; mso-padding-alt: 3.75pt 3.75pt 3.75pt 3.75pt" cellpadding="0" width="95%" border="0">
				<tbody>
						<tr>
								<td style="BORDER-RIGHT: #d4d0c8; PADDING-RIGHT: 3.75pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 3.75pt; PADDING-BOTTOM: 3.75pt; BORDER-LEFT: #d4d0c8; PADDING-TOP: 3.75pt; BORDER-BOTTOM: #d4d0c8; BACKGROUND-COLOR: transparent">
										<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align="center">
												<font size="3">
														<b>
																<i>
																		<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方法</span>
																</i>
														</b>
														<b>
																<span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体">
																		<p>
																		</p>
																</span>
														</b>
												</font>
										</p>
										<p>
										</p>
								</td>
								<td style="BORDER-RIGHT: #d4d0c8; PADDING-RIGHT: 3.75pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 3.75pt; PADDING-BOTTOM: 3.75pt; BORDER-LEFT: #d4d0c8; PADDING-TOP: 3.75pt; BORDER-BOTTOM: #d4d0c8; BACKGROUND-COLOR: transparent">
										<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align="center">
												<font size="3">
														<b>
																<i>
																		<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">描述</span>
																</i>
														</b>
														<b>
																<span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体">
																		<p>
																		</p>
																</span>
														</b>
												</font>
										</p>
										<p>
										</p>
								</td>
						</tr>
						<tr>
								<td style="BORDER-RIGHT: #d4d0c8; PADDING-RIGHT: 3.75pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 3.75pt; PADDING-BOTTOM: 3.75pt; BORDER-LEFT: #d4d0c8; PADDING-TOP: 3.75pt; BORDER-BOTTOM: #d4d0c8; BACKGROUND-COLOR: transparent" valign="top">
										<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
												<font face="Times New Roman">
														<font size="3">
																<i>
																		<span lang="EN-US">Advise </span>
																</i>
																<span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体">
																		<p>
																		</p>
																</span>
														</font>
												</font>
										</p>
										<p>
										</p>
								</td>
								<td style="BORDER-RIGHT: #d4d0c8; PADDING-RIGHT: 3.75pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 3.75pt; PADDING-BOTTOM: 3.75pt; BORDER-LEFT: #d4d0c8; PADDING-TOP: 3.75pt; BORDER-BOTTOM: #d4d0c8; BACKGROUND-COLOR: transparent" valign="top">
										<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
												<font size="3">
														<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在客户和可连接对象的某一个可连接点间建立连接。</span>
														<font face="Times New Roman">
														</font>
														<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">客户必须传递它的事件接收槽的</span>
														<font face="Times New Roman">
																<i>
																		<span lang="EN-US">IUnknown</span>
																</i>
																<span lang="EN-US">
																</span>
														</font>
														<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">接口。</span>
														<font face="Times New Roman">
														</font>
														<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">事件接收槽必须实现</span>
														<font face="Times New Roman">
																<i>
																		<span lang="EN-US">IDispatch</span>
																</i>
																<span lang="EN-US">
																</span>
														</font>
														<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">接口以接收事件。</span>
														<font face="Times New Roman">
														</font>
														<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">典型地</span>
														<span lang="EN-US">
																<font face="Times New Roman">,</font>
														</span>
														<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">党课连接对象激发事件，可连接对象将调用</span>
														<font face="Times New Roman">
																<i>
																		<span lang="EN-US">IDispatch</span>
																</i>
																<span lang="EN-US">
																</span>
														</font>
														<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">接口的</span>
														<i>
																<span lang="EN-US">
																		<font face="Times New Roman">Invoke </font>
																</span>
														</i>
														<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方法。</span>
														<font face="Times New Roman">
																<i>
																		<span lang="EN-US">Advise</span>
																</i>
																<span lang="EN-US">
																</span>
														</font>
														<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方法返回一个</span>
														<span lang="EN-US">
																<font face="Times New Roman"> cookie </font>
														</span>
														<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，当客户中断连接时候，调用</span>
														<i>
																<span lang="EN-US">
																		<font face="Times New Roman">Unadvise</font>
																</span>
														</i>
														<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方法时候需要携带此</span>
														<font face="Times New Roman">
																<span lang="EN-US">cookie</span>
																<span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体">
																		<p>
																		</p>
																</span>
														</font>
												</font>
										</p>
										<p>
										</p>
								</td>
						</tr>
						<tr>
								<td style="BORDER-RIGHT: #d4d0c8; PADDING-RIGHT: 3.75pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 3.75pt; PADDING-BOTTOM: 3.75pt; BORDER-LEFT: #d4d0c8; PADDING-TOP: 3.75pt; BORDER-BOTTOM: #d4d0c8; BACKGROUND-COLOR: transparent" valign="top">
										<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
												<font face="Times New Roman">
														<font size="3">
																<i>
																		<span lang="EN-US">Unadvise </span>
																</i>
																<span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体">
																		<p>
																		</p>
																</span>
														</font>
												</font>
										</p>
										<p>
										</p>
								</td>
								<td style="BORDER-RIGHT: #d4d0c8; PADDING-RIGHT: 3.75pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 3.75pt; PADDING-BOTTOM: 3.75pt; BORDER-LEFT: #d4d0c8; PADDING-TOP: 3.75pt; BORDER-BOTTOM: #d4d0c8; BACKGROUND-COLOR: transparent" valign="top">
										<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
												<font size="3">
														<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中断连接</span>
														<font face="Times New Roman">
																<span lang="EN-US">.</span>
																<span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体">
																		<p>
																		</p>
																</span>
														</font>
												</font>
										</p>
										<p>
										</p>
								</td>
						</tr>
						<tr>
								<td style="BORDER-RIGHT: #d4d0c8; PADDING-RIGHT: 3.75pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 3.75pt; PADDING-BOTTOM: 3.75pt; BORDER-LEFT: #d4d0c8; PADDING-TOP: 3.75pt; BORDER-BOTTOM: #d4d0c8; BACKGROUND-COLOR: transparent" valign="top">
										<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
												<font face="Times New Roman">
														<font size="3">
																<i>
																		<span lang="EN-US">GetConnectionInterface</span>
																</i>
																<span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体">
																		<p>
																		</p>
																</span>
														</font>
												</font>
										</p>
										<p>
										</p>
								</td>
								<td style="BORDER-RIGHT: #d4d0c8; PADDING-RIGHT: 3.75pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 3.75pt; PADDING-BOTTOM: 3.75pt; BORDER-LEFT: #d4d0c8; PADDING-TOP: 3.75pt; BORDER-BOTTOM: #d4d0c8; BACKGROUND-COLOR: transparent" valign="top">
										<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
												<font size="3">
														<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">返回由连接点管理的外发接口的</span>
														<span lang="EN-US">
																<font face="Times New Roman">IID . <i>GetConnectionInterface </i></font>
														</span>
														<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方法让客户将</span>
														<i>
																<span lang="EN-US">
																		<font face="Times New Roman">IConnectionPoint</font>
																</span>
														</i>
														<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">翻译为一个</span>
														<font face="Times New Roman">
																<span lang="EN-US">IID.</span>
																<span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体">
																		<p>
																		</p>
																</span>
														</font>
												</font>
										</p>
										<p>
										</p>
								</td>
						</tr>
						<tr>
								<td style="BORDER-RIGHT: #d4d0c8; PADDING-RIGHT: 3.75pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 3.75pt; PADDING-BOTTOM: 3.75pt; BORDER-LEFT: #d4d0c8; PADDING-TOP: 3.75pt; BORDER-BOTTOM: #d4d0c8; BACKGROUND-COLOR: transparent" valign="top">
										<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
												<font face="Times New Roman">
														<font size="3">
																<i>
																		<span lang="EN-US">GetConnectionPointContainer </span>
																</i>
																<span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体">
																		<p>
																		</p>
																</span>
														</font>
												</font>
										</p>
										<p>
										</p>
								</td>
								<td style="BORDER-RIGHT: #d4d0c8; PADDING-RIGHT: 3.75pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 3.75pt; PADDING-BOTTOM: 3.75pt; BORDER-LEFT: #d4d0c8; PADDING-TOP: 3.75pt; BORDER-BOTTOM: #d4d0c8; BACKGROUND-COLOR: transparent" valign="top">
										<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
												<font size="3">
														<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">得到刻连接对象的</span>
														<font face="Times New Roman">
																<i>
																		<span lang="EN-US">IConnectionPointContainer</span>
																</i>
																<span lang="EN-US">
																</span>
														</font>
														<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">接口</span>
														<span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体">
																<p>
																</p>
														</span>
												</font>
										</p>
										<p>
										</p>
								</td>
						</tr>
						<tr>
								<td style="BORDER-RIGHT: #d4d0c8; PADDING-RIGHT: 3.75pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 3.75pt; PADDING-BOTTOM: 3.75pt; BORDER-LEFT: #d4d0c8; PADDING-TOP: 3.75pt; BORDER-BOTTOM: #d4d0c8; BACKGROUND-COLOR: transparent" valign="top">
										<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
												<font face="Times New Roman">
														<font size="3">
																<i>
																		<span lang="EN-US">EnumConnections </span>
																</i>
																<span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体">
																		<p>
																		</p>
																</span>
														</font>
												</font>
										</p>
										<p>
										</p>
								</td>
								<td style="BORDER-RIGHT: #d4d0c8; PADDING-RIGHT: 3.75pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 3.75pt; PADDING-BOTTOM: 3.75pt; BORDER-LEFT: #d4d0c8; PADDING-TOP: 3.75pt; BORDER-BOTTOM: #d4d0c8; BACKGROUND-COLOR: transparent" valign="top">
										<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
												<font size="3">
														<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">枚举刻连接对象的当前可连接点</span>
														<font face="Times New Roman">
																<span lang="EN-US">.</span>
																<span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体">
																		<p>
																		</p>
																</span>
														</font>
												</font>
										</p>
										<p>
										</p>
								</td>
						</tr>
				</tbody>
		</table>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 10.5pt; TEXT-INDENT: -10.5pt; mso-char-indent-count: -1.0; mso-char-indent-size: 10.5pt">
				<span lang="EN-US">
						<font size="3">
								<font face="Times New Roman">
										<p>
										</p>
								</font>
						</font>
				</span>
		</p>
		<p>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 10.5pt; TEXT-INDENT: -10.5pt; mso-char-indent-count: -1.0; mso-char-indent-size: 10.5pt">
				<span lang="EN-US">
						<font size="3">
								<font face="Times New Roman">
										<p>
										</p>
								</font>
						</font>
				</span>
		</p>
		<p>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 10.5pt; TEXT-INDENT: -10.5pt; mso-char-indent-count: -1.0; mso-char-indent-size: 10.5pt">
				<span lang="EN-US">
						<font size="3">
								<font face="Times New Roman">
										<p>
										</p>
								</font>
						</font>
				</span>
		</p>
		<p>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 10.5pt; TEXT-INDENT: -10.5pt; mso-char-indent-count: -1.0; mso-char-indent-size: 10.5pt">
				<span lang="EN-US">
						<font size="3">
								<font face="Times New Roman">
										<p>
										</p>
								</font>
						</font>
				</span>
		</p>
		<p>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 10.5pt; TEXT-INDENT: -10.5pt; mso-char-indent-count: -1.0; mso-char-indent-size: 10.5pt">
				<span lang="EN-US">
						<font size="3">
								<font face="Times New Roman">
										<p>
										</p>
								</font>
						</font>
				</span>
		</p>
		<p>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 10.5pt; TEXT-INDENT: -10.5pt; mso-char-indent-count: -1.0; mso-char-indent-size: 10.5pt">
				<span lang="EN-US">
						<font size="3">
								<font face="Times New Roman">
										<p>
										</p>
								</font>
						</font>
				</span>
		</p>
		<p>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 10.5pt; TEXT-INDENT: -10.5pt; mso-char-indent-count: -1.0; mso-char-indent-size: 10.5pt">
				<span lang="EN-US">
						<font size="3">
								<font face="Times New Roman">
										<p>
										</p>
								</font>
						</font>
				</span>
		</p>
		<p>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 10.5pt; TEXT-INDENT: -10.5pt; mso-char-indent-count: -1.0; mso-char-indent-size: 10.5pt">
				<span lang="EN-US">
						<font size="3">
								<font face="Times New Roman">
										<p>
										</p>
								</font>
						</font>
				</span>
		</p>
		<p>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 10.5pt; TEXT-INDENT: -10.5pt; mso-char-indent-count: -1.0; mso-char-indent-size: 10.5pt">
				<span lang="EN-US">
						<font size="3">
								<font face="Times New Roman">
										<p>
										</p>
								</font>
						</font>
				</span>
		</p>
		<p>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 10.5pt; TEXT-INDENT: -10.5pt; mso-char-indent-count: -1.0; mso-char-indent-size: 10.5pt">
				<span lang="EN-US">
						<font size="3">
								<font face="Times New Roman">
										<p>
										</p>
								</font>
						</font>
				</span>
		</p>
		<p>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 10.5pt; TEXT-INDENT: -10.5pt; mso-char-indent-count: -1.0; mso-char-indent-size: 10.5pt">
				<span lang="EN-US">
						<font size="3">
								<font face="Times New Roman">
										<p>
										</p>
								</font>
						</font>
				</span>
		</p>
		<p>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 10.5pt; TEXT-INDENT: -10.5pt; mso-char-indent-count: -1.0; mso-char-indent-size: 10.5pt">
				<span lang="EN-US">
						<font size="3">
								<font face="Times New Roman">
										<p>
										</p>
								</font>
						</font>
				</span>
		</p>
		<p>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 10.5pt; TEXT-INDENT: -10.5pt; mso-char-indent-count: -1.0; mso-char-indent-size: 10.5pt">
				<span lang="EN-US">
						<font size="3">
								<font face="Times New Roman">
										<p>
										</p>
								</font>
						</font>
				</span>
		</p>
		<p>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 10.5pt; TEXT-INDENT: -10.5pt; mso-char-indent-count: -1.0; mso-char-indent-size: 10.5pt">
				<span lang="EN-US">
						<font size="3">
								<font face="Times New Roman">
										<p>
										</p>
								</font>
						</font>
				</span>
		</p>
		<p>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 10.5pt; TEXT-INDENT: -10.5pt; mso-char-indent-count: -1.0; mso-char-indent-size: 10.5pt">
				<span lang="EN-US">
						<font size="3">
								<font face="Times New Roman">
										<p>
										</p>
								</font>
						</font>
				</span>
		</p>
		<p>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 10.5pt; TEXT-INDENT: -10.5pt; mso-char-indent-count: -1.0; mso-char-indent-size: 10.5pt">
				<span lang="EN-US">
						<font size="3">
								<font face="Times New Roman">
										<p>
										</p>
								</font>
						</font>
				</span>
		</p>
		<p>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 10.5pt; TEXT-INDENT: -10.5pt; mso-char-indent-count: -1.0; mso-char-indent-size: 10.5pt">
				<span lang="EN-US">
						<font size="3">
								<font face="Times New Roman">
										<p>
										</p>
								</font>
						</font>
				</span>
		</p>
		<p>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 10.5pt; TEXT-INDENT: -10.5pt; mso-char-indent-count: -1.0; mso-char-indent-size: 10.5pt">
				<span lang="EN-US">
						<font size="3">
								<font face="Times New Roman">
										<p>
										</p>
								</font>
						</font>
				</span>
		</p>
		<p>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 10.5pt; TEXT-INDENT: -10.5pt; mso-char-indent-count: -1.0; mso-char-indent-size: 10.5pt">
				<span lang="EN-US">
						<font size="3">
								<font face="Times New Roman">
										<p>
										</p>
								</font>
						</font>
				</span>
		</p>
		<p>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 10.5pt; TEXT-INDENT: -10.5pt; mso-char-indent-count: -1.0; mso-char-indent-size: 10.5pt">
				<span lang="EN-US">
						<font size="3">
								<font face="Times New Roman">
										<p>
										</p>
								</font>
						</font>
				</span>
		</p>
		<p>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 10.5pt; TEXT-INDENT: -10.5pt; mso-char-indent-count: -1.0; mso-char-indent-size: 10.5pt">
				<span lang="EN-US">
						<font size="3">
								<font face="Times New Roman">
										<p>
										</p>
								</font>
						</font>
				</span>
		</p>
		<p>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 10.5pt; TEXT-INDENT: -10.5pt; mso-char-indent-count: -1.0; mso-char-indent-size: 10.5pt">
				<span lang="EN-US">
						<font size="3">
								<font face="Times New Roman">
										<p>
										</p>
								</font>
						</font>
				</span>
		</p>
		<p>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 10.5pt; TEXT-INDENT: -10.5pt; mso-char-indent-count: -1.0; mso-char-indent-size: 10.5pt">
				<span lang="EN-US">
						<font size="3">
								<font face="Times New Roman">
										<p>
										</p>
								</font>
						</font>
				</span>
		</p>
		<p>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 10.5pt; TEXT-INDENT: -10.5pt; mso-char-indent-count: -1.0; mso-char-indent-size: 10.5pt">
				<span lang="EN-US">
						<font size="3">
								<font face="Times New Roman">
										<p>
										</p>
								</font>
						</font>
				</span>
		</p>
		<p>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 10.5pt; TEXT-INDENT: -10.5pt; mso-char-indent-count: -1.0; mso-char-indent-size: 10.5pt">
				<span lang="EN-US">
						<font size="3">
								<font face="Times New Roman">
										<p>
										</p>
								</font>
						</font>
				</span>
		</p>
		<p>
		</p>
		<h1 style="MARGIN: auto 0cm">
				<font face="宋体">接收事件的途径</font>
		</h1>
		<p>
				<font size="3">
						<font face="宋体">依靠开发工具你创建客户应用程序<span lang="EN-US">,你可以接收事件通过不同的途径. 显然, 在Vb中接收事件同在VC中接收事件相比是如此不同和容易.在 C++ 应用中,你可以用不同的技术，通过使用 ATL, MFC, 或者标准C++.</span></font>
				</font>
		</p>
		<h2 style="MARGIN: auto 0cm">
				<span lang="EN-US">
						<font face="宋体">Visual Basic 中接收事件 </font>
				</span>
		</h2>
		<p>
				<span lang="EN-US">
						<font face="宋体" size="3">Visual Basic是创建大多数类型应用的最轻松的工具, 所以我告诉你VB是处理事件最溶的工具时也不要惊奇. ATL 和 Visual Basic 示例我们同样的工作,但是ATL花费了我4个小时, 而 Visual Basic 例子仅仅只花20 分钟.别说我错了—我是ATL, 和 MFC， C++的忠实信徒,<span style="mso-spacerun: yes">  </span>尤其是你建立一个接口的时候.但是 Visual Basic当建立客户应用程序从类似IE这样的服务器接收事件时是伟大的工具.</font>
				</span>
		</p>
		<p>
				<span lang="EN-US">
						<font face="宋体" size="3">OK,如何从Visual Basic 应用程序中接收事件？当宿主WebBrowser 控件,你不必做任何特别的事. Visual Basic 在form上为WebBrowser 控件接收事件.你所需要做的全部事情就是未你要接收的任何事件创建一个事件处理句柄.</font>
				</span>
		</p>
		<p>
				<font size="3">
						<font face="宋体">你象创建其他事件句柄一样创建句柄<span lang="EN-US"> (例如<i>Form_Load</i> event). 从Procedure下拉列表框中选择你象控制的句柄, 在事件句柄中,加入任何你型在事件激发时执行的任何代码.</span></font>
				</font>
		</p>
		<p>
				<font size="3">
						<font face="宋体">当自动化服务器时候接收事件<span lang="EN-US">, 例如在VB应用中的Internet Explorer,过程直截了当.首先设置对服务器的类型库的引用, 你可以访问Project/References 菜单.之后，采用<i>WithEvents</i> 关键字声明服务器对象的变量.举例, 如果你自动化Internet Explorer, 你将声明变量如下:</span></font>
				</font>
		</p>
		<table style="WIDTH: 95%; mso-cellspacing: 1.5pt; mso-padding-alt: 3.75pt 3.75pt 3.75pt 3.75pt" cellpadding="0" width="95%" border="0">
				<tbody>
						<tr>
								<td style="BORDER-RIGHT: #d4d0c8; PADDING-RIGHT: 3.75pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 3.75pt; PADDING-BOTTOM: 3.75pt; BORDER-LEFT: #d4d0c8; PADDING-TOP: 3.75pt; BORDER-BOTTOM: #d4d0c8; BACKGROUND-COLOR: transparent">
										<pre>
												<span lang="EN-US">
														<font face="黑体" size="2">Dim WithEvents InternetExplorer1 As InternetExplorer</font>
												</span>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<p>
				<font size="3">
						<font face="宋体">下一步，采用<span lang="EN-US">new或者其他 关键字创建实例变量 ，如下：:</span></font>
				</font>
		</p>
		<table style="WIDTH: 95%; mso-cellspacing: 1.5pt; mso-padding-alt: 3.75pt 3.75pt 3.75pt 3.75pt" cellpadding="0" width="95%" border="0">
				<tbody>
						<tr>
								<td style="BORDER-RIGHT: #d4d0c8; PADDING-RIGHT: 3.75pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 3.75pt; PADDING-BOTTOM: 3.75pt; BORDER-LEFT: #d4d0c8; PADDING-TOP: 3.75pt; BORDER-BOTTOM: #d4d0c8; BACKGROUND-COLOR: transparent">
										<pre>
												<span lang="EN-US">
														<font face="黑体" size="2">Set InternetExplorer1 = CreateObject("InternetExplorer.Application.1")</font>
												</span>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<p>
				<font size="3">
						<font face="宋体">或者<span lang="EN-US">:</span></font>
				</font>
		</p>
		<table style="WIDTH: 95%; mso-cellspacing: 1.5pt; mso-padding-alt: 3.75pt 3.75pt 3.75pt 3.75pt" cellpadding="0" width="95%" border="0">
				<tbody>
						<tr>
								<td style="BORDER-RIGHT: #d4d0c8; PADDING-RIGHT: 3.75pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 3.75pt; PADDING-BOTTOM: 3.75pt; BORDER-LEFT: #d4d0c8; PADDING-TOP: 3.75pt; BORDER-BOTTOM: #d4d0c8; BACKGROUND-COLOR: transparent">
										<pre>
												<span lang="EN-US">
														<font face="黑体" size="2">Set InternetExplorer1 = New InternetExplorer</font>
												</span>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<p>
				<font size="3">
						<font face="宋体">当你采用以上途径生成实例接收事件<span lang="EN-US">, Visual Basic 自动为你初始化和管理事件接收.你不必担心连接点问题，VB为你处理它们.</span></font>
				</font>
		</p>
		<p>
				<font size="3">
						<font face="宋体">在你输入建立服务器的代码之后<span lang="EN-US">,你插入符合服务器事件的方法调用. <span style="mso-spacerun: yes"> </span><span style="mso-spacerun: yes"> </span>举例来说, 如果你想控制由IE激活的<i>DownloadBegin</i> event, 你应当声明类似如下的方法声明:</span></font>
				</font>
		</p>
		<table style="WIDTH: 95%; mso-cellspacing: 1.5pt; mso-padding-alt: 3.75pt 3.75pt 3.75pt 3.75pt" cellpadding="0" width="95%" border="0">
				<tbody>
						<tr>
								<td style="BORDER-RIGHT: #d4d0c8; PADDING-RIGHT: 3.75pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 3.75pt; PADDING-BOTTOM: 3.75pt; BORDER-LEFT: #d4d0c8; PADDING-TOP: 3.75pt; BORDER-BOTTOM: #d4d0c8; BACKGROUND-COLOR: transparent">
										<pre>
												<span lang="EN-US">
														<font face="黑体" size="2">Private Sub InternetExplorer1_DownloadBegin()</font>
												</span>
										</pre>
										<pre>
												<span lang="EN-US">
														<font size="2">
																<font face="黑体">
																		<span style="mso-spacerun: yes">   </span>' Insert your best Visual Basic code here.</font>
														</font>
												</span>
										</pre>
										<pre>
												<span lang="EN-US">
														<font face="黑体" size="2">End Sub</font>
												</span>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<p>
				<font size="3">
						<font face="宋体">当你不再想接收来自服务器的事件，简单设置变量为<i><span lang="EN-US">Nothing</span></i><span lang="EN-US">:</span></font>
				</font>
		</p>
		<table style="WIDTH: 95%; mso-cellspacing: 1.5pt; mso-padding-alt: 3.75pt 3.75pt 3.75pt 3.75pt" cellpadding="0" width="95%" border="0">
				<tbody>
						<tr>
								<td style="BORDER-RIGHT: #d4d0c8; PADDING-RIGHT: 3.75pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 3.75pt; PADDING-BOTTOM: 3.75pt; BORDER-LEFT: #d4d0c8; PADDING-TOP: 3.75pt; BORDER-BOTTOM: #d4d0c8; BACKGROUND-COLOR: transparent">
										<pre>
												<span lang="EN-US">
														<font face="黑体" size="2">Set InternetExplorer1 = Nothing</font>
												</span>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.cppblog.com/tx7do/aggbug/8918.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/tx7do/" target="_blank">杨粼波</a> 2006-06-23 21:44 <a href="http://www.cppblog.com/tx7do/articles/8918.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何对webbrowser和IE编程（七）</title><link>http://www.cppblog.com/tx7do/articles/8917.html</link><dc:creator>杨粼波</dc:creator><author>杨粼波</author><pubDate>Fri, 23 Jun 2006 13:43:00 GMT</pubDate><guid>http://www.cppblog.com/tx7do/articles/8917.html</guid><wfw:comment>http://www.cppblog.com/tx7do/comments/8917.html</wfw:comment><comments>http://www.cppblog.com/tx7do/articles/8917.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/tx7do/comments/commentRss/8917.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/tx7do/services/trackbacks/8917.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 加入高级功能														本节将展示如何加入高级功能到你的应用程序或者ActiveX控件.将展示如何从一个ActiveX控件中访问Internet Explorer的 IWebBrowser2，以及如何从一个Web页面的frame中获得WebBrowser 对象。将会展示实现一些并非容易实现的功能.本节有一定难度.所有代码采用C++ 和COM实现,你应当有一定坚实的基...&nbsp;&nbsp;<a href='http://www.cppblog.com/tx7do/articles/8917.html'>阅读全文</a><img src ="http://www.cppblog.com/tx7do/aggbug/8917.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/tx7do/" target="_blank">杨粼波</a> 2006-06-23 21:43 <a href="http://www.cppblog.com/tx7do/articles/8917.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何对webbrowser和IE编程（六）</title><link>http://www.cppblog.com/tx7do/articles/8916.html</link><dc:creator>杨粼波</dc:creator><author>杨粼波</author><pubDate>Fri, 23 Jun 2006 13:42:00 GMT</pubDate><guid>http://www.cppblog.com/tx7do/articles/8916.html</guid><wfw:comment>http://www.cppblog.com/tx7do/comments/8916.html</wfw:comment><comments>http://www.cppblog.com/tx7do/articles/8916.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/tx7do/comments/commentRss/8916.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/tx7do/services/trackbacks/8916.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 使用VC++和COM API														尽管使用VC不像Vb中那么容易自动化IE，但是也不太难，尤其是你理解了CON和COM API。无论你使用MFC, ATL, 或者标准 C++自动化IE，方法都是一样—你使用COM API来实现.																		VC++中创建一个Internet Explorer实例包括要调用COM AP...&nbsp;&nbsp;<a href='http://www.cppblog.com/tx7do/articles/8916.html'>阅读全文</a><img src ="http://www.cppblog.com/tx7do/aggbug/8916.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/tx7do/" target="_blank">杨粼波</a> 2006-06-23 21:42 <a href="http://www.cppblog.com/tx7do/articles/8916.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何对webbrowser和IE编程（五） </title><link>http://www.cppblog.com/tx7do/articles/8915.html</link><dc:creator>杨粼波</dc:creator><author>杨粼波</author><pubDate>Fri, 23 Jun 2006 13:42:00 GMT</pubDate><guid>http://www.cppblog.com/tx7do/articles/8915.html</guid><wfw:comment>http://www.cppblog.com/tx7do/comments/8915.html</wfw:comment><comments>http://www.cppblog.com/tx7do/articles/8915.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/tx7do/comments/commentRss/8915.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/tx7do/services/trackbacks/8915.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 自动化 Internet Explorer														自动化打开了开发基于web应用的世界。 它允许你使用VB或者VC定制成熟的应用。自动化的好处：通过属性和方法可以改变IE的外观；你可以提供诸如导航条等用户接口以便控制用户的导航。																		自动化IE很容易。你建立一个简单的应用启动一个IE实例，然后使用控制webbro...&nbsp;&nbsp;<a href='http://www.cppblog.com/tx7do/articles/8915.html'>阅读全文</a><img src ="http://www.cppblog.com/tx7do/aggbug/8915.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/tx7do/" target="_blank">杨粼波</a> 2006-06-23 21:42 <a href="http://www.cppblog.com/tx7do/articles/8915.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何对webbrowser和IE编程（四） </title><link>http://www.cppblog.com/tx7do/articles/8914.html</link><dc:creator>杨粼波</dc:creator><author>杨粼波</author><pubDate>Fri, 23 Jun 2006 13:42:00 GMT</pubDate><guid>http://www.cppblog.com/tx7do/articles/8914.html</guid><wfw:comment>http://www.cppblog.com/tx7do/comments/8914.html</wfw:comment><comments>http://www.cppblog.com/tx7do/articles/8914.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/tx7do/comments/commentRss/8914.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/tx7do/services/trackbacks/8914.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 寄宿WebBrowser 控件														我们现在开始在VB和VC中创建一些程序来寄宿（Host）WebBrowser控件。在你完成本部分的样本，你将对如何创建寄宿一个WebBrowser控件的应用程序又一个基本的了解。当你看到如此容易的加入Web浏览功能加入到你的应用程序，我相信你会立即开始实践的。												使用VB				...&nbsp;&nbsp;<a href='http://www.cppblog.com/tx7do/articles/8914.html'>阅读全文</a><img src ="http://www.cppblog.com/tx7do/aggbug/8914.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/tx7do/" target="_blank">杨粼波</a> 2006-06-23 21:42 <a href="http://www.cppblog.com/tx7do/articles/8914.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何对webbrowser和IE编程（三） </title><link>http://www.cppblog.com/tx7do/articles/8913.html</link><dc:creator>杨粼波</dc:creator><author>杨粼波</author><pubDate>Fri, 23 Jun 2006 13:41:00 GMT</pubDate><guid>http://www.cppblog.com/tx7do/articles/8913.html</guid><wfw:comment>http://www.cppblog.com/tx7do/comments/8913.html</wfw:comment><comments>http://www.cppblog.com/tx7do/articles/8913.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/tx7do/comments/commentRss/8913.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/tx7do/services/trackbacks/8913.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: IWebBrowserApp																																										IWebBrowserApp																 接口仅仅在IE中实现。 典型的,你使用InternetExplorer 对象创建一个IE的实例. 然后你使用 IWebBrowserApp 接口操纵此实例. (今天采用IWebBrows...&nbsp;&nbsp;<a href='http://www.cppblog.com/tx7do/articles/8913.html'>阅读全文</a><img src ="http://www.cppblog.com/tx7do/aggbug/8913.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/tx7do/" target="_blank">杨粼波</a> 2006-06-23 21:41 <a href="http://www.cppblog.com/tx7do/articles/8913.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何对webbrowser和IE编程（二） </title><link>http://www.cppblog.com/tx7do/articles/8912.html</link><dc:creator>杨粼波</dc:creator><author>杨粼波</author><pubDate>Fri, 23 Jun 2006 13:40:00 GMT</pubDate><guid>http://www.cppblog.com/tx7do/articles/8912.html</guid><wfw:comment>http://www.cppblog.com/tx7do/comments/8912.html</wfw:comment><comments>http://www.cppblog.com/tx7do/articles/8912.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/tx7do/comments/commentRss/8912.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/tx7do/services/trackbacks/8912.html</trackback:ping><description><![CDATA[<p>
				<font size="3">
						<font face="宋体">调用 <em><span lang="EN-US">Navigate </span></em>方法比<em><span lang="EN-US">GoBack</span></em><span lang="EN-US"> 以及 <em>GoForward<span style="mso-spacerun: yes">&nbsp; </span></em>要困难,但如果你正仅仅导航到URL 且并不传递任何附加参数, 它的调用很容易。 举例来说, VB中导航到 Microsoft 主页, 可如下:</span></font>
				</font>
		</p>
		<font class="Apple-style-span" face="monospace" size="3"><span class="Apple-style-span" style="line-height: normal; white-space: pre;"><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">WebBrowser1.Navigate&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">http://www.microsoft.com</span><span style="color: #000000; ">"</span></div></span></font>
		<p>
				<span lang="EN-US">
						<font face="宋体" size="3">VB代码调用<em>Navigate </em>如此容易因为所有参数出第一个参数外都可以是可选. 如此相对照，VC++不可以省略任何参数. 如果你想使用VC++不是勇任何特别的参数导航到 Microsoft的 home page, 你必须传递空的<em>VARIANT </em>结构。 MFC 应用程序,你必须如下调用 <em>Navigate</em></font>
				</span>
		</p>
		<font class="Apple-style-span" size="3"><span class="Apple-style-span" style="line-height: normal;"><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">COleVariant&nbsp;vtEmpty;<br /><br />m_webBrowser.Navigate(_T(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">http://www.microsoft.com</span><span style="color: #000000; ">"</span><span style="color: #000000; ">),&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">vtEmpty,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">vtEmpty,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">vtEmpty,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">vtEmpty);</span></div></span></font>
		<p>
				<font face="宋体">
						<font size="3">该例子展示了在<span lang="EN-US">MFC应用程序中控制WebBrowser控件. 我传递一个普通的字符串而替代 <em>BSTR </em>因为 MFC 提供了一个 WebBrowser 控件的包装类,第一个载包装类中是<em>LPCTSTR</em>, 一个普通的字符串. 其他参数为指向 <em>VARIANT </em>结构的指针。 如果你不想指定任何特别的参数, 别仅仅传递 <em>NULL</em> &#8212;那样做, 你的应用程序会招来崩溃。你必须传递一个空的<em>VARIANT </em>结构的指针. 前面的代码使用了 <em>COleVariant </em>类, 那是一个与 <em>CComVariant </em>类相似的类<a href="http://writeblog.csdn.net/fckeditor/editor/ch05a.htm"></a>。 <em>COleVariant</em> 简单包装了 <em>VARIANT </em>使得<em>VARIANT </em>结构易于使用.</span></font>
				</font>
		</p>
		<p>
				<font face="宋体">
						<font size="3">
								<strong>属性</strong> 现在你看到了所有的 <em><span lang="EN-US">IwebBrowser </span></em>的方法，你大概向了解其属性。<span lang="EN-US">(我是不是太苛求了?)<span style="mso-spacerun: yes">&nbsp; </span><em>IWebBrowser</em> 接口有30个属性，描述于表6-2. 我一已按照<em>IWebBrowser</em><span style="mso-spacerun: yes">&nbsp; </span>的Vtable中的字母序列出。</span></font>
				</font>
		</p>
		<p>
				<font face="宋体">
						<font size="3">
								<strong>
										<span lang="EN-US">Table 6-2.</span>
								</strong>
								<span lang="EN-US"> IWebBrowser <em>属性按照vtable排序</em></span>
						</font>
				</font>
		</p>
		<table style="width: 95%; mso-cellspacing: 1.5pt; mso-padding-alt: 3.75pt 3.75pt 3.75pt 3.75pt" cellpadding="0" width="95%" border="0">
				<tbody>
						<tr>
								<td style="border-right: #d4d0c8; padding-right: 3.75pt; border-top: #d4d0c8; padding-left: 3.75pt; padding-bottom: 3.75pt; border-left: #d4d0c8; padding-top: 3.75pt; border-bottom: #d4d0c8; background-color: transparent">
										<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: center" align="center">
												<font size="3">
														<strong>
																<em>
																		<span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">属性</span>
																</em>
														</strong>
														<strong>
																<span lang="EN-US" style="font-size: 12pt; font-family: 宋体">
																		</span></strong></font></p><p><font size="3"><strong>
																		</strong></font></p><font size="3"><strong>
																
														</strong>
												</font>
										<p>&nbsp;</p>
										<p>
										</p>
								</td>
								<td style="border-right: #d4d0c8; padding-right: 3.75pt; border-top: #d4d0c8; padding-left: 3.75pt; padding-bottom: 3.75pt; border-left: #d4d0c8; padding-top: 3.75pt; border-bottom: #d4d0c8; background-color: transparent">
										<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: center" align="center">
												<font size="3">
														<strong>
																<em>
																		<span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">描述</span>
																</em>
														</strong>
														<strong>
																<span lang="EN-US" style="font-size: 12pt; font-family: 宋体">
																		</span></strong></font></p><p><font size="3"><strong>
																		</strong></font></p><font size="3"><strong>
																
														</strong>
												</font>
										<p>&nbsp;</p>
										<p>
										</p>
								</td>
						</tr>
						<tr>
								<td style="border-right: #d4d0c8; padding-right: 3.75pt; border-top: #d4d0c8; padding-left: 3.75pt; padding-bottom: 3.75pt; border-left: #d4d0c8; padding-top: 3.75pt; border-bottom: #d4d0c8; background-color: transparent" valign="top">
										<p class="MsoNormal" style="margin: 0cm 0cm 0pt">
												<font face="Times New Roman">
														<font size="3">
																<em>
																		<span lang="EN-US">Application</span>
																</em>
																<span lang="EN-US" style="font-size: 12pt; font-family: 宋体">
																		</span></font></font></p><p><font face="Times New Roman"><font size="3">
																		</font></font></p><font face="Times New Roman"><font size="3">
																
														</font>
												</font>
										<p>&nbsp;</p>
										<p>
										</p>
								</td>
								<td style="border-right: #d4d0c8; padding-right: 3.75pt; border-top: #d4d0c8; padding-left: 3.75pt; padding-bottom: 3.75pt; border-left: #d4d0c8; padding-top: 3.75pt; border-bottom: #d4d0c8; background-color: transparent" valign="top">
										<p class="MsoNormal" style="margin: 0cm 0cm 0pt">
												<font size="3">
														<span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">返回宿主</span>
														<span lang="EN-US">
																<font face="Times New Roman">WebBrowser </font>
														</span>
														<span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">控件的自动化对象</span>
														<span lang="EN-US">
																<font face="Times New Roman"> (<em>IDispatch</em>) </font>
														</span>
														<span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">实现，如果对象不可用，则返回的</span>
														<span lang="EN-US">
																<font face="Times New Roman">WebbOrwser</font>
														</span>
														<span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">控件的自动化对象</span>
														<span lang="EN-US" style="font-size: 12pt; font-family: 宋体">
																</span></font></p><p><font size="3">
																</font></p><font size="3">
														
												</font>
										<p>&nbsp;</p>
										<p>
										</p>
								</td>
						</tr>
						<tr>
								<td style="border-right: #d4d0c8; padding-right: 3.75pt; border-top: #d4d0c8; padding-left: 3.75pt; padding-bottom: 3.75pt; border-left: #d4d0c8; padding-top: 3.75pt; border-bottom: #d4d0c8; background-color: transparent" valign="top">
										<p class="MsoNormal" style="margin: 0cm 0cm 0pt">
												<font face="Times New Roman">
														<font size="3">
																<em>
																		<span lang="EN-US">Parent</span>
																</em>
																<span lang="EN-US" style="font-size: 12pt; font-family: 宋体">
																		</span></font></font></p><p><font face="Times New Roman"><font size="3">
																		</font></font></p><font face="Times New Roman"><font size="3">
																
														</font>
												</font>
										<p>&nbsp;</p>
										<p>
										</p>
								</td>
								<td style="border-right: #d4d0c8; padding-right: 3.75pt; border-top: #d4d0c8; padding-left: 3.75pt; padding-bottom: 3.75pt; border-left: #d4d0c8; padding-top: 3.75pt; border-bottom: #d4d0c8; background-color: transparent" valign="top">
										<p class="MsoNormal" style="margin: 0cm 0cm 0pt">
												<font size="3">
														<span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">返回</span>
														<span lang="EN-US">
																<font face="Times New Roman">WebBrowser</font>
														</span>
														<span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">控件的父控件的自动化实现</span>
														<span lang="EN-US">
																<font face="Times New Roman"> (<em>IDispatch</em>) </font>
														</span>
														<span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，通常是容器</span>
														<span lang="EN-US">
																<font face="Times New Roman">&#8212;</font>
														</span>
														<span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">举例来讲</span>
														<span lang="EN-US">
																<font face="Times New Roman">,</font>
														</span>
														<span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，您的宿主或者</span>
														<span lang="EN-US">
																<font face="Times New Roman">Internet Explorer </font>
														</span>
														<span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">窗口。</span>
														<span lang="EN-US" style="font-size: 12pt; font-family: 宋体">
																</span></font></p><p><font size="3">
																</font></p><font size="3">
														
												</font>
										<p>&nbsp;</p>
										<p>
										</p>
								</td>
						</tr>
						<tr>
								<td style="border-right: #d4d0c8; padding-right: 3.75pt; border-top: #d4d0c8; padding-left: 3.75pt; padding-bottom: 3.75pt; border-left: #d4d0c8; padding-top: 3.75pt; border-bottom: #d4d0c8; background-color: transparent" valign="top">
										<p class="MsoNormal" style="margin: 0cm 0cm 0pt">
												<font face="Times New Roman">
														<font size="3">
																<em>
																		<span lang="EN-US">Container</span>
																</em>
																<span lang="EN-US" style="font-size: 12pt; font-family: 宋体">
																		</span></font></font></p><p><font face="Times New Roman"><font size="3">
																		</font></font></p><font face="Times New Roman"><font size="3">
																
														</font>
												</font>
										<p>&nbsp;</p>
										<p>
										</p>
								</td>
								<td style="border-right: #d4d0c8; padding-right: 3.75pt; border-top: #d4d0c8; padding-left: 3.75pt; padding-bottom: 3.75pt; border-left: #d4d0c8; padding-top: 3.75pt; border-bottom: #d4d0c8; background-color: transparent" valign="top">
										<p class="MsoNormal" style="margin: 0cm 0cm 0pt">
												<font size="3">
														<span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">返回</span>
														<span lang="EN-US">
																<font face="Times New Roman">WebBrowser</font>
														</span>
														<span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">控件容器的自动化对象</span>
														<span lang="EN-US">
																<font face="Times New Roman"> (<em>IDispatch</em>) </font>
														</span>
														<span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。通常，该值返回同</span>
														<font face="Times New Roman">
																<em>
																		<span lang="EN-US">Parent</span>
																</em>
																<span lang="EN-US">
																</span>
														</font>
														<span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">属性一样的值。</span>
														<font face="Times New Roman">
																<span lang="EN-US">.</span>
																<span lang="EN-US" style="font-size: 12pt; font-family: 宋体">
																		</span></font></font></p><p><font size="3"><font face="Times New Roman">
																		</font></font></p><font size="3"><font face="Times New Roman">
																
														</font>
												</font>
										<p>&nbsp;</p>
										<p>
										</p>
								</td>
						</tr>
						<tr>
								<td style="border-right: #d4d0c8; padding-right: 3.75pt; border-top: #d4d0c8; padding-left: 3.75pt; padding-bottom: 3.75pt; border-left: #d4d0c8; padding-top: 3.75pt; border-bottom: #d4d0c8; background-color: transparent" valign="top">
										<p class="MsoNormal" style="margin: 0cm 0cm 0pt">
												<font face="Times New Roman">
														<font size="3">
																<em>
																		<span lang="EN-US">Document</span>
																</em>
																<span lang="EN-US" style="font-size: 12pt; font-family: 宋体">
																		</span></font></font></p><p><font face="Times New Roman"><font size="3">
																		</font></font></p><font face="Times New Roman"><font size="3">
																
														</font>
												</font>
										<p>&nbsp;</p>
										<p>
										</p>
								</td>
								<td style="border-right: #d4d0c8; padding-right: 3.75pt; border-top: #d4d0c8; padding-left: 3.75pt; padding-bottom: 3.75pt; border-left: #d4d0c8; padding-top: 3.75pt; border-bottom: #d4d0c8; background-color: transparent" valign="top">
										<p class="MsoNormal" style="margin: 0cm 0cm 0pt">
												<font size="3">
														<span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">返回活动文档的自动化实现</span>
														<span lang="EN-US">
																<font face="Times New Roman"> (<em>IDispatch</em>) </font>
														</span>
														<span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。如果</span>
														<span lang="EN-US">
																<font face="Times New Roman"> HTML </font>
														</span>
														<span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">当前显示在</span>
														<span lang="EN-US">
																<font face="Times New Roman">WebBrowser</font>
														</span>
														<span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，</span>
														<font face="Times New Roman">
																<em>
																		<span lang="EN-US">Document</span>
																</em>
																<span lang="EN-US">
																</span>
														</font>
														<span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">属性给出你存取</span>
														<span lang="EN-US">
																<font face="Times New Roman"> DHTML </font>
														</span>
														<span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对象模型的途径</span>
														<font face="Times New Roman">
																<span lang="EN-US">.</span>
																<span lang="EN-US" style="font-size: 12pt; font-family: 宋体">
																		</span></font></font></p><p><font size="3"><font face="Times New Roman">
																		</font></font></p><font size="3"><font face="Times New Roman">
																
														</font>
												</font>
										<p>&nbsp;</p>
										<p>
										</p>
								</td>
						</tr>
						<tr>
								<td style="border-right: #d4d0c8; padding-right: 3.75pt; border-top: #d4d0c8; padding-left: 3.75pt; padding-bottom: 3.75pt; border-left: #d4d0c8; padding-top: 3.75pt; border-bottom: #d4d0c8; background-color: transparent" valign="top">
										<p class="MsoNormal" style="margin: 0cm 0cm 0pt">
												<font face="Times New Roman">
														<font size="3">
																<em>
																		<span lang="EN-US">TopLevelContainer</span>
																</em>
																<span lang="EN-US" style="font-size: 12pt; font-family: 宋体">
																		</span></font></font></p><p><font face="Times New Roman"><font size="3">
																		</font></font></p><font face="Times New Roman"><font size="3">
																
														</font>
												</font>
										<p>&nbsp;</p>
										<p>
										</p>
								</td>
								<td style="border-right: #d4d0c8; padding-right: 3.75pt; border-top: #d4d0c8; padding-left: 3.75pt; padding-bottom: 3.75pt; border-left: #d4d0c8; padding-top: 3.75pt; border-bottom: #d4d0c8; background-color: transparent" valign="top">
										<p class="MsoNormal" style="margin: 0cm 0cm 0pt">
												<font size="3">
														<span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">返回一个布尔值指示</span>
														<span lang="EN-US">
																<font face="Times New Roman">IE</font>
														</span>
														<span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是否是</span>
														<span lang="EN-US">
																<font face="Times New Roman">WebBRowser</font>
														</span>
														<span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">控件的顶级容器。在</span>
														<span lang="EN-US">
																<font face="Times New Roman"> words</font>
														</span>
														<span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中，如果</span>
														<span lang="EN-US">
																<font face="Times New Roman">IE</font>
														</span>
														<span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是宿主应用承需则返回</span>
														<font face="Times New Roman">
																<em>
																		<span lang="EN-US">true </span>
																</em>
																<span lang="EN-US" style="font-size: 12pt; font-family: 宋体">
																		</span></font></font></p><p><font size="3"><font face="Times New Roman">
																		</font></font></p><font size="3"><font face="Times New Roman">
																
														</font>
												</font>
										<p>&nbsp;</p>
										<p>
										</p>
								</td>
						</tr>
						<tr>
								<td style="border-right: #d4d0c8; padding-right: 3.75pt; border-top: #d4d0c8; padding-left: 3.75pt; padding-bottom: 3.75pt; border-left: #d4d0c8; padding-top: 3.75pt; border-bottom: #d4d0c8; background-color: transparent" valign="top">
										<p class="MsoNormal" style="margin: 0cm 0cm 0pt">
												<font face="Times New Roman">
														<font size="3">
																<em>
																		<span lang="EN-US">Type</span>
																</em>
																<span lang="EN-US" style="font-size: 12pt; font-family: 宋体">
																		</span></font></font></p><p><font face="Times New Roman"><font size="3">
																		</font></font></p><font face="Times New Roman"><font size="3">
																
														</font>
												</font>
										<p>&nbsp;</p>
										<p>
										</p>
								</td>
								<td style="border-right: #d4d0c8; padding-right: 3.75pt; border-top: #d4d0c8; padding-left: 3.75pt; padding-bottom: 3.75pt; border-left: #d4d0c8; padding-top: 3.75pt; border-bottom: #d4d0c8; background-color: transparent" valign="top">
										<p class="MsoNormal" style="margin: 0cm 0cm 0pt">
												<font size="3">
														<span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">返回已经在</span>
														<span lang="EN-US">
																<font face="Times New Roman">WebBrowser</font>
														</span>
														<span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中装载的对象的类型。举例，如果</span>
														<span lang="EN-US">
																<font face="Times New Roman">HTML document</font>
														</span>
														<span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">被装载</span>
														<span lang="EN-US">
																<font face="Times New Roman">, <em>Type </em></font>
														</span>
														<span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">将返回</span>
														<font face="Times New Roman">
																<em>
																		<span lang="EN-US">Microsoft HTML Document 5.0</span>
																</em>
																<span lang="EN-US">. </span>
														</font>
														<span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">如果文档是</span>
														<span lang="EN-US">
																<font face="Times New Roman">Word </font>
														</span>
														<span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">文档</span>
														<span lang="EN-US">
																<font face="Times New Roman">, <em>Type </em></font>
														</span>
														<span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">返回</span>
														<font face="Times New Roman">
																<em>
																		<span lang="EN-US">Microsoft Word Document</span>
																</em>
																<span lang="EN-US">.</span>
																<span lang="EN-US" style="font-size: 12pt; font-family: 宋体">
																		</span></font></font></p><p><font size="3"><font face="Times New Roman">
																		</font></font></p><font size="3"><font face="Times New Roman">
																
														</font>
												</font>
										<p>&nbsp;</p>
										<p>
										</p>
								</td>
						</tr>
						<tr>
								<td style="border-right: #d4d0c8; padding-right: 3.75pt; border-top: #d4d0c8; padding-left: 3.75pt; padding-bottom: 3.75pt; border-left: #d4d0c8; padding-top: 3.75pt; border-bottom: #d4d0c8; background-color: transparent" valign="top">
										<p class="MsoNormal" style="margin: 0cm 0cm 0pt">
												<font face="Times New Roman">
														<font size="3">
																<em>
																		<span lang="EN-US">Left</span>
																</em>
																<span lang="EN-US" style="font-size: 12pt; font-family: 宋体">
																		</span></font></font></p><p><font face="Times New Roman"><font size="3">
																		</font></font></p><font face="Times New Roman"><font size="3">
																
														</font>
												</font>
										<p>&nbsp;</p>
										<p>
										</p>
								</td>
								<td style="border-right: #d4d0c8; padding-right: 3.75pt; border-top: #d4d0c8; padding-left: 3.75pt; padding-bottom: 3.75pt; border-left: #d4d0c8; padding-top: 3.75pt; border-bottom: #d4d0c8; background-color: transparent" valign="top">
										<p class="MsoNormal" style="margin: 0cm 0cm 0pt">
												<font size="3">
														<span lang="EN-US">
																<font face="Times New Roman">.</font>
														</span>
														<span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">返回或设置控件在容器窗口左边距</span>
														<span lang="EN-US" style="font-size: 12pt; font-family: 宋体">
																</span></font></p><p><font size="3">
																</font></p><font size="3">
														
												</font>
										<p>&nbsp;</p>
										<p>
										</p>
								</td>
						</tr>
						<tr>
								<td style="border-right: #d4d0c8; padding-right: 3.75pt; border-top: #d4d0c8; padding-left: 3.75pt; padding-bottom: 3.75pt; border-left: #d4d0c8; padding-top: 3.75pt; border-bottom: #d4d0c8; background-color: transparent" valign="top">
										<p class="MsoNormal" style="margin: 0cm 0cm 0pt">
												<font face="Times New Roman">
														<font size="3">
																<em>
																		<span lang="EN-US">Top</span>
																</em>
																<span lang="EN-US" style="font-size: 12pt; font-family: 宋体">
																		</span></font></font></p><p><font face="Times New Roman"><font size="3">
																		</font></font></p><font face="Times New Roman"><font size="3">
																
														</font>
												</font>
										<p>&nbsp;</p>
										<p>
										</p>
								</td>
								<td style="border-right: #d4d0c8; padding-right: 3.75pt; border-top: #d4d0c8; padding-left: 3.75pt; padding-bottom: 3.75pt; border-left: #d4d0c8; padding-top: 3.75pt; border-bottom: #d4d0c8; background-color: transparent" valign="top">
										<p class="MsoNormal" style="margin: 0cm 0cm 0pt">
												<font size="3">
														<span lang="EN-US">
																<font face="Times New Roman">.</font>
														</span>
														<span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">返回或设置控件在容器窗口顶部边距</span>
														<span lang="EN-US" style="font-size: 12pt; font-family: 宋体">
																</span></font></p><p><font size="3">
																</font></p><font size="3">
														
												</font>
										<p>&nbsp;</p>
										<p>
										</p>
								</td>
						</tr>
						<tr>
								<td style="border-right: #d4d0c8; padding-right: 3.75pt; border-top: #d4d0c8; padding-left: 3.75pt; padding-bottom: 3.75pt; border-left: #d4d0c8; padding-top: 3.75pt; border-bottom: #d4d0c8; background-color: transparent" valign="top">
										<p class="MsoNormal" style="margin: 0cm 0cm 0pt">
												<font face="Times New Roman">
														<font size="3">
																<em>
																		<span lang="EN-US">Width</span>
																</em>
																<span lang="EN-US" style="font-size: 12pt; font-family: 宋体">
																		</span></font></font></p><p><font face="Times New Roman"><font size="3">
																		</font></font></p><font face="Times New Roman"><font size="3">
																
														</font>
												</font>
										<p>&nbsp;</p>
										<p>
										</p>
								</td>
								<td style="border-right: #d4d0c8; padding-right: 3.75pt; border-top: #d4d0c8; padding-left: 3.75pt; padding-bottom: 3.75pt; border-left: #d4d0c8; padding-top: 3.75pt; border-bottom: #d4d0c8; background-color: transparent" valign="top">
										<p class="MsoNormal" style="margin: 0cm 0cm 0pt">
												<font size="3">
														<span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">返回或设置</span>
														<span lang="EN-US">
																<font face="Times New Roman">webbrowser</font>
														</span>
														<span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">控件在窗口中的水平方向的向苏为单位宽度</span>
														<span lang="EN-US" style="font-size: 12pt; font-family: 宋体">
																</span></font></p><p><font size="3">
																</font></p><font size="3">
														
												</font>
										<p>&nbsp;</p>
										<p>
										</p>
								</td>
						</tr>
						<tr>
								<td style="border-right: #d4d0c8; padding-right: 3.75pt; border-top: #d4d0c8; padding-left: 3.75pt; padding-bottom: 3.75pt; border-left: #d4d0c8; padding-top: 3.75pt; border-bottom: #d4d0c8; background-color: transparent" valign="top">
										<p class="MsoNormal" style="margin: 0cm 0cm 0pt">
												<font face="Times New Roman">
														<font size="3">
																<em>
																		<span lang="EN-US">Height</span>
																</em>
																<span lang="EN-US" style="font-size: 12pt; font-family: 宋体">
																		</span></font></font></p><p><font face="Times New Roman"><font size="3">
																		</font></font></p><font face="Times New Roman"><font size="3">
																
														</font>
												</font>
										<p>&nbsp;</p>
										<p>
										</p>
								</td>
								<td style="border-right: #d4d0c8; padding-right: 3.75pt; border-top: #d4d0c8; padding-left: 3.75pt; padding-bottom: 3.75pt; border-left: #d4d0c8; padding-top: 3.75pt; border-bottom: #d4d0c8; background-color: transparent" valign="top">
										<p class="MsoNormal" style="margin: 0cm 0cm 0pt">
												<font size="3">
														<span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">返回或设置</span>
														<span lang="EN-US">
																<font face="Times New Roman">webbrowser</font>
														</span>
														<span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">控件在窗口中的处置方向的向像素为单位高度</span>
														<span lang="EN-US" style="font-size: 12pt; font-family: 宋体">
																</span></font></p><p><font size="3">
																</font></p><font size="3">
														
												</font>
										<p>&nbsp;</p>
										<p>
										</p>
								</td>
						</tr>
						<tr>
								<td style="border-right: #d4d0c8; padding-right: 3.75pt; border-top: #d4d0c8; padding-left: 3.75pt; padding-bottom: 3.75pt; border-left: #d4d0c8; padding-top: 3.75pt; border-bottom: #d4d0c8; background-color: transparent" valign="top">
										<p class="MsoNormal" style="margin: 0cm 0cm 0pt">
												<font face="Times New Roman">
														<font size="3">
																<em>
																		<span lang="EN-US">LocationName</span>
																</em>
																<span lang="EN-US" style="font-size: 12pt; font-family: 宋体">
																		</span></font></font></p><p><font face="Times New Roman"><font size="3">
																		</font></font></p><font face="Times New Roman"><font size="3">
																
														</font>
												</font>
										<p>&nbsp;</p>
										<p>
										</p>
								</td>
								<td style="border-right: #d4d0c8; padding-right: 3.75pt; border-top: #d4d0c8; padding-left: 3.75pt; padding-bottom: 3.75pt; border-left: #d4d0c8; padding-top: 3.75pt; border-bottom: #d4d0c8; background-color: transparent" valign="top">
										<p class="MsoNormal" style="margin: 0cm 0cm 0pt">
												<font size="3">
														<span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">返回一个</span>
														<span lang="EN-US">
																<font face="Times New Roman">WebBrowser</font>
														</span>
														<span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">当前显示的资源名称的字符串</span>
														<span lang="EN-US">
																<font face="Times New Roman"> (</font>
														</span>
														<span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">换句话讲</span>
														<span lang="EN-US">
																<font face="Times New Roman">, HTML </font>
														</span>
														<span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">页</span>
														<span lang="EN-US">
																<font face="Times New Roman">, Word </font>
														</span>
														<span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">文档</span>
														<span lang="EN-US">
																<font face="Times New Roman">,</font>
														</span>
														<span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，</span>
														<span lang="EN-US">
																<font face="Times New Roman">folder, </font>
														</span>
														<span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">诸如此类</span>
														<span lang="EN-US">
																<font face="Times New Roman">) </font>
														</span>
														<span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</span>
														<font face="Times New Roman">
														</font>
														<span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">如果资源是</span>
														<span lang="EN-US">
																<font face="Times New Roman"> HTML </font>
														</span>
														<span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">页，字符串是标题。如果资源是文件或者文件夹，字符串为文件名或者文件夹名。</span>
														<span lang="EN-US">
																<font face="Times New Roman">&#8212;</font>
														</span>
														<span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">举例</span>
														<span lang="EN-US">
																<font face="Times New Roman">, foo.doc </font>
														</span>
														<span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">（</span>
														<span lang="EN-US">
																<font face="Times New Roman">Word</font>
														</span>
														<span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">文档）或者</span>
														<span lang="EN-US">
																<font face="Times New Roman">
																		<span style="mso-spacerun: yes">&nbsp; </span>Temp </font>
														</span>
														<span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">（</span>
														<span lang="EN-US">
																<font face="Times New Roman">temp directory.</font>
														</span>
														<span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）</span>
														<span lang="EN-US" style="font-size: 12pt; font-family: 宋体">
																</span></font></p><p><font size="3">
																</font></p><font size="3">
														
												</font>
										<p>&nbsp;</p>
										<p>
										</p>
								</td>
						</tr>
						<tr>
								<td style="border-right: #d4d0c8; padding-right: 3.75pt; border-top: #d4d0c8; padding-left: 3.75pt; padding-bottom: 3.75pt; border-left: #d4d0c8; padding-top: 3.75pt; border-bottom: #d4d0c8; background-color: transparent" valign="top">
										<p class="MsoNormal" style="margin: 0cm 0cm 0pt">
												<font face="Times New Roman">
														<font size="3">
																<em>
																		<span lang="EN-US">LocationURL</span>
																</em>
																<span lang="EN-US" style="font-size: 12pt; font-family: 宋体">
																		</span></font></font></p><p><font face="Times New Roman"><font size="3">
																		</font></font></p><font face="Times New Roman"><font size="3">
																
														</font>
												</font>
										<p>&nbsp;</p>
										<p>
										</p>
								</td>
								<td style="border-right: #d4d0c8; padding-right: 3.75pt; border-top: #d4d0c8; padding-left: 3.75pt; padding-bottom: 3.75pt; border-left: #d4d0c8; padding-top: 3.75pt; border-bottom: #d4d0c8; background-color: transparent" valign="top">
										<p class="MsoNormal" style="margin: 0cm 0cm 0pt">
												<font size="3">
														<span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">返回</span>
														<span lang="EN-US">
																<font face="Times New Roman">WebBrowser</font>
														</span>
														<span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">正在显示的资源的</span>
														<font face="Times New Roman">
																<span lang="EN-US">URL</span>
																<span lang="EN-US" style="font-size: 12pt; font-family: 宋体">
																		</span></font></font></p><p><font size="3"><font face="Times New Roman">
																		</font></font></p><font size="3"><font face="Times New Roman">
																
														</font>
												</font>
										<p>&nbsp;</p>
										<p>
										</p>
								</td>
						</tr>
						<tr>
								<td style="border-right: #d4d0c8; padding-right: 3.75pt; border-top: #d4d0c8; padding-left: 3.75pt; padding-bottom: 3.75pt; border-left: #d4d0c8; padding-top: 3.75pt; border-bottom: #d4d0c8; background-color: transparent" valign="top">
										<p class="MsoNormal" style="margin: 0cm 0cm 0pt">
												<font face="Times New Roman">
														<font size="3">
																<em>
																		<span lang="EN-US">Busy</span>
																</em>
																<span lang="EN-US" style="font-size: 12pt; font-family: 宋体">
																		</span></font></font></p><p><font face="Times New Roman"><font size="3">
																		</font></font></p><font face="Times New Roman"><font size="3">
																
														</font>
												</font>
										<p>&nbsp;</p>
										<p>
										</p>
								</td>
								<td style="border-right: #d4d0c8; padding-right: 3.75pt; border-top: #d4d0c8; padding-left: 3.75pt; padding-bottom: 3.75pt; border-left: #d4d0c8; padding-top: 3.75pt; border-bottom: #d4d0c8; background-color: transparent" valign="top">
										<p class="MsoNormal" style="margin: 0cm 0cm 0pt">
												<font size="3">
														<span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">返回一个布尔值指示</span>
														<span lang="EN-US">
																<font face="Times New Roman">WebBrowser </font>
														</span>
														<span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">当前是否正在装入</span>
														<span lang="EN-US">
																<font face="Times New Roman"> URL.</font>
														</span>
														<span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。如果当前属性返回</span>
														<font face="Times New Roman">
																<em>
																		<span lang="EN-US">true</span>
																</em>
																<span lang="EN-US">,<em></em></span>
														</font>
														<span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">你可以使用</span>
														<font face="Times New Roman">
																<em>
																		<span lang="EN-US">Stop</span>
																</em>
																<span lang="EN-US">
																</span>
														</font>
														<span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方法取消代掉导航。</span>
														<span lang="EN-US" style="font-size: 12pt; font-family: 宋体">
																</span></font></p><p><font size="3">
																</font></p><font size="3">
														
												</font>
										<p>&nbsp;</p>
										<p>
										</p>
								</td>
						</tr>
				</tbody>
		</table>
		<p>
				<font size="3">
						<font face="宋体">看完表<span lang="EN-US"> 6-2, 清晰展示了你可使用的属性. 当中的一些可能需要更多的解释. <em>IWebBrowser</em> 使用的相当多的一个属性是 <em>LocationURL</em>, 给出了当前你装入WebBrowser窗口的 URL。 获取 <em>LocationURL</em> 值在VB中相当容易： </span></font>
				</font>
		</p>
		<font class="Apple-style-span" face="monospace" size="3"><span class="Apple-style-span" style="line-height: normal; white-space: pre;"><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">Dim</span><span style="color: #000000; ">&nbsp;strLocation<br /><br />strLocation&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;WebBrowser1.LocationURL</span></div></span></font>
		<p>
				<span lang="EN-US">
						<font face="宋体" size="3">Visual C++的MFC应用,<span style="mso-spacerun: yes">&nbsp; </span>MFC 包装类使的访问<em>LocationURL</em> 很容易. 你简单调用 <em>GetLocationURL</em> 方法,该方法返回一个 <em>CString</em> 对象. 当你想在自动化IE中或者webBrowser的MFC应用中访问 <em>LocationURL</em> when automating Internet Explorer or when hosting the WebBrowser control in a C++ application that's not built by using MFC, 你必须调用携带一指向BSTR的指针<em>。</em><em>BSTR</em> 将包含返回值. 此处展示如何在 C++中使用:</font>
				</span>
		</p>
		<font class="Apple-style-span" size="3"><span class="Apple-style-span" style="line-height: normal;"><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">BSTR&nbsp;bstrURL;<br /><br />m_pInternetExplorer</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">get_LocationURL(</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">bstrURL);</span></div></span></font>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 10.5pt; text-indent: -10.5pt; mso-char-indent-count: -1.0; mso-char-indent-size: 10.5pt">
				<span lang="EN-US">
						<font face="Times New Roman">
								<font size="3">
										</font></font></span></p><p><font face="Times New Roman"><font size="3">
										</font></font></p><font face="Times New Roman"><font size="3">
								</font>
						</font>
				
		<p>&nbsp;</p>
		<p>
		</p>
		<p>
				<font size="3">
						<font face="宋体">存取 <em><span lang="EN-US">Document</span></em><span lang="EN-US"> 属性在VB中相当容易，当定义一个变量后（举例, <em>HtmlDoc</em>）, 值需要 set 为 <em>Document</em> 属性：</span></font>
				</font>
		</p>
		<font class="Apple-style-span" size="3"><span class="Apple-style-span" style="line-height: normal;"><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">Set</span><span style="color: #000000; ">&nbsp;HtmlDoc&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;WebBrowser1.Document</span></div></span></font>
		<p>
				<span lang="EN-US">
						<font face="宋体" size="3">MFC 中也很容易,使用 MFC 包装类的GetDocument方法：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">IDispatch</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;pDisp;<br /><br />pDisp&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;m_webBrowser.GetDocument();</span></div></font></span><span class="Apple-style-span" style="font-family: 宋体; font-size: medium; "><em><span lang="EN-US">GetDocument </span>
								</em>返回指向代表文档 <em><span lang="EN-US">IDispatch</span></em><span lang="EN-US"> 接口的指针. 如果 <em>GetDocument </em>失败, 该对象将为<em>NULL</em>.</span></span></p>
		
		<p>
				<font size="3">
						<font face="宋体">非<span lang="EN-US">MFC C++ 应用或者任何自动化IE的C++ 应用访问<em>Document</em> 属性就只能够采用调用COM的方法&#8212;通过属性的<em>get_</em>方法. (注艺属性实只读,所以这里无<em>put_ </em>方法.) 当调用 <em>Document <span style="mso-spacerun: yes">&nbsp;</span></em>的<em>get_</em> 方法,你传递一个接受 <em>IDispatch</em> 的指针.此处展示了如何调用： </span></font>
				</font>
		</p>
		<font class="Apple-style-span" size="3"><span class="Apple-style-span" style="line-height: normal;"><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">IDispatch</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;pDisp;<br />HRESULT&nbsp;hr&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;m_pInternetExplorer</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">get_Document(</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">pDisp); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span></div></span></font>
		<p>
				<font size="3">
						<font face="宋体">当使用这些代码<span lang="EN-US">,你可以使用 SUCCEEDED 宏（ Win32 API的一部分）, 以监测调用是否成功。在尝试使用<em>Idispatch</em>接口前你应当确信调用成功。</span></font>
				</font>
		</p><img src ="http://www.cppblog.com/tx7do/aggbug/8912.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/tx7do/" target="_blank">杨粼波</a> 2006-06-23 21:40 <a href="http://www.cppblog.com/tx7do/articles/8912.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何对webbrowser和IE编程（一）</title><link>http://www.cppblog.com/tx7do/articles/8911.html</link><dc:creator>杨粼波</dc:creator><author>杨粼波</author><pubDate>Fri, 23 Jun 2006 13:40:00 GMT</pubDate><guid>http://www.cppblog.com/tx7do/articles/8911.html</guid><wfw:comment>http://www.cppblog.com/tx7do/comments/8911.html</wfw:comment><comments>http://www.cppblog.com/tx7do/articles/8911.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/tx7do/comments/commentRss/8911.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/tx7do/services/trackbacks/8911.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 一、																		因为工作缘故，需要研究对														IE												编程，所以翻译了														MS												的有关资料，供参考。																																																		...&nbsp;&nbsp;<a href='http://www.cppblog.com/tx7do/articles/8911.html'>阅读全文</a><img src ="http://www.cppblog.com/tx7do/aggbug/8911.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/tx7do/" target="_blank">杨粼波</a> 2006-06-23 21:40 <a href="http://www.cppblog.com/tx7do/articles/8911.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>vc调试经验</title><link>http://www.cppblog.com/tx7do/articles/6492.html</link><dc:creator>杨粼波</dc:creator><author>杨粼波</author><pubDate>Sun, 30 Apr 2006 09:26:00 GMT</pubDate><guid>http://www.cppblog.com/tx7do/articles/6492.html</guid><wfw:comment>http://www.cppblog.com/tx7do/comments/6492.html</wfw:comment><comments>http://www.cppblog.com/tx7do/articles/6492.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/tx7do/comments/commentRss/6492.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/tx7do/services/trackbacks/6492.html</trackback:ping><description><![CDATA[      最经常在csdn上看到关于调试方面的文章，人气值也挺旺，可是要消化那一大堆文字确实也是不容易的事。在这里，我也来写一段！希望对大家有所帮助。
<p>       我们在做vc编程调试时经常遇到需要显示变量的内容之类的问题，在dos模式下我们简单使用printf(...)就行了，在<a class="wordstyle" href="http://www.newasp.cn/" target="_blank">windows</a>我们如何显示变量内容呢？大家肯定有许多方法如：调试时设置断点，用MessagBox什么的。我在开始使用vc时，也经常采用这样的方法来调试，但遇到一些不能用断点调试的程序时，比如某些绘图的程序里需要在ondraw里计算，就没办法了，把变量写到文件里吧？太麻烦了，还是看看仔细检查源代码吧！</p><p>        一个偶然的机会,我终于发现了<a class="wordstyle" href="http://www.newasp.cn/" target="_blank">windows</a>下类似printf的东东了，那就是_RPT。</p><p>        大家在自己vc 的源程序里加上_RPT1(0,"i=%d\n",i);到debug模式下运行一下。好了，看到结果了吧！那_RPT1能有几个参数吗？不行!哪要有两个参数怎么办？那就用_RPT2吧！其他的就自己试吧！</p><p>        <a href="mailto:s6283@hotmail.com">s6283@hotmail.com</a></p><img src ="http://www.cppblog.com/tx7do/aggbug/6492.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/tx7do/" target="_blank">杨粼波</a> 2006-04-30 17:26 <a href="http://www.cppblog.com/tx7do/articles/6492.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VC调试入门</title><link>http://www.cppblog.com/tx7do/articles/6491.html</link><dc:creator>杨粼波</dc:creator><author>杨粼波</author><pubDate>Sun, 30 Apr 2006 09:26:00 GMT</pubDate><guid>http://www.cppblog.com/tx7do/articles/6491.html</guid><wfw:comment>http://www.cppblog.com/tx7do/comments/6491.html</wfw:comment><comments>http://www.cppblog.com/tx7do/articles/6491.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/tx7do/comments/commentRss/6491.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/tx7do/services/trackbacks/6491.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 作者：												阿荣																																																																																																																																								...&nbsp;&nbsp;<a href='http://www.cppblog.com/tx7do/articles/6491.html'>阅读全文</a><img src ="http://www.cppblog.com/tx7do/aggbug/6491.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/tx7do/" target="_blank">杨粼波</a> 2006-04-30 17:26 <a href="http://www.cppblog.com/tx7do/articles/6491.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>高质量C++/C编程指南</title><link>http://www.cppblog.com/tx7do/articles/6136.html</link><dc:creator>杨粼波</dc:creator><author>杨粼波</author><pubDate>Mon, 24 Apr 2006 02:13:00 GMT</pubDate><guid>http://www.cppblog.com/tx7do/articles/6136.html</guid><wfw:comment>http://www.cppblog.com/tx7do/comments/6136.html</wfw:comment><comments>http://www.cppblog.com/tx7do/articles/6136.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/tx7do/comments/commentRss/6136.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/tx7do/services/trackbacks/6136.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 文件状态																																[  ] 												草稿文件																																[												√												] 												正式文件																																[  ] 		...&nbsp;&nbsp;<a href='http://www.cppblog.com/tx7do/articles/6136.html'>阅读全文</a><img src ="http://www.cppblog.com/tx7do/aggbug/6136.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/tx7do/" target="_blank">杨粼波</a> 2006-04-24 10:13 <a href="http://www.cppblog.com/tx7do/articles/6136.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++ 编程指南</title><link>http://www.cppblog.com/tx7do/articles/6133.html</link><dc:creator>杨粼波</dc:creator><author>杨粼波</author><pubDate>Mon, 24 Apr 2006 02:09:00 GMT</pubDate><guid>http://www.cppblog.com/tx7do/articles/6133.html</guid><wfw:comment>http://www.cppblog.com/tx7do/comments/6133.html</wfw:comment><comments>http://www.cppblog.com/tx7do/articles/6133.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/tx7do/comments/commentRss/6133.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/tx7do/services/trackbacks/6133.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 版权所有 © 1997 Rational Software Corporation。保留所有权利。“Rational”一词和 Rational 产品名是 Rational Software Corporation 的商标。涉及到其他公司及其产品时将使用各自公司的商标且仅限于此目的。此文档由来自 Calypso Software Inc. (Vancouver, B.C., Canada) 的 Lu...&nbsp;&nbsp;<a href='http://www.cppblog.com/tx7do/articles/6133.html'>阅读全文</a><img src ="http://www.cppblog.com/tx7do/aggbug/6133.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/tx7do/" target="_blank">杨粼波</a> 2006-04-24 10:09 <a href="http://www.cppblog.com/tx7do/articles/6133.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Windows消息目录</title><link>http://www.cppblog.com/tx7do/articles/5959.html</link><dc:creator>杨粼波</dc:creator><author>杨粼波</author><pubDate>Thu, 20 Apr 2006 09:32:00 GMT</pubDate><guid>http://www.cppblog.com/tx7do/articles/5959.html</guid><wfw:comment>http://www.cppblog.com/tx7do/comments/5959.html</wfw:comment><comments>http://www.cppblog.com/tx7do/articles/5959.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/tx7do/comments/commentRss/5959.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/tx7do/services/trackbacks/5959.html</trackback:ping><description><![CDATA[Windows消息目录<br />1. WM_NULL=$0000:<br />2. WM_CREATE=$0001:    应用程序创建一个窗口<br />3. WM_DESTROY=$0002:    一个窗口被销毁<br />4. WM_MOVE=$0003: 移动一个窗口<br />5. WM_SIZE=$0005:改变一个窗口的大小<br />6. WM_ACTIVATE=$0006: 一个窗口被激活或失去激活状态；<br />7. WM_SETFOCUS=$0007: 获得焦点后<br />8. WM_KILLFOCUS=$0008: 失去焦点<br />9. WM_ENABLE=$000A: 改变enable状态<br />10. WM_SETREDRAW=$000B: 设置窗口是否能重画<br />11. WM_SETTEXT=$000C: 应用程序发送此消息来设置一个窗口的文本<br />12. WM_GETTEXT=$000D: 应用程序发送此消息来复13. 制对应窗口的文本到缓冲区<br />14. WM_GETTEXTLENGTH=$000E: 得到与一个窗口有关的文本的长度（不15. 包含空字符）<br />16. WM_PAINT=$000F: 要求一个窗口重画自己<br />17. WM_CLOSE=$0010: 当一个窗口或应用程序要关闭时发送一个信号<br />18. WM_QUERYENDSESSION=$0011: 当用户选择结束对话框或程序自己调用ExitWindows函数<br />19. WM_QUIT=$0012: 用来结束程序运行或当程序调用postquitmessage函数<br />20. WM_QUERYOPEN=$0013: 当用户窗口恢复21. 以前的大小位置时，22. 把此消息发送给某个图标23. <br />24. WM_ERASEBKGND=$0014: 当窗口背景必须被擦除时（例在窗口改变大小时）<br />25. WM_SYSCOLORCHANGE=$0015: 当系统颜色改变时，26. 发送此消息给所有顶级窗口<br />27. WM_ENDSESSION=$0016:当系统进程发出WM_QUERYENDSESSION消息后,此消息发送给应用程序,通知它对话是否结束<br />28. WM_SYSTEMERROR=$0017: <br />29. WM_SHOWWINDOW=$0018: 当隐藏或显示窗口是发送此消息给这个窗口<br />30. WM_ACTIVATEAPP=$001C: 发此消息给应用程序哪个窗口是激活的，31. 哪个是非激活的；<br />32. WM_FONTCHANGE=$001D: 当系统的字体资源库变化时发送此消息给所有顶级窗口<br />33. WM_TIMECHANGE=$001E: 当系统的时间变化时发送此消息给所有顶级窗口<br />34. WM_CANCELMODE=$001F: 发送此消息来取消某种正在进行的摸态（操作）<br />35. WM_SETCURSOR=$0020:  如果鼠标36. 引起光标37. 在某个窗口中移动且鼠标38. 输入没有被捕获时，39. 就发消息给某个窗口<br />40. WM_MOUSEACTIVATE=$0021: 当光标41. 在某个非激活的窗口中而42. 用户正按着鼠标43. 的某个键发送此消息给当前窗口<br />44. WM_CHILDACTIVATE=$0022: 发送此消息给MDI子窗口当用户点击此窗口的标45. 题栏，46. 或当窗口被激活，47. 移动，48. 改变大小<br />49. WM_QUEUESYNC=$0023:  此消息由基于计算机的训练程序发送，50. 通过WH_JOURNALPALYBACK的hook程序分离出用户输入消息<br />51. WM_GETMINMAXINFO=$0024: 此消息发送给窗口当它将要改变大小或位置；<br />52. WM_PAINTICON=$0026:  发送给最小化窗口当它图标53. 将要被重画<br />54. WM_ICONERASEBKGND=$0027:此消息发送给某个最小化窗口，55. 仅当它在画图标56. 前它的背景必须被重画<br />57. WM_NEXTDLGCTL=$0028: 发送此消息给一个对话框程序去更改焦点位置<br />58. WM_SPOOLERSTATUS=$002A: 每当打印管理列队增加或减少一条作业时发出此消息<br />59. WM_DRAWITEM=$002B:  当button，60. combobox，61. listbox，62. menu的可视外观改变时发送此消息给这些空件的所有者<br />63. WM_MEASUREITEM=$002C: 当button,combobox,listbox,listviewcontrol,ormenuitem被创建时发送此消息 给控件      的所有者<br />64. WM_DELETEITEM=$002D: 当thelistbox或combobox被销毁或当某些项被删除通过             LB_DELETESTRING,LB_RESETCONTENT,CB_DELETESTRING,orCB_RESETCONTENT消息<br />65. WM_VKEYTOITEM=$002E: 此消息有一个LBS_WANTKEYBOARDINPUT风格的发出给它的所有者来响应WM_KEYDOWN消息<br />66. WM_CHARTOITEM=$002F:   此消息由一个LBS_WANTKEYBOARDINPUT风格的列表框发送给他的所有者来响应WM_CHAR消息<br />67. WM_SETFONT=$0030:  当绘制文本时程序发送此消息得到控件要用的颜色<br />68. WM_GETFONT=$0031:  应用程序发送此消息得到当前控件绘制文本的字体<br />69. WM_SETHOTKEY=$0032:  应用程序发送此消息让一个窗口与一个热键相关连<br />70. WM_GETHOTKEY=$0033:  应用程序发送此消息来判断热键与某个窗口是否有关联<br />71. WM_QUERYDRAGICON=$0037: 此消息发送给最小化窗口，72. 当此窗口将要被拖放而73. 它的类中没有定义图标74. ，75. 应用程序        能返回一个图标76. 或光标77. 的句柄，78. 当用户拖放图标79. 时系统显示这个图标80. 或光标81. <br />82. WM_COMPAREITEM=$0039: 发送此消息来判定combobox或listbox新增加的项的相对位置<br />83. WM_GETOBJECT=$003D:  <br />84. WM_COMPACTING=$0041: 显示内存已经很少了<br />85. WM_WINDOWPOSCHANGING=$0046: 发送此消息给那个窗口的大小和位置将要被改变时，86. 来调用setwindowpos函数或        其它窗口管理函数<br />87. WM_WINDOWPOSCHANGED=$0047: 发送此消息给那个窗口的大小和位置已经被改变时，88. 来调用setwindowpos函数或        其它窗口管理函数<br />89. WM_POWER=$0048:  (适用于16位的windows） 当系统将要进入暂停状态时发送此消息<br />90. WM_COPYDATA=$004A:  当一个应用程序传递数据给另一个应用程序时发送此消息<br />91. WM_CANCELJOURNAL=$004B: 当某个用户取消程序日志激活状态，92. 提交此消息给程序<br />93. WM_NOTIFY=$004E:   当某个控件的某个事件已经发生或这个控件需要得到一些信息时，94. 发送此消息给它的父窗口<br />95. WM_INPUTLANGCHANGEREQUEST=$0050: 当用户选择某种输入语言，96. 或输入语言的热键改变<br />97. WM_INPUTLANGCHANGE=$0051: 当平台现场已经被改变后发送此消息给受影响的最顶级窗口<br />98. WM_TCARD=$0052:  当程序已经初始化windows帮助例程时发送此消息给应用程序<br />99. WM_HELP=$0053: 此消息显示用户按下了F1，100. 如果某个菜单是激活的，101. 就发送此消息个此窗口关联的菜单,否则就    发送给有焦点的窗口，102. 如果当前都没有焦点，103. 就把此消息发送给当前激活的窗口<br />104. WM_USERCHANGED=$0054: 当用户已经登入或退出后发送此消息给所有的窗口，105. 当用户登入或退出时系统更新用   户的具体设置信息，106. 在用户更新设置时系统马上发送此消息；<br />107. WM_NOTIFYFORMAT=$0055: 公用控件，108. 自定义控件和他们的父窗口通过此消息来判断控件是使用ANSI还是    UNICODE结构在WM_NOTIFY消息，109. 使用此控件能使某个控件与它的父控件之间进行相互通信<br />110. WM_CONTEXTMENU=$007B: 当用户某个窗口中点击了一下右键就发送此消息给这个窗口<br />111. WM_STYLECHANGING=$007C: 当调用SETWINDOWLONG函数将要改变一个或多个窗口的风格时发送此消息给那个窗口<br />112. WM_STYLECHANGED=$007D: 当调用SETWINDOWLONG函数一个或多个窗口的风格后发送此消息给那个窗口<br />113. WM_DISPLAYCHANGE=$007E: 当显示器的分辨率改变后发送此消息给所有的窗口<br />114. WM_GETICON=$007F:  此消息发送给某个窗口来返回与某个窗口有关连的大图标115. 或小图标116. 的句柄；<br />117. WM_SETICON=$0080:  程序发送此消息让一个新的大图标118. 或小图标119. 与某个窗口关联；<br />120. WM_NCCREATE=$0081:  当某个窗口第一次被创建时，121. 此消息在WM_CREATE消息发送前发送；<br />122. WM_NCDESTROY=$0082:  此消息通知某个窗口，123. 非客户区正在销毁<br />124. WM_NCCALCSIZE=$0083: 当某个窗口的客户区域必须被核算时发送此消息<br />125. WM_NCHITTEST=$0084:   移动鼠标126. ，127. 按住或释放鼠标128. 时发生<br />129. WM_NCPAINT=$0085:  程序发送此消息给某个窗口当它（窗口）的框架必须被绘制时；<br />130. WM_NCACTIVATE=$0086: 此消息发送给某个窗口仅当它的非客户区需要被改变来显示是激活还是非激活状态；<br />131. WM_GETDLGCODE=$0087:   发送此消息给某个与对话框程序关联的控件，132. widdows控制方位键和TAB键使输入进入    此控件通过响应WM_GETDLGCODE消息，133. 应用程序可以把他当成一个特殊的输入控件并能处理它<br />134. WM_NCMOUSEMOVE=$00A0: 当光标135. 在一个窗口的非客户区内移动时发送此消息给这个窗口file: 非客户区为：   窗体的标136. 题栏及窗的边框体<br />137. WM_NCLBUTTONDOWN=$00A1: 当光标138. 在一个窗口的非客户区同139. 时按下鼠标140. 左键时提交此消息<br />141. WM_NCLBUTTONUP=$00A2: 当用户释放鼠标142. 左键同143. 时光标144. 某个窗口在非客户区十发送此消息；<br />145. WM_NCLBUTTONDBLCLK=$00A3:当用户双击鼠标146. 左键同147. 时光标148. 某个窗口在非客户区十发送此消息<br />149. WM_NCRBUTTONDOWN=$00A4: 当用户按下鼠标150. 右键同151. 时光标152. 又在窗口的非客户区时发送此消息<br />153. WM_NCRBUTTONUP=$00A5: 当用户释放鼠标154. 右键同155. 时光标156. 又在窗口的非客户区时发送此消息<br />157. WM_NCRBUTTONDBLCLK=$00A6:当用户双击鼠标158. 右键同159. 时光标160. 某个窗口在非客户区十发送此消息<br />161. WM_NCMBUTTONDOWN=$00A7: 当用户按下鼠标162. 中键同163. 时光标164. 又在窗口的非客户区时发送此消息<br />165. WM_NCMBUTTONUP=$00A8: 当用户释放鼠标166. 中键同167. 时光标168. 又在窗口的非客户区时发送此消息<br />169. WM_NCMBUTTONDBLCLK=$00A9:当用户双击鼠标170. 中键同171. 时光标172. 又在窗口的非客户区时发送此消息<br />173. WM_KEYFIRST=$0100: <br />174. WM_KEYDOWN=$0100: file: 按下一个键<br />175. WM_KEYUP=$0101:  file: 释放一个键<br />176. WM_CHAR=$0102:  file: 按下某键，177. 并已发出WM_KEYDOWN，178. WM_KEYUP消息<br />179. WM_DEADCHAR=$0103: 当用translatemessage函数翻译WM_KEYUP消息时发送此消息给拥有焦点的窗口<br />180. WM_SYSKEYDOWN=$0104:当用户按住ALT键同181. 时按下其它键时提交此消息给拥有焦点的窗口；<br />182. WM_SYSKEYUP=$0105: 当用户释放一个键同183. 时ALT键还按着时提交此消息给拥有焦点的窗口<br />184. WM_SYSCHAR=$0106: 当WM_SYSKEYDOWN消息被TRANSLATEMESSAGE函数翻译后提交此消息给拥有焦点的窗口<br />185. WM_SYSDEADCHAR=$0107: 当WM_SYSKEYDOWN消息被TRANSLATEMESSAGE函数翻译后发送此消息给拥有焦点的窗口<br />186. WM_INITDIALOG=$0110: 在一个对话框程序被显示前发送此消息给它,常用此消息初始化控件和执行其它任务<br />187. WM_COMMAND=$0111:  当用户选择一条菜单命令项或当某个控件发送一条消息给它的父窗口，188. 一个快捷键被翻译<br />189. WM_SYSCOMMAND=$0112: 当用户选择窗口菜单的一条命令或当用户选择最大化或最小化时那个窗口会收到此消息<br />190. WM_TIMER=$0113:      发生了定时器事件<br />191. WM_HSCROLL=$0114:  当一个窗口标192. 准水平滚动条产生一个滚动事件时发送此消息给那个窗口，193. 也发送给拥有它的控件<br />194. WM_VSCROLL=$0115:  当一个窗口标195. 准垂直滚动条产生一个滚动事件时发送此消息给那个窗口也，196. 发送给拥有它的控件<br />197. WM_INITMENU=$0116: 当一个菜单将要被激活时发送此消息，198. 它发生在用户菜单条中的某项或按下某个菜单键，199.         它允许程序在显示前更改菜单<br />200. WM_INITMENUPOPUP=$0117: 当一个下拉菜单或子菜单将要被激活时发送此消息，201. 它允许程序在它显示前更改菜单，202.        而203. 不204. 要改变全部<br />205. WM_MENUSELECT=$011F: 当用户选择一条菜单项时发送此消息给菜单的所有者（一般是窗口）<br />206. WM_MENUCHAR=$0120:  当菜单已被激活用户按下了某个键（不207. 同208. 于加速键），209. 发送此消息给菜单的所有者；<br />210. WM_ENTERIDLE=$0121:  当一个模态对话框或菜单进入空载状态时发送此消息给它的所有者，211. 一个模态对话框       或菜单进入空载状态就是在处理一条或几条先前的消息后没有消息它的列队中等待<br />212. WM_MENURBUTTONUP=$0122: WM_MENUDRAG=$0123: WM_MENUGETOBJECT=$0124: WM_UNINITMENUPOPUP=$0125:<br />213. WM_MENUCOMMAND=$0126: WM_CHANGEUISTATE=$0127:WM_UPDATEUISTATE=$0128:WM_QUERYUISTATE=$0129:<br />214. WM_CTLCOLORMSGBOX=$0132: 在windows绘制消息框前发送此消息给消息框的所有者窗口，215. 通过响应这条            消息，216. 所有者窗口可以通过使用给定的相关显示设备217. 的句柄来设置消息框的文本和背景颜色<br />218. WM_CTLCOLOREDIT=$0133: 当一个编辑型控件将要被绘制时发送此消息给它的父窗口:通过响应这条消息,所有者窗口可以通过使用给定的相关显示设备219. 的句柄来设置编辑框的文本和背景颜色<br />220. WM_CTLCOLORLISTBOX=$0134:当一个列表框控件将要被绘制前发送此消息给它的父窗口；通过响应这条息，221. 所有者窗口可以通过使用给定的相关显示设备222. 的句柄来设置列表框的文本和背景颜色<br />223. WM_CTLCOLORBTN=$0135: 当一个按钮控件将要被绘制时发送此消息给它的父窗口；通过响应这条消息，224. 所有者       窗口可以通过使用给定的相关显示设备225. 的句柄来设置按纽的文本和背景颜色<br />226. WM_CTLCOLORDLG=$0136: 当一个对话框控件将要被绘制前发送此消息给它的父窗口；通过响应这条消息，227. 所有       者窗口可以通过使用给定的相关显示设备228. 的句柄来设置对话框的文本背景颜色<br />229. WM_CTLCOLORSCROLLBAR=$0137: 当一个滚动条控件将要被绘制时发送此消息给它的父窗口；通过响应这条消息，230.          所有者窗口可以通过使用给定的相关显示设备231. 的句柄来设置滚动条的背景颜色<br />232. WM_CTLCOLORSTATIC=$0138: 当一个静态控件将要被绘制时发送此消息给它的父窗口；通过响应这条消息，233. 所        有者窗口可以通过使用给定的相关显示设备234. 的句柄来设置静态控件的文本和背景颜色<br />235. WM_MOUSEMOVE=$0200:     移动鼠标236. <br />237. WM_LBUTTONDOWN=$0201    按下鼠标238. 左键<br />239. WM_LBUTTONUP=$0202:    释放鼠标240. 左键<br />241. WM_LBUTTONDBLCLK=$0203:     双击鼠标242. 左键<br />243. WM_RBUTTONDOWN=$0204:   按下鼠标244. 右键<br />245. WM_RBUTTONUP=$0205:    释放鼠标246. 右键<br />247. WM_RBUTTONDBLCLK=$0206:   双击鼠标248. 右键<br />249. WM_MBUTTONDOWN=$0207:   按下鼠标250. 中键<br />251. WM_MBUTTONUP=$0208:    释放鼠标252. 中键<br />253. WM_MBUTTONDBLCLK=$0209:   双击鼠标254. 中键<br />255. WM_MOUSEWHEEL=$020A:  当鼠标256. 轮子转动时发送此消息个当前有焦点的控件<br />257. WM_PARENTNOTIFY=$0210: 当MDI子窗口被创建或被销毁，258. 或用户按了一下鼠标259. 键而260. 光标261. 在子窗口上时发送此消       息给它的父窗口<br />262. WM_ENTERMENULOOP=$0211: 发送此消息通知应用程序的主窗口that已经进入了菜单循环模式<br />263. WM_EXITMENULOOP=$0212: 发送此消息通知应用程序的主窗口that已退出了菜单循环模式<br />264. WM_NEXTMENU=$0213:<br />265. WM_SIZING=532:   当用户正在调整窗口大小时发送此消息给窗口；通过此消息应用程序可以监视窗口大       小和位置也可以修改他们<br />266. WM_CAPTURECHANGED=533: 发送此消息给窗口当它失去捕获的鼠标267. 时；<br />268. WM_MOVING=534:   当用户在移动窗口时发送此消息，269. 通过此消息应用程序可以监视窗口大小和位置也可       以修改他们；<br />270. WM_POWERBROADCAST=536: 此消息发送给应用程序来通知它有关电源管理事件；<br />271. WM_DEVICECHANGE=537:  当设备272. 的硬件配置改变时发送此消息给应用程序或设备273. 驱动程序<br />274. WM_IME_STARTCOMPOSITION=$010D: <br />275. WM_IME_ENDCOMPOSITION=$010E:<br />276. WM_IME_COMPOSITION=$010F:<br />277. WM_IME_KEYLAST=$010F:<br />278. WM_IME_SETCONTEXT=$0281:<br />279. WM_IME_NOTIFY=$0282:<br />280. WM_IME_CONTROL=$0283:<br />281. WM_IME_COMPOSITIONFULL=$0284:<br />282. WM_IME_SELECT=$0285:<br />283. WM_IME_CHAR=$0286:<br />284. WM_IME_REQUEST=$0288:<br />285. WM_IME_KEYDOWN=$0290:<br />286. WM_IME_KEYUP=$0291:<br />287. WM_MDICREATE=$0220:  应用程序发送此消息给多文档的客户窗口来创建一个MDI子窗口<br />288. WM_MDIDESTROY=$0221: 应用程序发送此消息给多文档的客户窗口来关闭一个MDI子窗口<br />289. WM_MDIACTIVATE=$0222: 应用程序发送此消息给多文档的客户窗口通知客户窗口激活另一个MDI子窗口，290. 当客       户窗口收到此消息后，291. 它发出WM_MDIACTIVE消息给MDI子窗口（未激活）激活它；<br />292. WM_MDIRESTORE=$0223: 程序发送此消息给MDI客户窗口让子窗口从最大最小化恢复293. 到原来大小<br />294. WM_MDINEXT=$0224:  程序发送此消息给MDI客户窗口激活下一个或前一个窗口<br />295. WM_MDIMAXIMIZE=$0225: 程序发送此消息给MDI客户窗口来最大化一个MDI子窗口；<br />296. WM_MDITILE=$0226:  程序发送此消息给MDI客户窗口以平铺方式重新排列所有MDI子窗口<br />297. WM_MDICASCADE=$0227: 程序发送此消息给MDI客户窗口以层叠方式重新排列所有MDI子窗口<br />298. WM_MDIICONARRANGE=$0228: 程序发送此消息给MDI客户窗口重新排列所有最小化的MDI子窗口<br />299. WM_MDIGETACTIVE=$0229:    程序发送此消息给MDI客户窗口来找到激活的子窗口的句柄<br />300. WM_MDISETMENU=$0230:  程序发送此消息给MDI客户窗口用MDI菜单代替子窗口的菜单<br />301. WM_ENTERSIZEMOVE=$0231: <br />302. WM_EXITSIZEMOVE=$0232:<br />303. WM_DROPFILES=$0233:<br />304. WM_MDIREFRESHMENU=$0234:<br />305. WM_MOUSEHOVER=$02A1:<br />306. WM_MOUSELEAVE=$02A3:<br />307. WM_CUT=$0300:    程序发送此消息给一个编辑框或combobox来删除当前选择的文本<br />308. WM_COPY=$0301:   程序发送此消息给一个编辑框或combobox来复309. 制当前选择的文本到剪贴板<br />310. WM_PASTE=$0302:   程序发送此消息给editcontrol或combobox从剪贴板中得到数据<br />311. WM_CLEAR=$0303:   程序发送此消息给editcontrol或combobox清除当前选择的内容；<br />312. WM_UNDO=$0304:   程序发送此消息给editcontrol或combobox撤消最后一次操作<br />313. WM_RENDERFORMAT=$0305；<br />314. WM_RENDERALLFORMATS=$0306:<br />315. WM_DESTROYCLIPBOARD=$0307: 当调用ENPTYCLIPBOARD函数时发送此消息给剪贴板的所有者<br />316. WM_DRAWCLIPBOARD=$0308:  当剪贴板的内容变化时发送此消息给剪贴板观察链的第一个窗口；它允许用剪贴        板观察窗口来显示剪贴板的新内容；<br />317. WM_PAINTCLIPBOARD=$0309:  当剪贴板包含CF_OWNERDIPLAY格式的数据并且剪贴板观察窗口的客户区需要重        画；<br />318. WM_VSCROLLCLIPBOARD=$030A:<br />319. WM_SIZECLIPBOARD=$030B:  当剪贴板包含CF_OWNERDIPLAY格式的数据并且剪贴板观察窗口的客户区域的大小        已经改变是此消息通过剪贴板观察窗口发送给剪贴板的所有者；<br />320. WM_ASKCBFORMATNAME=$030C:  通过剪贴板观察窗口发送此消息给剪贴板的所有者来请求一个CF_OWNERDISPLAY        格式的剪贴板的名321. 字<br />322. WM_CHANGECBCHAIN=$030D:  当一个窗口从剪贴板观察链中移去时发送此消息给剪贴板观察链的第一个窗口；<br />323. WM_HSCROLLCLIPBOARD=$030E: 此消息通过一个剪贴板观察窗口发送给剪贴板的所有者；它发生在当剪贴板包含        CFOWNERDISPALY格式的数据并且有个事件在剪贴板观察窗的水平滚动条上；所有        者应滚动剪贴板图象并更新滚动条的值；<br />324. WM_QUERYNEWPALETTE=$030F:  此消息发送给将要收到焦点的窗口，325. 此消息能使窗口在收到焦点时同326. 时有机会实        现他的逻辑调色板<br />327. WM_PALETTEISCHANGING=$0310:     当一个应用程序正要实现它的逻辑调色板时发此消息通知所有的应用程序<br />328. WM_PALETTECHANGED=$0311:  此消息在一个拥有焦点的窗口实现它的逻辑调色板后发送此消息给所有顶级并重        叠的窗口，329. 以此来改变系统调色板<br />330. WM_HOTKEY=$0312:    当用户按下由REGISTERHOTKEY函数注册的热键时提交此消息<br />331. WM_PRINT=791:     应用程序发送此消息仅当WINDOWS或其它应用程序发出一个请求要求绘制一个应用程序的一部分；<br />332. WM_PRINTCLIENT=792: <br />333. WM_HANDHELDFIRST=856:<br />334. WM_HANDHELDLAST=863:<br />335. WM_PENWINFIRST=$0380:<br />336. WM_PENWINLAST=$038F:<br />337. WM_COALESCE_FIRST=$0390:<br />338. WM_COALESCE_LAST=$039F:<br />339. WM_DDE_FIRST=$03E0:<br />340. WM_DDE_INITIATE=WM_DDE_FIRST+0:  一个DDE客户程序提交此消息开始一个与服341. 务器程序的会话来响应那个指342. 定的程序和主题名343. ；<br />344. WM_DDE_TERMINATE=WM_DDE_FIRST+1: 一个DDE应用程序(无论是客户还是服345. 务器)提交此消息来终止一个会话；<br />346. WM_DDE_ADVISE=WM_DDE_FIRST+2:  一个DDE客户程序提交此消息给一个DDE服347. 务程序来请求服348. 务器每当数          据项改变时更新它<br />349. WM_DDE_UNADVISE=WM_DDE_FIRST+3:  一个DDE客户程序通过此消息通知一个DDE服350. 务程序不351. 更新指352. 定的项或          一个特殊的剪贴板格式的项<br />353. WM_DDE_ACK=WM_DDE_FIRST+4:  此消息通知一个DDE（动态数据交换）程序已收到并正在处理WM_DDE_POKE,WM_DDE_EXECUTE,WM_DDE_DATA,WM_DDE_ADVISE,WM_DDE_UNADVISE,orWM_DDE_INITIAT消息WM_DDE_DATA=WM_DDE_FIRST+5:一个DDE服354. 务程序提交此消息给DDE客户程序来传递个一数据项给客户或通知客户的一条可用数据项<br />355. WM_DDE_REQUEST=WM_DDE_FIRST+6: 一个DDE客户程序提交此消息给一个DDE服356. 务程序来请求一个数据项的值；<br />357. WM_DDE_POKE=WM_DDE_FIRST+7:  一个DDE客户程序提交此消息给一个DDE服358. 务程序，359. 客户使用此消息来请求服360. 务器接收一个未经同361. 意的数据项；服362. 务器通过答复363. WM_DDE_ACK消息提示是否它接收这个数据项；<br />364. WM_DDE_EXECUTE=WM_DDE_FIRST+8: 一个DDE客户程序提交此消息给一DDE服365. 务程序来发送一个字符串给服366. 务器让它象串行命令一样被处理,服367. 务器通过提交WM_DDE_ACK消息来作回应；<br />368. WM_DDE_LAST=WM_DDE_FIRST+8:  <br />369. WM_APP=$8000:<br />370. WM_USER=$0400: 此消息能帮助应用程序自定义私有消息；<br />                                  /<br />通知消息(Notificationmessage)是指这样一种消息，一个窗口内的子控件发生了一些事情，需要通知父窗口。通知消息只适用于标准的窗口控件如按钮、列表框、组合框、编辑框，以及Windows95公共控件如树状视图、列表视图等。例如，单击或双击一个控件、在控件中选择部分文本、操作控件的<br />滚动条都会产生通知消息。<br />371. 按扭<br />372. BN_CLICKED  file: 用户单击了按钮<br />373. BN_DISABLE  file: 按钮被禁止<br />374. BN_DOUBLECLICKED file: 用户双击了按钮<br />375. BN_HILITE file: 用户加亮了按钮<br />376. BN_PAINT 按钮应当重画<br />377. BN_UNHILITE  加亮应当去掉组合框<br />378. CBN_CLOSEUP  组合框的列表框被关闭<br />379. CBN_DBLCLK  用户双击了一个字符串<br />380. CBN_DROPDOWN 组合框的列表框被拉出<br />381. CBN_EDITCHANGE 用户修改了编辑框中的文本<br />382. CBN_EDITUPDATE 编辑框内的文本即将更新<br />383. CBN_ERRSPACE 组合框内存不384. 足<br />385. CBN_KILLFOCUS 组合框失去输入焦点<br />386. CBN_SELCHANGE 在组合框中选择了一项<br />387. CBN_SELENDCANCEL 用户的选择应当被取消<br />388. CBN_SELENDOK  用户的选择是合法的<br />389. CBN_SETFOCUS  组合框获得输入焦点编辑框<br />390. EN_CHANGE   编辑框中的文本己更新<br />391. EN_ERRSPACE   编辑框内存不392. 足<br />393. EN_HSCROLL   用户点击了水平滚动条<br />394. EN_KILLFOCUS  编辑框正在失去输入焦点<br />395. EN_MAXTEXT   插入的内容被截断<br />396. EN_SETFOCUS   编辑框获得输入焦点<br />397. EN_UPDATE   编辑框中的文本将要更新<br />398. EN_VSCROLL   用户点击了垂直滚动条消息含义<br />列表框<br />399. LBN_DBLCLK   用户双击了一项<br />400. LBN_ERRSPACE  列表框内存不401. 够<br />402. LBN_KILLFOCUS  列表框正在失去输入焦点<br />403. LBN_SELCANCEL  选择被取消<br />404. LBN_SELCHANGE  选择了另一项<br />405. LBN_SETFOCUS  列表框获得输入焦点<img src ="http://www.cppblog.com/tx7do/aggbug/5959.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/tx7do/" target="_blank">杨粼波</a> 2006-04-20 17:32 <a href="http://www.cppblog.com/tx7do/articles/5959.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>