锘??xml version="1.0" encoding="utf-8" standalone="yes"?>欧美v日韩v国产v,午夜精品视频,久久成人综合视频http://www.shnenglu.com/bigsml/category/2847.htmlzh-cnSat, 20 Dec 2008 02:38:24 GMTSat, 20 Dec 2008 02:38:24 GMT60Pythong logging 鍒?Logging4cplus 鐨勯傞厤鍣?/title><link>http://www.shnenglu.com/bigsml/archive/2008/12/19/69856.html</link><dc:creator>娉℃場鐗?/dc:creator><author>娉℃場鐗?/author><pubDate>Fri, 19 Dec 2008 10:13:00 GMT</pubDate><guid>http://www.shnenglu.com/bigsml/archive/2008/12/19/69856.html</guid><wfw:comment>http://www.shnenglu.com/bigsml/comments/69856.html</wfw:comment><comments>http://www.shnenglu.com/bigsml/archive/2008/12/19/69856.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/bigsml/comments/commentRss/69856.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/bigsml/services/trackbacks/69856.html</trackback:ping><description><![CDATA[<p>Python 鐨刲ogging 妯″潡鐨凷ocket 鍜?Logging4cplus 鐨?socket 鐨勬牸寮忔槸涓嶄竴鏍風殑, 鐜板疄涓渶瑕佸皢鏃ュ織鍙戦佸埌l(fā)ogging4cplus 鐨勬湇鍔″櫒, 涓嶅緱宸? 鍐欎簡涓?Python logging 妯″潡鍒?logging4cplus鐨凙dapter <br></p> <div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080"> 1</span> <span style="COLOR: #008000">#</span><span style="COLOR: #008000">!/usr/bin/env python</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080"> 2</span> <span style="COLOR: #008000">#</span><span style="COLOR: #008000">-*- coding: gbk -*-</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080"> 3</span> <span style="COLOR: #008000"></span><span style="COLOR: #0000ff">from</span><span style="COLOR: #000000"> struct </span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> pack, unpack <br></span><span style="COLOR: #008080"> 4</span> <span style="COLOR: #000000"><br></span><span style="COLOR: #008080"> 5</span> <span style="COLOR: #000000"></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> BufferPack(object):    <br></span><span style="COLOR: #008080"> 6</span> <span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">def</span><span style="COLOR: #000000"> </span><span style="COLOR: #800080">__init__</span><span style="COLOR: #000000">(self):<br></span><span style="COLOR: #008080"> 7</span> <span style="COLOR: #000000">        self.buffer </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #800000">''</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080"> 8</span> <span style="COLOR: #000000">        <br></span><span style="COLOR: #008080"> 9</span> <span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">def</span><span style="COLOR: #000000"> addChar(self, s, unsigned</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">False):<br></span><span style="COLOR: #008080">10</span> <span style="COLOR: #000000">        self.buffer </span><span style="COLOR: #000000">+=</span><span style="COLOR: #000000"> pack(unsigned </span><span style="COLOR: #0000ff">and</span><span style="COLOR: #000000"> </span><span style="COLOR: #800000">'</span><span style="COLOR: #800000">>b</span><span style="COLOR: #800000">'</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">or</span><span style="COLOR: #000000"> </span><span style="COLOR: #800000">'</span><span style="COLOR: #800000">>c</span><span style="COLOR: #800000">'</span><span style="COLOR: #000000">, s )<br></span><span style="COLOR: #008080">11</span> <span style="COLOR: #000000"><br></span><span style="COLOR: #008080">12</span> <span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">def</span><span style="COLOR: #000000"> addShort(self, s, unsigned</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">False):<br></span><span style="COLOR: #008080">13</span> <span style="COLOR: #000000">        self.buffer </span><span style="COLOR: #000000">+=</span><span style="COLOR: #000000"> pack(unsigned </span><span style="COLOR: #0000ff">and</span><span style="COLOR: #000000"> </span><span style="COLOR: #800000">'</span><span style="COLOR: #800000">>H</span><span style="COLOR: #800000">'</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">or</span><span style="COLOR: #000000"> </span><span style="COLOR: #800000">'</span><span style="COLOR: #800000">>h</span><span style="COLOR: #800000">'</span><span style="COLOR: #000000">, s )<br></span><span style="COLOR: #008080">14</span> <span style="COLOR: #000000">    <br></span><span style="COLOR: #008080">15</span> <span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">def</span><span style="COLOR: #000000"> addInt(self, s, unsigned</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">False):<br></span><span style="COLOR: #008080">16</span> <span style="COLOR: #000000">        self.buffer </span><span style="COLOR: #000000">+=</span><span style="COLOR: #000000"> pack(unsigned </span><span style="COLOR: #0000ff">and</span><span style="COLOR: #000000"> </span><span style="COLOR: #800000">'</span><span style="COLOR: #800000">>I</span><span style="COLOR: #800000">'</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">or</span><span style="COLOR: #000000"> </span><span style="COLOR: #800000">'</span><span style="COLOR: #800000">>i</span><span style="COLOR: #800000">'</span><span style="COLOR: #000000">, s )<br></span><span style="COLOR: #008080">17</span> <span style="COLOR: #000000">    <br></span><span style="COLOR: #008080">18</span> <span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">def</span><span style="COLOR: #000000"> addLong(self, s, unsigned</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">False):<br></span><span style="COLOR: #008080">19</span> <span style="COLOR: #000000">        self.buffer </span><span style="COLOR: #000000">+=</span><span style="COLOR: #000000"> pack(unsigned </span><span style="COLOR: #0000ff">and</span><span style="COLOR: #000000"> </span><span style="COLOR: #800000">'</span><span style="COLOR: #800000">>L</span><span style="COLOR: #800000">'</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">or</span><span style="COLOR: #000000"> </span><span style="COLOR: #800000">'</span><span style="COLOR: #800000">>l</span><span style="COLOR: #800000">'</span><span style="COLOR: #000000">, s )<br></span><span style="COLOR: #008080">20</span> <span style="COLOR: #000000">    <br></span><span style="COLOR: #008080">21</span> <span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">def</span><span style="COLOR: #000000"> addString(self, s):<br></span><span style="COLOR: #008080">22</span> <span style="COLOR: #000000">        self.addInt( len(s) ) <br></span><span style="COLOR: #008080">23</span> <span style="COLOR: #000000">        self.buffer </span><span style="COLOR: #000000">+=</span><span style="COLOR: #000000"> s <br></span><span style="COLOR: #008080">24</span> <span style="COLOR: #000000">    <br></span><span style="COLOR: #008080">25</span> <span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">def</span><span style="COLOR: #000000"> addBuffer(self, s):<br></span><span style="COLOR: #008080">26</span> <span style="COLOR: #000000">        self.buffer </span><span style="COLOR: #000000">+=</span><span style="COLOR: #000000"> s.buffer <br></span><span style="COLOR: #008080">27</span> <span style="COLOR: #000000"><br></span><span style="COLOR: #008080">28</span> <span style="COLOR: #000000"></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> BufferUnpack(object):<br></span><span style="COLOR: #008080">29</span> <span style="COLOR: #000000">    <br></span><span style="COLOR: #008080">30</span> <span style="COLOR: #000000">    char_bits     </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> len( pack(</span><span style="COLOR: #800000">'</span><span style="COLOR: #800000">>b</span><span style="COLOR: #800000">'</span><span style="COLOR: #000000">, 0) ) <br></span><span style="COLOR: #008080">31</span> <span style="COLOR: #000000">    short_bits     </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> len( pack(</span><span style="COLOR: #800000">'</span><span style="COLOR: #800000">>H</span><span style="COLOR: #800000">'</span><span style="COLOR: #000000">, 0) ) <br></span><span style="COLOR: #008080">32</span> <span style="COLOR: #000000">    int_bits    </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> len( pack(</span><span style="COLOR: #800000">'</span><span style="COLOR: #800000">>I</span><span style="COLOR: #800000">'</span><span style="COLOR: #000000">, 0) ) <br></span><span style="COLOR: #008080">33</span> <span style="COLOR: #000000">    long_bits     </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> len( pack(</span><span style="COLOR: #800000">'</span><span style="COLOR: #800000">>L</span><span style="COLOR: #800000">'</span><span style="COLOR: #000000">, 0) )    <br></span><span style="COLOR: #008080">34</span> <span style="COLOR: #000000">    <br></span><span style="COLOR: #008080">35</span> <span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">def</span><span style="COLOR: #000000"> </span><span style="COLOR: #800080">__init__</span><span style="COLOR: #000000">(self, buffer):<br></span><span style="COLOR: #008080">36</span> <span style="COLOR: #000000">        self.buffer </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> buffer <br></span><span style="COLOR: #008080">37</span> <span style="COLOR: #000000">        self.pos </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> 0<br></span><span style="COLOR: #008080">38</span> <span style="COLOR: #000000">    <br></span><span style="COLOR: #008080">39</span> <span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">def</span><span style="COLOR: #000000"> _read_item(self, unpackstr, len):<br></span><span style="COLOR: #008080">40</span> <span style="COLOR: #000000">        v </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> unpack(unpackstr, self.buffer[self.pos:self.pos</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">len] )<br></span><span style="COLOR: #008080">41</span> <span style="COLOR: #000000">        self.pos </span><span style="COLOR: #000000">+=</span><span style="COLOR: #000000"> len <br></span><span style="COLOR: #008080">42</span> <span style="COLOR: #000000">        </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> v <br></span><span style="COLOR: #008080">43</span> <span style="COLOR: #000000">    <br></span><span style="COLOR: #008080">44</span> <span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">def</span><span style="COLOR: #000000"> readChar(self, unsigned</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">False):<br></span><span style="COLOR: #008080">45</span> <span style="COLOR: #000000">        </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> self._read_item(unsigned </span><span style="COLOR: #0000ff">and</span><span style="COLOR: #000000"> </span><span style="COLOR: #800000">'</span><span style="COLOR: #800000"><b</span><span style="COLOR: #800000">'</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">or</span><span style="COLOR: #000000"> </span><span style="COLOR: #800000">'</span><span style="COLOR: #800000"><c</span><span style="COLOR: #800000">'</span><span style="COLOR: #000000">, self.char_bits)<br></span><span style="COLOR: #008080">46</span> <span style="COLOR: #000000">    <br></span><span style="COLOR: #008080">47</span> <span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">def</span><span style="COLOR: #000000"> readShort(self, unsigned</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">False):    <br></span><span style="COLOR: #008080">48</span> <span style="COLOR: #000000">        </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> self._read_item(unsigned </span><span style="COLOR: #0000ff">and</span><span style="COLOR: #000000"> </span><span style="COLOR: #800000">'</span><span style="COLOR: #800000"><H</span><span style="COLOR: #800000">'</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">or</span><span style="COLOR: #000000"> </span><span style="COLOR: #800000">'</span><span style="COLOR: #800000"><h</span><span style="COLOR: #800000">'</span><span style="COLOR: #000000">, self.short_bits )<br></span><span style="COLOR: #008080">49</span> <span style="COLOR: #000000">        <br></span><span style="COLOR: #008080">50</span> <span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">def</span><span style="COLOR: #000000"> readInt(self, unsigned</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">False):<br></span><span style="COLOR: #008080">51</span> <span style="COLOR: #000000">        </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> self._read_item(unsigned </span><span style="COLOR: #0000ff">and</span><span style="COLOR: #000000"> </span><span style="COLOR: #800000">'</span><span style="COLOR: #800000"><I</span><span style="COLOR: #800000">'</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">or</span><span style="COLOR: #000000"> </span><span style="COLOR: #800000">'</span><span style="COLOR: #800000"><i</span><span style="COLOR: #800000">'</span><span style="COLOR: #000000">, self.int_bits )<br></span><span style="COLOR: #008080">52</span> <span style="COLOR: #000000">    <br></span><span style="COLOR: #008080">53</span> <span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">def</span><span style="COLOR: #000000"> readLong(self, unsigned</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">False):<br></span><span style="COLOR: #008080">54</span> <span style="COLOR: #000000">        </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> self._read_item(unsigned </span><span style="COLOR: #0000ff">and</span><span style="COLOR: #000000"> </span><span style="COLOR: #800000">'</span><span style="COLOR: #800000"><L</span><span style="COLOR: #800000">'</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">or</span><span style="COLOR: #000000"> </span><span style="COLOR: #800000">'</span><span style="COLOR: #800000"><l</span><span style="COLOR: #800000">'</span><span style="COLOR: #000000">, self.long_bits )<br></span><span style="COLOR: #008080">55</span> <span style="COLOR: #000000">    <br></span><span style="COLOR: #008080">56</span> <span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">def</span><span style="COLOR: #000000"> readString(self):<br></span><span style="COLOR: #008080">57</span> <span style="COLOR: #000000">        len </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> self.readInt()<br></span><span style="COLOR: #008080">58</span> <span style="COLOR: #000000">        v </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> self.buffer[self.pos:self.pos</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">len] <br></span><span style="COLOR: #008080">59</span> <span style="COLOR: #000000">        self.pos </span><span style="COLOR: #000000">+=</span><span style="COLOR: #000000"> len<br></span><span style="COLOR: #008080">60</span> <span style="COLOR: #000000">        </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> v <br></span><span style="COLOR: #008080">61</span> <span style="COLOR: #000000"><br></span><span style="COLOR: #008080">62</span> <span style="COLOR: #000000"></span><span style="COLOR: #0000ff">def</span><span style="COLOR: #000000"> PackMessage( record ):<br></span><span style="COLOR: #008080">63</span> <span style="COLOR: #000000">    bp </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> BufferPack()<br></span><span style="COLOR: #008080">64</span> <span style="COLOR: #000000">    bp.addChar(</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">, True) <br></span><span style="COLOR: #008080">65</span> <span style="COLOR: #000000">    bp.addChar(</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">, True) <br></span><span style="COLOR: #008080">66</span> <span style="COLOR: #000000">    <br></span><span style="COLOR: #008080">67</span> <span style="COLOR: #000000">    bp.addString(</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">{log.servername}</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">) <br></span><span style="COLOR: #008080">68</span> <span style="COLOR: #000000">    bp.addString(record.name) <br></span><span style="COLOR: #008080">69</span> <span style="COLOR: #000000">    bp.addInt(record.levelno</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">1000</span><span style="COLOR: #000000">) <br></span><span style="COLOR: #008080">70</span> <span style="COLOR: #000000">    bp.addString(</span><span style="COLOR: #800000">""</span><span style="COLOR: #000000">)<br></span><span style="COLOR: #008080">71</span> <span style="COLOR: #000000">    bp.addString(record.msg)<br></span><span style="COLOR: #008080">72</span> <span style="COLOR: #000000">    bp.addString(str(record.threadName))<br></span><span style="COLOR: #008080">73</span> <span style="COLOR: #000000">    bp.addString(str(record.process))<br></span><span style="COLOR: #008080">74</span> <span style="COLOR: #000000">    bp.addInt( record.created ) <br></span><span style="COLOR: #008080">75</span> <span style="COLOR: #000000">    bp.addInt( record.msecs ) <br></span><span style="COLOR: #008080">76</span> <span style="COLOR: #000000">    bp.addString(record.filename)<br></span><span style="COLOR: #008080">77</span> <span style="COLOR: #000000">    bp.addInt( </span><span style="COLOR: #000000">1</span><span style="COLOR: #000000"> )     <br></span><span style="COLOR: #008080">78</span> <span style="COLOR: #000000">    <br></span><span style="COLOR: #008080">79</span> <span style="COLOR: #000000">    pkg </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> BufferPack()<br></span><span style="COLOR: #008080">80</span> <span style="COLOR: #000000">    pkg.addInt(len(bp.buffer), True) <br></span><span style="COLOR: #008080">81</span> <span style="COLOR: #000000">    pkg.addBuffer( bp ) <br></span><span style="COLOR: #008080">82</span> <span style="COLOR: #000000">    <br></span><span style="COLOR: #008080">83</span> <span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> pkg.buffer<br></span><span style="COLOR: #008080">84</span> <span style="COLOR: #000000"><br></span><span style="COLOR: #008080">85</span> <span style="COLOR: #000000"></span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> </span><span style="COLOR: #800080">__name__</span><span style="COLOR: #000000">==</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">__main__</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">:<br></span><span style="COLOR: #008080">86</span> <span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> logging, logging.handlers <br></span><span style="COLOR: #008080">87</span> <span style="COLOR: #000000">    <br></span><span style="COLOR: #008080">88</span> <span style="COLOR: #000000">    logger </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> logging.getLogger()<br></span><span style="COLOR: #008080">89</span> <span style="COLOR: #000000">    logging.handlers.SocketHandler.makePickle </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">lambda</span><span style="COLOR: #000000"> self,rc : PackMessage(rc) <br></span><span style="COLOR: #008080">90</span> <span style="COLOR: #000000">    <br></span><span style="COLOR: #008080">91</span> <span style="COLOR: #000000">    hdlr </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> logging.handlers.SocketHandler(</span><span style="COLOR: #800000">'</span><span style="COLOR: #800000">{logserver.ip}</span><span style="COLOR: #800000">'</span><span style="COLOR: #000000">, </span><span style="COLOR: #000000">8888</span><span style="COLOR: #000000">) <br></span><span style="COLOR: #008080">92</span> <span style="COLOR: #000000">    formatter </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> logging.Formatter(</span><span style="COLOR: #800000">'</span><span style="COLOR: #800000">%(asctime)s %(levelname)s %(message)s</span><span style="COLOR: #800000">'</span><span style="COLOR: #000000">)<br></span><span style="COLOR: #008080">93</span> <span style="COLOR: #000000">    hdlr.setFormatter(formatter)<br></span><span style="COLOR: #008080">94</span> <span style="COLOR: #000000">    logger.addHandler(hdlr)<br></span><span style="COLOR: #008080">95</span> <span style="COLOR: #000000">    logger.setLevel(logging.NOTSET)<br></span><span style="COLOR: #008080">96</span> <span style="COLOR: #000000">    <br></span><span style="COLOR: #008080">97</span> <span style="COLOR: #000000">    logger.info(</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">hello</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">)</span></div> <br>浣跨敤鐨勬椂鍊?<br>1. 鍦╨ogging 鍒涘緩SocketHandler 鐨勬椂鍊? 闇瑕佷慨鏀筶ogging.handlers.SocketHandler.makePickle 涓烘柟娉?PackMessage <br>logging.handlers.SocketHandler.makePickle = lambda self,rc : PackMessage(rc) <br><br>2. 闇瑕佷慨鏀逛唬鐮佷腑鐨勪袱閮ㄥ垎鍐呭 {log.servername} 鍜?{logserver.ip}<br> <img src ="http://www.shnenglu.com/bigsml/aggbug/69856.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/bigsml/" target="_blank">娉℃場鐗?/a> 2008-12-19 18:13 <a href="http://www.shnenglu.com/bigsml/archive/2008/12/19/69856.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>BHO鍩虹http://www.shnenglu.com/bigsml/archive/2008/12/04/68573.html娉℃場鐗?/dc:creator>娉℃場鐗?/author>Thu, 04 Dec 2008 09:26:00 GMThttp://www.shnenglu.com/bigsml/archive/2008/12/04/68573.htmlhttp://www.shnenglu.com/bigsml/comments/68573.htmlhttp://www.shnenglu.com/bigsml/archive/2008/12/04/68573.html#Feedback0http://www.shnenglu.com/bigsml/comments/commentRss/68573.htmlhttp://www.shnenglu.com/bigsml/services/trackbacks/68573.htmlBHO灝辨槸Browser Helper Object(嫻忚鍣ㄨ緟鍔╁璞?

BHO鍏寵仈鍘熺悊 (BHO鍏寵仈鐨勬槸SHDOCVW,涔熷氨鏄涓嶅彧鍏寵仈IE,涓嬮潰鍏ㄩ儴鐢↖E鏉ヨ鏄?
1.IE鐨勭獥鍙f墦寮鏃?鍏堝鎵綡KLM涓嬬殑SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Browser Helper Objects\ 閲岀殑CLSID,榪欎簺CLSID,閮藉搴旂潃鐩稿簲鐨凚HO鎻掍歡錛岀劧鍚庢牴鎹繖涓狢LSID鍒癏KCR涓嬬殑CLSIDs閲屾壘鍒版鎻掍歡鐨勪俊鎭紝鍖呮嫭鏂囦歡浣嶇疆絳夈?br>2.IE鏍規(guī)嵁鎵懼埌鐨凜LSID淇℃伅鍒涘緩 BHO 瀵硅薄,騫朵笖鏌ユ壘 IObjectWithSite 鎺ュ彛. (榪欎釜鎺ュ彛闈炲父綆鍗?鍙湁SetSite鍜孏etSite涓や釜鏂規(guī)硶)
3.IE鎶奍WebBrowser2(嫻忚鍣ㄦ彃浠?浼犲埌 BHO 鐨?SetSite 鏂規(guī)硶錛岀敤鎴峰湪姝ゆ柟娉曚腑鍙寕杞借嚜宸辯殑浜嬩歡澶勭悊鏂規(guī)硶銆?br>4.紿楀彛鍏抽棴鏃?IE鎶?null 浼犲埌 BHO 鐨?SetSite 鏂規(guī)硶錛屾鏂規(guī)硶鐢ㄦ潵鍘繪帀鎸傝澆鐨勪簨浠跺鐞嗘柟娉曘?/p>

緙栧啓BHO嫻佺▼
1.鍒涘緩IObjectWithSite鏄懼紡鎺ュ彛錛屽垱寤?COM 綾誨瀷錛屽疄鐜扮戶鎵縄ObjectWithSite鎺ュ彛
2.瀹炵幇姝ゆ帴鍙e茍鍦⊿etSite鏂規(guī)硶閲屽姞涓婃墍瑕佹寕杞界殑浜嬩歡
3.澶勭悊浜嬩歡
4.娉ㄥ唽姝HO鍒版敞鍐岃〃涓璈KLM涓嬬殑Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Browser Helper Objects;(HKCR涓嬬殑CLSIDs鏄牴鎹笂闈㈢殑璺緞鑷姩娉ㄥ唽鐨?
5銆?net 涓嬮』璁劇疆姝HO欏圭洰鐨?閰嶇疆灞炴>鐢熸垚 涓負Interop娉ㄥ唽涓篢rue錛岃繖鏍鋒墠鑳藉皢.net 綾誨簱鏂囦歡娉ㄥ唽鍒癈OM

鍒犻櫎BHO
鎵撳紑娉ㄥ唽琛ㄩ」鍒?HKLM涓嬬殑Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Browser Helper Objects 鍙互鐪嬪埌涓嬮潰鏈変竴浜汣LSID鍊?榪欎簺鍊煎搴旂浉鍏崇殑鎻掍歡,鐐瑰嚮鍙互鍦ㄩ粯璁ゅ煎悗鐪嬪埌鐩稿叧鎻掍歡鐨勫悕縐?鍙互澶嶅埗鐩稿叧CLSID鍒版敞鍐岃〃涓悳绱㈢浉鍏矯LSID,鎵懼埌鍚庢墦寮InprocServer32鍙互鐪嬪埌鐩稿叧鏂囦歡鐨勮礬寰?鑷充簬DLL鏂囦歡絳夊彲浠ョ敤UEDIT32.exe宸ュ叿鎵撳紑鏌ョ湅鍏蜂綋淇℃伅,褰撶劧涔熷彲浠ョ敤淇敼紼嬪簭綾葷殑eXeScope.exe鐮旂┒涓涓?
璇鋒牴鎹叿浣撴儏鍐靛垹闄ょ浉鍏抽敭鍊煎拰鐩稿叧鏂囦歡!

REF:
BHO 鐨勭紪鍐?nbsp;
VCKBase 鍏充簬IE 緙栫▼鏂囨。涓績
C++涓嬌鐢˙HO鏉ュ睆钄界壒瀹氱綉绔?/a>
嫻忚鍣ㄩ泦鎴愭暀瀛?鑷畾涔夋祻瑙堝櫒



]]>
娣卞叆鐞嗚ВEffictive C++ "鏉℃38: 鍐充笉瑕侀噸鏂板畾涔夌戶鎵胯屾潵鐨勭己鐪佸弬鏁板? http://www.shnenglu.com/bigsml/archive/2008/10/06/63327.html娉℃場鐗?/dc:creator>娉℃場鐗?/author>Mon, 06 Oct 2008 09:19:00 GMThttp://www.shnenglu.com/bigsml/archive/2008/10/06/63327.htmlhttp://www.shnenglu.com/bigsml/comments/63327.htmlhttp://www.shnenglu.com/bigsml/archive/2008/10/06/63327.html#Feedback1http://www.shnenglu.com/bigsml/comments/commentRss/63327.htmlhttp://www.shnenglu.com/bigsml/services/trackbacks/63327.html鐪嬫潯嬈?8 鐨勬椂鍊欎笉鏄緢鐞嗚В, 浜庢槸鍐欎簡涓祴璇曚唬鐮?

#include<iostream> 
using namespace std; 

class A{
public:
    
virtual void show(int a=145)
    {
        cout
<<"A: a="<<a<<endl; 
    }   
}; 

class B: public A 

public
    
void show(int b)
    { 
        cout
<<"B: b="<<b<<endl; 
    } 
}; 
class C: public B 

public
    
void show(int c=999)
    { 
        cout
<<"C: c="<<c<<endl; 
    } 
};
class D: public C 

public
    
void show()
    { 
        cout
<<"D:\n"
    }
}; 

void main() 
{
    A 
*pp;
    A a; 
    B b; 
    C c; 
    D d;
    
    a.show();
    pp 
= &a;    pp->show();

    
// b.show();  // error C2660: 'B::show' : function does not take 0 arguments
    pp = &b;    pp->show();
    
    c.show();
    pp 
= &c;    pp->show();

    d.show();
    pp 
= &d;    pp->show();
    
    C 
*pc= &d;
    pc
->show();

    system(
"pause"); 
}   
杈撳嚭緇撴灉鏄?br>
A: a=145
A: a=145
B: b=145
C: c=999
C: c=145
D:
C: c=145
C: c=999

鍥為【鏉℃ 
铏氬嚱鏁版槸鍔ㄦ佺粦瀹氳岀己鐪佸弬鏁板兼槸闈欐佺粦瀹氱殑.  涓轟粈涔圕++鍧氭寔榪欑鏈夎繚甯歌鐨勫仛娉曞憿錛熺瓟妗堝拰榪愯鏁堢巼鏈夊叧銆傚鏋滅己鐪佸弬鏁板艱鍔ㄦ佺粦瀹氾紝緙栬瘧鍣ㄥ氨蹇呴』鎯沖姙娉曚負铏氬嚱鏁板湪榪愯鏃剁‘瀹氬悎閫傜殑緙虹渷鍊鹼紝榪欏皢姣旂幇鍦ㄩ噰鐢ㄧ殑鍦ㄧ紪璇戦樁孌電‘瀹氱己鐪佸肩殑鏈哄埗鏇存參鏇村鏉傘傚仛鍑鴻繖縐嶉夋嫨鏄兂姹傚緱閫熷害涓婄殑鎻愰珮鍜屽疄鐜頒笂鐨勭畝渚匡紝鎵浠ュぇ瀹剁幇鍦ㄦ墠鑳芥劅鍙楀緱鍒扮▼搴忚繍琛岀殑楂樻晥錛?

鎵浠?
a. 闈欐佺粦瀹?.vs. 鍔ㄦ佺粦瀹?
A *pp = new B;
榪欓噷 pp 闈欐佺粦瀹氭槸 A* , 鑰屽姩鎬佺粦瀹氬嵈鏄?B*
B *pb = new B;
榪欓噷 pb 闈欐佺粦瀹氬拰鍔ㄦ佺粦瀹氭槸涓鏍風殑閮芥槸 B*

b. 緙虹渷鍊兼槸闈欐佺粦瀹氱殑, 鑰岄潪鍔ㄦ佺粦瀹?
鎵浠?
d.show() 杈撳嚭 D:  鍥犱負show 琚?D override

pp = &d;    pp->show();  
pp 琚姩鎬佺粦瀹氬埌D *, 浣嗘槸show 鐨勭己鐪佸煎嵈鏄疉* 鐨?145, 鎵浠ヨ緭鍑虹殑鏄?C: c=145, 鑰屼笉鏄?99 ( 鍑芥暟 show 琚獵 緇檕verride 浜? 

鑰?nbsp;C *pc = &d; pc->show() , pc 闈欐佺粦瀹氫負C*, 鑰屽姩鎬佺粦瀹氫負 D* , 鎵浠ヨ緭鍑虹殑鏄?C: c=999 , 999 鏄?C* 闈欐佺粦瀹氱殑緙虹渷鍊?

c. 鎵浠ヨ皟鐢╞.show 鐨勬椂鍊欏嚭鐜頒簡濡備笅鐨勯敊璇?
    // b.show();  // error C2660: 'B::show' : function does not take 0 arguments
鍥犱負 B* 娌℃湁闈欐佺粦瀹氱殑鍑芥暟

緇撹灝辨槸 鍐充笉瑕侀噸鏂板畾涔夌戶鎵胯屾潵鐨勭己鐪佸弬鏁板?nbsp;

ref: 
浠庤繖閲屽浜嗕笉灝?) http://bbs.chinaunix.net/viewthread.php?tid=439188 


]]>
灝忚IE 嫻忚鍣ˋctiveX 鎺т歡鍒涘緩榪囩▼http://www.shnenglu.com/bigsml/archive/2008/07/30/57550.html娉℃場鐗?/dc:creator>娉℃場鐗?/author>Wed, 30 Jul 2008 11:55:00 GMThttp://www.shnenglu.com/bigsml/archive/2008/07/30/57550.htmlhttp://www.shnenglu.com/bigsml/comments/57550.htmlhttp://www.shnenglu.com/bigsml/archive/2008/07/30/57550.html#Feedback2http://www.shnenglu.com/bigsml/comments/commentRss/57550.htmlhttp://www.shnenglu.com/bigsml/services/trackbacks/57550.html1. Activex 鎺т歡鏄庝箞瀹夎鐨?br>涓涓狧TML 涓祵鍏ユ帶浠剁殑渚嬪瓙

<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=7,0,19,0" width="400" height="300">
<param name="movie" value="flash/flash.swf">
<param name="quality" value="high">
<embed src="flash/flash.swf" quality="high" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" width="400" height="300"></embed>
</object>

褰撶敤IE 鎵撳紑榪欎釜欏甸潰鐨勬椂鍊? IE 棣栧厛鏍規(guī)嵁 classid 鍦ㄦ敞鍐岃〃涓?HKEY_CLASS_ROOT)鏌ユ壘鍏跺畨瑁呬俊鎭? 濡傛灉鏈壘鍒? 鍒橧E 鏍規(guī)嵁codebase 鍘葷湅鏄惁鏈夊搴旂殑鎺т歡瀛樺湪; 濡傛灉榪樻槸涓嶈, 鍒欎細涓浜涙帶浠舵敞鍐屾湇鍔″櫒鑱旂郴(鍒楄〃鍦?HKLM\Software\Microsoft\Windows\CurrentVersion\Internet Settings\CodeBaseSearchPath 鍙互鎵懼埌 ), 涓鑸槸 http://activex.microsoft.com/objects/ocget.dll , http://codecs.microsoft.com/isapi/ocget.dll  , 鐒跺悗鏈嶅姟鍣ㄤ細鍛婅瘔IE 浠庡摢閲屽幓涓嬭澆. 

FROM : http://oreilly.com/catalog/malmobcode/chapter/ch11.html


2. ActiveX 鎺т歡鏄浣曞惎鍔ㄧ殑
鍒涘緩涓涓帶浠舵湁寰堝縐嶆柟娉?
CoCreateInstance, CoGetInstanceFromFile, CoGetInstanceFromIStorage
CoCreateInstanceEx
CoGetClassObjectFromURL , CoGetClassObject 
CoGetObject, DllGetClassObject 絳?
鍩烘湰璋冪敤欏哄簭濂藉儚鏄?
(CoGetInstanceFromFile, CoGetInstanceFromIStorage ) -> CoCreateInstance
CoCreateInstanceEx
CoGetClassObjectFromURL -> CoGetClassObject 
鍏朵粬娌℃湁嫻嬭瘯榪?.. :9

IE 鍒涘緩鎺т歡鐨勬椂鍊欎細璋冪敤 CoGetClassObjectFromURL -> CoGetClassObject 鐨勯『搴忚繘琛? 鑰屼笉鏄洿鎺ヨ皟鐢?CoCreateInstance 鎴栬?CoCreateInstanceEx) , 浣嗘槸鍏嶄笉浜嗘帶浠朵細鑷繁璋冪敤 CoCreateInstanceEx, 姣斿Real 鎺т歡鍦ㄥ垱寤虹殑鏃跺欎細璋冪敤Dx 鐨勭粍浠剁瓑.



]]>
鑾峰彇IE (鎺т歡)鐨勬墍鏈夐摼鎺?鍖呮嫭F(xiàn)rameset, iframe) http://www.shnenglu.com/bigsml/archive/2008/07/30/57548.html娉℃場鐗?/dc:creator>娉℃場鐗?/author>Wed, 30 Jul 2008 11:17:00 GMThttp://www.shnenglu.com/bigsml/archive/2008/07/30/57548.htmlhttp://www.shnenglu.com/bigsml/comments/57548.htmlhttp://www.shnenglu.com/bigsml/archive/2008/07/30/57548.html#Feedback3http://www.shnenglu.com/bigsml/comments/commentRss/57548.htmlhttp://www.shnenglu.com/bigsml/services/trackbacks/57548.htmlIE 欏跺眰 body 鑺傜偣閫氳繃IHTMLElement->get_all 鏂規(guī)硶鏃犳硶鑾峰彇iframe 閲岄潰鐨勮妭鐐瑰垪琛?

CComPtr<IHTMLElement> body;
 
CComPtr
<IDispatch> spDispCollection;
body
->get_all(&spDispCollection);

鎵浠ヨ鑾峰彇iframe/frame(frameset) 閲岄潰鐨勮妭鐐瑰垪琛ㄧ殑璇? 鍒欓渶瑕佹牴鎹産ody/doc 鎵懼埌frames, 鐒跺悗浠巉rames -> IHTMLWindow2 -> IHTMLDocument2 . 涓昏鏈?涓柟娉? 涓嬮潰鏄唬鐮佺墖孌?
鏂規(guī)硶涓:
IHTMLDocument2 *pDoc = 嫻忚鍣ㄧ殑Document(IWebBrowser2->IDispatch->IHTMLDocument2); 
IHTMLWindow2 
*pHTMLWnd = NULL; 
IHTMLDocument2 
*pFrameDoc=NULL; 
IHTMLFramesCollection2 
*pFramesCollection=NULL; 
LPDISPATCH lpDispatch; 

long p; 
VARIANT varindex,varresult; 
varresult.vt
=VT_DISPATCH; 
varindex.vt 
= VT_I4; 
if(pDoc!=NULL) 

    HRESULT hr
=pDoc->get_frames(&pFramesCollection); 
    
if(SUCCEEDED(hr)&&pFramesCollection!=NULL) 
    { 
        hr
=pFramesCollection->get_length(&p); 
        
if(SUCCEEDED(hr)) 
            
for(int i=0; i<p; i++
            { 
                varindex.lVal 
= i; 
                
if(pFramesCollection->item(&varindex, &varresult) ==S_OK) 
                { 
                    lpDispatch
=(LPDISPATCH)varresult.ppdispVal; 
                    
if (SUCCEEDED(lpDispatch->QueryInterface(IID_IHTMLWindow2, (LPVOID *)&pHTMLWnd))) 
                    { 
                        
if(SUCCEEDED(pHTMLWnd->get_document( &pFrameDoc))) 
                        { 
                            
//work with the pFrameDoc 
                        } 
                        pHTMLWnd
->Release(); 
                        pHTMLWnd
=NULL; 
                    } 
                } 
            } 
            pFramesCollection
->Release(); 
    } 
    pDoc
->Release(); 
}

鏂規(guī)硶浜?
CComQIPtr<IHTMLElement> pElem = ; // 鍙互閫掑綊涓婇潰鐨?CComPtr<IDispatch> spDispCollection 鏉ュ緱鍒?
CComBSTR bstrTagName;
pElem
->get_tagName(&bstrTagName);
if ( lstrcmpiW(L"IFRAME", bstrTagName)==0 ||
        lstrcmpiW(L
"FRAME", bstrTagName)==0 )
{
    CComQIPtr
<IHTMLFrameBase2>    _framebase2;
    CComPtr
<IHTMLWindow2>        _framewindow;
    CComPtr
<IHTMLDocument2>        _framedoc;
    
    
if( (_framebase2 = spItem) 
        
&& SUCCEEDED( _framebase2->get_contentWindow(&_framewindow) ) && _framewindow!=NULL 
        
&& SUCCEEDED( _framewindow->get_document(&_framedoc) ) && _framedoc!=NULL )
    {
        
// 瀵?nbsp;_framedoc 鑺傜偣榪涜澶勭悊
    }
}


iframe 璺ㄥ煙璁塊棶(cross frame)  zz from : http://codecentrix.blogspot.com/2007/10/when-ihtmlwindow2getdocument-returns.html 
鐢變簬瀹夊叏鎬ч檺鍒? 涓洪槻姝㈣法鍩熻剼鏈敾鍑? 褰揻rames 璺ㄥ煙鐨勬椂鍊? IHTMLWindow2::get_document 璋冪敤灝嗚繑鍥?E_ACCESSDENIED .
涓嬮潰鍑芥暟 HtmlWindowToHtmlDocument  瀵逛簬璺ㄥ煙鐨刦rame 閫氳繃 IHTMLWindow2 -> IID_IWebBrowserApp -> IHTMLWindow2 緇曡繃浜嗛檺鍒?

// Converts a IHTMLWindow2 object to a IHTMLDocument2. Returns NULL in case of failure.
// It takes into account accessing the DOM across frames loaded from different domains.
CComQIPtr<IHTMLDocument2> HtmlWindowToHtmlDocument(CComQIPtr<IHTMLWindow2> spWindow)
{
     ATLASSERT(spWindow 
!= NULL);

     CComQIPtr
<IHTMLDocument2> spDocument;
     HRESULT hRes 
= spWindow->get_document(&spDocument);
    
     
if ((S_OK == hRes) && (spDocument != NULL))
     {
          
// The html document was properly retrieved.
          return spDocument;
     }

     
// hRes could be E_ACCESSDENIED that means a security restriction that
     
// prevents scripting across frames that loads documents from different internet domains.
     CComQIPtr<IWebBrowser2>  spBrws = HtmlWindowToHtmlWebBrowser(spWindow);
     
if (spBrws == NULL)
     {
          
return CComQIPtr<IHTMLDocument2>();
     }

     
// Get the document object from the IWebBrowser2 object.
     CComQIPtr<IDispatch> spDisp;
     hRes 
= spBrws->get_Document(&spDisp);
     spDocument 
= spDisp;

     
return spDocument;
}


// Converts a IHTMLWindow2 object to a IWebBrowser2. Returns NULL in case of failure.
CComQIPtr<IWebBrowser2> HtmlWindowToHtmlWebBrowser(CComQIPtr<IHTMLWindow2> spWindow)
{
     ATLASSERT(spWindow 
!= NULL);

     CComQIPtr
<IServiceProvider>  spServiceProvider = spWindow;
     
if (spServiceProvider == NULL)
     {
          
return CComQIPtr<IWebBrowser2>();
     }

     CComQIPtr
<IWebBrowser2> spWebBrws;
     HRESULT hRes 
= spServiceProvider->QueryService(IID_IWebBrowserApp, IID_IWebBrowser2, (void**)&spWebBrws);
     
if (hRes != S_OK)
     {
          
return CComQIPtr<IWebBrowser2>();
     }

     
return spWebBrws;
}


闄?
IE(鎺т歡/鎺ュ彛)涓富瑕佹湁4涓儴鍒? Browser, Document, Frame/IFrame, Element , 鍏跺搴旀帴鍙e垎鍒槸
Browser         -    IWebBrowser2
Document      -    IHTMLDocument2
Frame/IFrame-    IHTMLWindow2
Element         -    IHTMLElement
鍙互閫氳繃涓嬮潰鏂規(guī)硶浜掔浉鑾峰彇
browser      -> document        IWebBrowser2::get_Document
document     -> frame           IHTMLDocument2::get_parentWindow
frame        -> document        IHTMLWindow2::get_document
frame        -> parent frame    IHTMLWindow2::get_parent
frame        -> children frames IHTMLWindow2::get_frames
element     -> Frame             IHTMLElement->QI(IHTMLFrameBase2) -> IHTMLFrameBase2->get_contentWindow -> IHTMLWindow2

ref:
鍦ㄥFrame鐨勭綉欏典腑鎬庝箞鍙栧嚭鍚勪釜Frame鐨処HTMLDocument2鐨勬帴鍙o紒鎬ョ敤.(楂樺垎)
鍦ㄦ枃绔?When IHTMLWindow2::get_document returns E_ACCESSDENIED 瑙e喅浜唅frame 璺ㄥ煙璁塊棶鐨勯棶棰?



]]>
C/C++ 鐨勯澶勭悊鍙橀噺,瀹?鍜?棰勫畾涔夊畯http://www.shnenglu.com/bigsml/archive/2008/06/06/52363.html娉℃場鐗?/dc:creator>娉℃場鐗?/author>Fri, 06 Jun 2008 06:10:00 GMThttp://www.shnenglu.com/bigsml/archive/2008/06/06/52363.htmlhttp://www.shnenglu.com/bigsml/comments/52363.htmlhttp://www.shnenglu.com/bigsml/archive/2008/06/06/52363.html#Feedback0http://www.shnenglu.com/bigsml/comments/commentRss/52363.htmlhttp://www.shnenglu.com/bigsml/services/trackbacks/52363.html== 棰勫鐞嗘寚浠?Preprocessor Directives) ==


== 棰勫鐞嗘搷浣滅(Preprocessor Operators) ==
Stringizing operator (#)
Causes the corresponding actual argument to be enclosed in double quotation marks
灝嗗弬鏁板彉鎴愬瓧絎︿覆 : #x -> "x"

Charizing operator (#@)
Causes the corresponding argument to be enclosed in single quotation marks and to be treated as a character (Microsoft Specific)
灝嗗弬鏁板彉鎴愬瓧絎﹀彉閲?: #x -> 'x'

Token-pasting operator (##)
Allows tokens used as actual arguments to be concatenated to form other tokens
灝嗗弬鏁板拰鍓嶉潰鐨勭鍙風粨鍚?: token##x -> tokenx


== 棰勫畾涔夊畯(Predefined Macros) ==

__FILE__
__LINE__

#define LINE1(x) #x
#define LINE(x) LINE1(x)
#define TODO(msg)   message ( __FILE__ "(" LINE(__LINE__)  "): [TODO] " #msg )
#define NOTE(msg)   message ( __FILE__ "(" LINE(__LINE__)  "): [NOTE] " #msg )



]]>
zz 鑷畾涔夋祻瑙堝櫒鎺т歡 http://www.shnenglu.com/bigsml/archive/2008/04/18/47547.html娉℃場鐗?/dc:creator>娉℃場鐗?/author>Fri, 18 Apr 2008 14:29:00 GMThttp://www.shnenglu.com/bigsml/archive/2008/04/18/47547.htmlhttp://www.shnenglu.com/bigsml/comments/47547.htmlhttp://www.shnenglu.com/bigsml/archive/2008/04/18/47547.html#Feedback0http://www.shnenglu.com/bigsml/comments/commentRss/47547.htmlhttp://www.shnenglu.com/bigsml/services/trackbacks/47547.html鍚岃嚜鍔ㄥ寲嫻忚鍣紙http://blog.joycode.com/jiangsheng/archive/2005/10/20/65489.aspx錛夌浉姣旓紝鑷姩鍖栨祻瑙堝櫒鎺т歡(WebBrowser Control) 鍦ㄥ簲鐢ㄧ▼搴忎腑鏇村姞甯哥敤銆備粠Outlook鐨勯瑙堢獥鏍煎埌Maxthon榪欐牱鐨勫熀浜嶪E寮曟搸鐨勬祻瑙堝櫒錛屼粠鏃犵晫闈㈢殑HTML鍒嗘瀽鍣ㄥ埌Norton Antivirusd鐨勪富鐣岄潰錛屾祻瑙堝櫒鎺т歡鍦ㄤ紬澶氶鍩熻鐢ㄤ綔鍚勭鍚勬牱鐨勭敤閫斻傝繖涔熶嬌寰楁湁蹇呰鏍規(guī)嵁鍏蜂綋鐨勭敤鎴烽渶姹傝嚜瀹氫箟嫻忚鍣ㄦ帶浠剁殑琛屼負銆?/p>

鍦ㄥ簲鐢ㄧ▼搴忎腑鍔犲叆嫻忚鍣ㄦ帶浠?/h1>

闆嗘垚嫻忚鍣ㄦ帶浠剁殑鏈綆鍗曠殑鏂規(guī)硶鏄壘涓涓敮鎸丄ctiveX鐨勯泦鎴愬紑鍙戠幆澧冿紝鍦ㄥ伐鍏風涓姞鍏icrosoft Web Browser榪欎釜鎺т歡錛屽線琛ㄥ崟涓婃嫋涓涓繖涓帶浠跺氨鍙互瀹屾垚宸ヤ綔銆備綘鐢氳嚦鍙互鐢ㄩ泦鎴愬紑鍙戠幆澧冩坊鍔燗ctiveX鐨勪簨浠跺鐞嗗嚱鏁般傚鏋滆鐩存帴瀵煎叆ActiveX鐨勮瘽錛屽緩璁嬌鐢╩ehrcpp鐨剉bMHWB鎺т歡錛?a >http://www.codeproject.com/atl/vbmhwb.asp錛夈傝繖涓帶浠跺湪嫻忚鍣ㄦ帶浠剁殑鍩虹涓婅繘琛屼簡鎵╁睍錛屾毚闇蹭簡寰堝搴曞眰鎺ュ彛銆?/p>

閫氬父瀵煎叆ActiveX灝卞彲浠ユ弧瓚沖ぇ閮ㄥ垎闇姹?nbsp; 錛屼絾鏄湁浜涚被搴撲腑涔熼泦鎴愪簡嫻忚鍣ㄦ帶浠訛紝騫朵笖鎻愪緵浜嗘洿澶氱殑鍔熻兘錛屼緥濡侻FC鐨凜HTMLView鍜孋DHtmlDialog錛孉TL鐨凥TML Control錛屼互鍙?Net 2.0涓殑Windows.Forms.WebBrowser銆傚鏋滀嬌鐢╒isual C++鏉ヨ繘琛岄潪鎵樼緙栫▼錛岄偅涔堝緩璁嬌鐢∕FC鎴栬匒TL鐨勫皝瑁呯被錛屾垨鑰呬嬌鐢╲bMHWB鎺т歡銆傛墭綆$紪紼嬩腑褰撶劧棣栭塛indows.Forms.WebBrowser銆傞櫎闈炶繖浜涚被鐨凚UG褰卞搷鍒頒簡搴旂敤紼嬪簭鐨勫紑鍙戯紝鍚﹀垯寤鴻浣跨敤榪欎簺鍔熻兘鏇村姞寮哄ぇ鐨勫皝瑁呯被銆?/p>

鍦ㄤ嬌鐢ㄦ祻瑙堝櫒鎺т歡鍙婂叾灝佽綾葷殑鏃跺欒娉ㄦ剰涓浜涘凡鐭ラ棶棰?/p>

  • 鏈鍚庝竴涓寘鍚祻瑙堝櫒鐨勭獥鍙e叧闂椂浼氳瘽淇℃伅鍙兘浼氫涪澶憋紙http://support.microsoft.com/kb/311072錛?
  • MFC6.0鐗堟湰鐨凜HTMLView涓竴浜涙柟娉曟病鏈夐噴鏀捐幏寰楃殑BSTR瀛楃涓詫紝閫犳垚鍐呭瓨娉勬紡錛?a >http://support.microsoft.com/kb/241750錛夈?
  • MFC6.0鐗堟湰鐨凜HTMLView緙哄皯WS_CLIPCHILDREN椋庢牸錛屼嬌寰楀叾涓殑嫻忚鍣ㄦ帶浠墮噸鐢諱笉姝e父錛?a >http://support.microsoft.com/kb/220021錛?
  • Windows.Forms.WebBrowser鐨刉ebBrowserSite綾諱笉鑳介氳繃閲嶈澆鏉ヨ嚜瀹氫箟鍏惰涓猴紙https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=115198錛?

甯歌浠誨姟

鍦ㄩ泦鎴愭祻瑙堝櫒鎺т歡涔嬪悗錛屽彲浠ュ畬鎴愬熀鏈殑緗戦〉嫻忚錛屼絾鏄浜庝笉鍚岀殑浠誨姟錛屼篃闇瑕佽繘涓姝ョ殑澶勭悊錛屼緥濡傝緗帶浠剁殑灞炴с佷負鎺т歡娣誨姞浜嬩歡澶勭悊銆佹搷浣淗TML鏂囨。絳夌瓑銆?/p>

淇敼嫻忚鍣ㄦ帶浠剁殑灞炴?

榪欏湪闆嗘垚寮鍙戠幆澧冧腑鍙互寰堝鏄撳湴璁劇疆錛屼篃鍙互鑷繁瀹炵幇瀹瑰櫒鏉ヨ緗紝浣嗘槸CHTMLView榪欐牱鐨勫皝瑁呯被娌℃湁榪欎釜閫夐」錛?a >http://support.microsoft.com/kb/197921錛夈?/p>

  • 閾炬帴鐩爣瑙f瀽銆傚浜庣敤嫻忚鍣ㄦ帶浠舵潵鍋氭祻瑙堝櫒鐨勫満鍚堟潵璇達紝闇瑕佸皢嫻忚鍣ㄧ殑RegisterAsBrowser灞炴ц緗負true銆傝繖浣垮緱Internet Explorer鍦ㄨВ鏋怘TML閾炬帴鐨則arget灞炴ф寚瀹氱殑鐩爣紿楀彛鏃跺彲浠ユ壘鍒拌繖涓獥鍙c?
  • 紱佺敤鎷栨斁銆傚浜庝嬌鐢ㄦ祻瑙堝櫒鎺т歡鏉ュ仛棰勮紿楁牸鐨勫満鍚堟潵璇達紝闇瑕佸皢嫻忚鍣ㄧ殑RegisterAsDropTarget灞炴ц緗負false銆傝繖浣垮緱紿楀彛涓嶆帴鍙楁嫋榪涙潵鐨勬枃浠跺拰閾炬帴銆?
  • 紱佺敤娑堟伅妗嗐傚浜庣敤嫻忚鍣ㄦ帶浠舵潵鍋欻TML鍒嗘瀽鍣ㄧ殑鍦哄悎鏉ヨ錛屾湁鏃墮渶瑕佸睆钄借剼鏈駭鐢熺殑娑堟伅妗嗕互閬垮厤闃誨紼嬪簭榪愯銆傝繖鍙互閫氳繃璁劇疆嫻忚鍣ㄧ殑Silent灞炴ф潵瀹炵幇錛屾垨鑰呭疄鐜癐DocHostShowUI::ShowMessage銆?

鎹曡幏嫻忚鍣ㄦ帶浠剁殑浜嬩歡

闆嗘垚寮鍙戠幆澧冧腑鍙互涔熷緢瀹規(guī)槗鍦版坊鍔犳祻瑙堝櫒鐨勪簨浠跺鐞嗗嚱鏁般傛瘮杈冨父鐢ㄧ殑浜嬩歡鍖呮嫭

  • NewWindow2鎴栬匩ewWindow3浜嬩歡銆傞粯璁ゆ儏鍐典笅錛屾祻瑙堝櫒鎺т歡涓垱寤虹殑鏂扮獥鍙d細鏄竴涓狪nternet Explorer鐨勭獥鍙c傝繖閫氬父涓嶆槸棰勬湡鐨勮涓猴紝瀵逛簬嫻忚鍣ㄧ▼搴忔潵璇存洿鏄繖鏍楓傞渶瑕佸鐞嗘祻瑙堝櫒鐨凬ewWindow2鎴栬匩ewWindow3錛堝湪Windows XP SP2鎴栬匴indows 2003 SP1涔嬪悗鍙敤錛変簨浠舵潵璁╂柊鐨勬祻瑙堝櫒紿楀彛鍦ㄥ簲鐢ㄧ▼搴忔彁渚涚殑紿楀彛涓繍琛屻?
  • WindowClosing浜嬩歡銆傛祻瑙堝櫒鎺т歡闇瑕佸鐞哤indowClosing浜嬩歡鏉ュ湪嫻忚鍣ㄦ帶浠惰鑴氭湰鍏抽棴鏃跺叧闂祻瑙堝櫒鎺т歡鐨勫涓葷獥鍙o紙http://support.microsoft.com/kb/253219錛夈?
  • BeforeNavigate2浜嬩歡銆傚彲浠ュ湪鑷繁鐨勭綉欏典腑鍔犲叆鑷畾涔夌殑鍗忚錛屼箣鍚庡湪BeforeNavigate2浜嬩歡涓壂鎻廢RL鏉ヨ繘琛岀綉欏靛拰搴旂敤紼嬪簭涔嬮棿鐨勪氦浜掞紙http://www.microsoft.com/msj/0100/c/c0100.aspx錛夈傚綋鐒訛紝鑷畾涔夌殑緗戠粶鍗忚涔熷彲浠ョ敤Asynchronous Pluggable Protocol鏉ュ鐞?鍙傝http://support.microsoft.com/kb/303740)錛寁bMHWB鎺т歡灝卞疄鐜頒簡榪欎釜鍔熻兘銆備絾鏄洿鍔犲父鐢ㄧ殑鏄湪寮瑰嚭騫垮憡榪囨護鍣ㄧ▼搴忎腑鐢˙eforeNavigate2鏉ュ垽鏂湪NewWindow2浜嬩歡涓垱寤虹殑紿楀彛鏄惁闇瑕佸叧闂?

鎿嶄綔MSHTML鏂囨。

閫氬父HTML鍒嗘瀽鍜屾祻瑙堝櫒鑷姩鍖栫▼搴忛兘闇瑕佸垎鏋愮綉欏電殑緇撴瀯錛屾壘鍒伴渶瑕佹搷浣滅殑鍏冪礌銆傝繖闇瑕佸緗戦〉鐨勭粨鏋勮繘琛屽垎鏋愶紝鎵懼埌鐩爣鍏冪礌鐨勬爣璇嗘柟娉曘?涓浜涘父鐢ㄧ殑鎿嶄綔鍖呮嫭錛?

  • 璁劇疆HTML鍏冪礌鐨勫睘鎬э紝渚嬪html銆乻tyle銆乿alue絳夌瓑銆傛敞鎰忔湁浜涘睘鎬ф槸鍙鐨勶紝鐢氳嚦鏄▼搴忔棤娉曡闂殑錛堜緥濡俰nput鍏冪礌鍦ㄧ被鍨嬩負鏂囦歡鏃跺叾value灞炴т笉鍙闂級銆?
  • 鍒嗘瀽緗戦〉鐨勭粨鏋勬潵淇濆瓨緗戦〉鏁版嵁錛屼緥濡傛媶鍙朩eb 欏典竴鏂囦粙緇嶇殑鏂規(guī)錛?a >http://www.microsoft.com/china/msdn/Archives/workshop/scrape.asp錛?
  • 澶勭悊HTML鍏冪礌鐨勪簨浠躲傝繖闇瑕佸垎鏋愭祻瑙堝櫒鎺т歡涓殑MSHTML鏂囨。瀵硅薄錛屽畾浣嶈鎿嶄綔鐨勫厓绱狅紝浠ュ強鍦ㄥ厓绱犵殑榪炴帴鐐逛笂鎸傛帴鑷畾涔夌殑浜嬩歡澶勭悊紼嬪簭(http://msdn.microsoft.com/library/default.asp?url=/workshop/browser/mshtml/tutorials/sink.asp)銆?
  • 娣誨姞/鍒犻櫎HTML鍏冪礌銆傛敞鎰忚緗湁鏃惰緗畂utHtml灞炴у茍涓嶈兘姝g‘鍒涘緩鍏冪礌錛?a >http://support.microsoft.com/kb/185140錛夛紝涓涓殑鏂規(guī)硶鏄敤HTMLDocument瀵硅薄鐨凜reateElememt鏂規(guī)硶銆?
  • 璋冪敤HTML鍏冪礌鐨勬柟娉曪紝榪欏拰鍦ㄨ剼鏈腑鎿嶄綔HTML綾諱技銆傚彲鎿嶄綔鐨勫厓绱?鎺ュ彛鍙互鍙傝僆nterfaces and Scripting Objects錛?a >http://msdn.microsoft.com/library/default.asp?url=/workshop/browser/mshtml/reference/ifaces/interface.asp錛夛紝鎿嶄綔鏂規(guī)硶鍙互鍙傝僆ntroduction to Dynamic HTML錛?a >http://msdn.microsoft.com/library/default.asp?url=/workshop/browser/mshtml/reference/ifaces/interface.asp錛?
  • 浠ヤ笂鐨勫姛鑳介兘鍙互閫氳繃鐩存帴鍦ㄧ綉欏典腑鍔犲叆鑴氭湰瀹炵幇錛?a >http://support.microsoft.com/kb/185128錛夛紝鑰屼笖鑴氭湰涔熷彲浠ラ氳繃搴旂敤紼嬪簭瀹炵幇鐨勬墿灞曟帴鍙f潵鍜屽簲鐢ㄧ▼搴忔湰韜氦浜掋傚彟澶栵紝鑴氭湰榪樺彲浠ヨ鐢ㄦ潵鑷畾涔変竴浜涗簨浠訛紝渚嬪鍦ㄩ渶瑕侀噸杞借嚜瀹氫箟鐨凷howModalDialog鐨勬椂鍊欏氨鍙互鐢↖DispatchEx緇檞indow瀵硅薄娣誨姞涓涓睘鎬э紝鍏跺間負涓涓嚜瀹氫箟鐨凷howModalDialog鍑芥暟(http://groups.google.com/group/microsoft.public.inetsdk.programming.webbrowser_ctl/browse_thread/thread/e5eeb4a9111b16af/4bc2709aeb2bb444?lnk=raot)錛屼篃鍙互鐢ㄥ姞鍏ヨ剼鏈殑鍔炴硶鏉ユ崟鑾風綉欏典腑鐨勯敊璇紙http://support.microsoft.com/kb/317024錛夈?

 鍦ㄩ〉闈㈠寘鍚鏋剁殑鏃跺欙紝鍙兘闇瑕佽法妗嗘灦璁塊棶HTML鏂囨。銆傚彲浠ラ氳繃鏌ヨ妗嗘灦鍏冪礌鎵鏀寔鐨処WebBrowser2鎺ュ彛鎴栬匢HTMLWindow2鎺ュ彛鏉ヨ闂鏋朵腑鐨勬枃。锛http://support.microsoft.com/kb/196340錛夛紝浣嗘槸涔熸湁鍙兘鍥犱負瀹夊叏璁劇疆鑰屾棤娉曡闂?http://support.microsoft.com/kb/167796)銆?/p>

鍦ㄦ祻瑙堝櫒鎺т歡涓樉紺哄叾瀹冪被鍨嬬殑鏂囨。鏃訛紝鍙互鐢↖WebBrowser2鐨刣ocument灞炴ф潵璁塊棶ActiveX鏂囨。錛屼緥濡傚湪鏄劇ずMicrosoft Word鏃訛紝IWebBrowser2鐨刣ocument灞炴у氨鏄疻ord鐨勬枃。瀵硅薄锛屽湪鏄窘C烘枃浠跺す鐨勬椂鍊欙紝IWebBrowser2鐨刣ocument灞炴у氨鏄枃浠跺す瀵硅薄絳夌瓑銆?/p>

鎵╁睍嫻忚鍣ㄧ殑瀹夸富

嫻忚鍣ㄦ帶浠跺湪鍒涘緩鏃朵細鏌ヨActiveX瀹瑰櫒鐨処OleClientSite鐨勫疄鐜扮殑濡備笅鎺ュ彛錛?strong>IDocHostUIHandler, IDocHostUIHandler2 and IDocHostShowUI銆?/p>

铏界劧鍦ㄦ棤娉曡嚜瀹氫箟ActiveX瀹瑰櫒鐨勬儏鍐典笅鍙互鐢↖CustomDoc::SetUIHandler鏉ユ寕鎺DocHostUIHandler鍒版祻瑙堝櫒鎺т歡錛屼絾鏄繖鏍蜂篃浼氶犳垚鍐呭瓨娉勬紡錛?a >http://support.microsoft.com/kb/893629錛夈備竴浜涚被搴擄紝渚嬪MFC銆丄TL鍜?Net綾誨簱閮藉疄鐜頒簡IDocHostUIHandler鎺ュ彛銆?/p>

闄や簡涓撻棬鐢ㄤ簬嫻忚鍣ㄧ敤閫旂殑紼嬪簭涔嬪錛岄氬父閮介渶瑕佽嚜瀹氫箟嫻忚鍣ㄦ帶浠剁殑涓婁笅鏂囪彍鍗曘傝繖闇瑕佸疄鐜癐DocHostUIHandler::ShowContextMenu銆傞氬父鐨勫疄鐜板寘鎷畬鍏ㄧ鐢ㄤ笂涓嬫枃鑿滃崟銆佸畬鍏ㄦ浛鎹笂涓嬫枃鑿滃崟銆佷互鍙婁慨鏀歸儴鍒嗕笂涓嬫枃鑿滃崟銆傜粡甯歌浠庝笂涓嬫枃鑿滃崟涓Щ闄ょ殑鑿滃崟欏瑰寘鍚煡鐪嬫簮浠g爜銆佸埛鏂板拰灞炴с備竴縐嶆浛浠g殑鏂規(guī)鏄湪瀹瑰櫒涓繃婊ゅ彸閿秷鎭紙http://support.microsoft.com/kb/231578錛夈?/p>

涓庢祻瑙堝櫒鐩告瘮錛屼竴浜汭nternet Explorer鐨勫涓誨姛鑳藉湪嫻忚鍣ㄦ帶浠朵腑騫朵笉鏄粯璁ゅ惎鐢ㄣ傚湪鏌愪簺鍦哄悎錛岄粯璁ゅ惎鐢ㄧ殑瀹夸富鍔熻兘鍙兘騫墮潪棰勬湡銆傝繖鏃墮渶瑕佸疄鐜癐DocHostUIHandler::GetHostInfo銆傚彲浠ラ氳繃瀹炵幇IDocHostUIHandler::GetHostInfo鏉ヨ嚜瀹氫箟鐨勫姛鑳藉寘鎷細

  • 鑷姩瀹屾垚鍔熻兘銆傚浜庣敤嫻忚鍣ㄦ帶浠舵潵鍋氭祻瑙堝櫒鐨勫満鍚堟潵璇達紝榪欎釜鍔熻兘鏄湁蹇呰鍚敤鐨勩傚惎鐢ㄧ殑鏂規(guī)硶鏄緗瓺OCHOSTUIFLAG_ENABLE_FORMS_AUTOCOMPLETE浣?
  • 濡傛灉嫻忚鍣ㄤ腑鐨勯摼鎺ョ綉鍧鍖呭惈闈濧SCII鐨勫瓧絎︼紝閭d箞闇瑕佸疄鐜癐DocHostUIHandler::GetHostInfo錛屽茍涓斿湪榪斿洖鐨凞OCHOSTUIINFO緇撴瀯涓緗甦wFlags鎴愬憳鐨凞OCHOSTUIFLAG_URL_ENCODING_ENABLE_UTF8浣嶃傝繖浣垮緱緗戝潃浼氬湪鍙戦佷箣鍓嶇敤UTF-8緙栫爜銆?
  • 3D杈規(guī)銆佹粴鍔ㄦ潯錛岀鐢ㄦ枃瀛楅夋嫨鍔熻兘鍜岀鐢ㄩ〉闈笂鐨勮剼鏈?
  • 瀵逛簬浣跨敤嫻忚鍣ㄦ帶浠舵潵鍋欻TML緙栬緫鍣ㄧ殑鍦哄悎鏉ヨ錛屾湁鏃墮渶瑕佷慨鏀歸粯璁ょ殑欏甸潰鏍峰紡銆傝繖閮介渶瑕佸疄鐜癐DocHostUIHandler::GetHostInfo錛?a >http://support.microsoft.com/kb/328803錛夈傛敞鎰忓湪鏈変簺鐗堟湰鐨処E涓璉DocHostUIHandler::GetHostInfo鍙湪MSHTML琚垵濮嬪寲鐨勬椂鍊欒璋冪敤錛屾墍浠ュ鏋滀綘闇瑕佸湪MSHTML琚垵濮嬪寲涔嬪悗浣夸綘鐨勪慨鏀圭敓鏁堬紝浣犻渶瑕佹祻瑙堝埌涓涓猈ord涔嬬被鐨勯潪HTML Active document鏂囨。錛屼箣鍚庡啀嫻忚鍥炴潵銆?

鍦ㄤ嬌鐢ㄦ祻瑙堝櫒鎺т歡鏉ュ仛鏁版嵁褰曞叆鐣岄潰鐨勫満鍚堬紝闇瑕佹洿鏀規(guī)祻瑙堝櫒鎺т歡榛樿鐨凾ab閿鐞嗕嬌寰楃敤鎴峰彲浠ヤ嬌鐢═ab閿垏鎹㈠埌瀹瑰櫒涓殑鍏朵粬鎺т歡銆傝繖闇瑕佸疄鐜癐DocHostUIHandler::TranslateAccelerator鏉ヨ嚜瀹氫箟嫻忚鍣ㄦ帶浠剁殑蹇嵎閿鐞嗐傚浜嶮FC榪欐牱鐢ㄦ秷鎭挬瀛愭潵鍋氭秷鎭澶勭悊鐨勫彲鑷畾涔夊鍣ㄦ潵璇達紝涔熷彲浠ョ敤PreTranslateMessage鏉ヨ繃婊5閿洏娑堟伅錛岃屼笉鏄疄鐜癐DocHostUIHandler::TranslateAccelerator銆?

鍦ㄨ剼鏈腑璋冪敤搴旂敤紼嬪簭瀵規(guī)祻瑙堝櫒鎺т歡鐨勬墿灞曪紝榪欓渶瑕佸疄鐜癐DocHostUIHandler::GetExternal銆備嬌鐢?Net鐨刉ebBrowser鎺т歡鐨勮瘽璁劇疆ObjectForScripting灞炴у氨鍙互浜嗐?/p>

瀵逛簬鐢ㄦ祻瑙堝櫒鎺т歡鏉ュ仛HTML鍒嗘瀽鍣ㄧ殑鍦哄悎鏉ヨ錛屾湁鏃墮渶瑕佸睆钄借剼鏈駭鐢熺殑娑堟伅妗嗐傝繖闇瑕佸疄鐜癐DocHostShowUI::ShowMessage錛屾垨鑰呰緗祻瑙堝櫒鐨凷ilent灞炴с?/p>

鍙﹀錛屾祻瑙堝櫒涔熶細鏌ヨIOleClientSite鏉ヨ幏寰楀叾瀹冪殑鏈嶅姟淇℃伅錛屼緥濡?/p>

  • IOleCommandTarget錛屾煡璇㈡帶浠剁殑瀹瑰櫒鏄惁鎻愪緵鏇夸唬鐨勫懡浠ゅ鐞嗭紝瑙佹嫏浣淗ook DHTML Commands涓鏂囷紙http://blog.joycode.com/jiangsheng/archive/2005/07/09/58754.aspx錛?
  • IServiceProvider銆傛鎺ュ彛琚敤浜庢煡璇㈢敤鎴峰濡備笅鎺ュ彛鐨勫疄鐜幫細
    • IInternetSecurityManager 錛岀敤鎴峰彲瀹炵幇姝ゆ帴鍙f潵鑷畾涔夋祻瑙堝櫒鎺т歡鐨勫畨鍏ㄧ浉鍏抽夐」錛?a >http://msdn.microsoft.com/workshop/security/szone/overview/impl_secmanager.asp錛?
    • IDownloadMamanger 錛岀敤鎴峰彲瀹炵幇姝ゆ帴鍙f潵鑷畾涔夋祻瑙堝櫒鎺т歡鐨勪笅杞借繃紼?
    • IAuthenticate錛岀敤鎴峰彲瀹炵幇姝ゆ帴鍙f潵鑷畾涔変竴浜涚櫥褰曠晫闈紙http://support.microsoft.com/kb/329802錛?
    • INewWindowManager錛岀敤鎴峰彲瀹炵幇姝ゆ帴鍙f潵閲嶈澆Windows XP SP2鍜學indows 2003 SP1涓柊澧炵殑寮瑰嚭紿楀彛綆$悊鍣ㄧ殑琛屼負

鍏朵粬鎺у埗

瀵逛簬鐢ㄦ祻瑙堝櫒鎺т歡鏉ュ仛HTML鍒嗘瀽鍣ㄧ殑鍦哄悎鏉ヨ錛屾湁鏃墮渶瑕佺鐢ㄦ祻瑙堝櫒鐨勮剼鏈丄ctiveX鎴栬呭浘鐗囦笅杞姐傝繖鍙互閫氳繃鍦ㄥ鍣ㄤ腑瀹炵幇IDispatch錛屽鐞咲ISPID_AMBIENT_DLCONTROL鏉ュ仛鍒幫紙http://msdn.microsoft.com/library/default.asp?url=/workshop/browser/overview/Overview.asp錛夈?/p>

鐪嬫潵紱葷嚎嫻忚鐨勬帶鍒跺茍涓嶈兘鐢ㄨ繖縐嶆柟娉曟潵鎺у埗錛?a >http://support.microsoft.com/kb/247336錛夈備笉榪囦綘鍙互鑷繁緙栧啓涓涓狧TTP灞備紶閫?BINDF_OFFLINEOPERATION鏍囧織 錛?a >http://groups-beta.google.com/group/microsoft.public.inetsdk.programming.mshtml_hosting/msg/76bf4910a289d4b3錛?/p>

鍦ㄦ祻瑙堝櫒鎺т歡涓璲ava灝忕▼搴忓彲鑳戒笉鑳芥甯歌繍琛岋紝濡傛灉浣跨敤Sun JVM1.4涔嬪悗鐨勭増鏈紝鍙互鐢⊿etEnvironmentVariable 鏉ヨ緗甁AVA_PLUGIN_WEBCONTROL_ENABLE涓?鏉ュ惎鐢⊿un JVM銆?/p>

榛樿鎯呭喌涓嬪湪欏甸潰杞藉叆鏃朵細鏈夌偣鍑誨0銆傚睆钄界偣鍑誨0鐨勪竴涓柟娉曟槸鍦ㄧ▼搴忚繍琛屾椂淇敼娉ㄥ唽琛ㄩ敭錛?a >http://support.microsoft.com/kb/201901錛夛紝鍙︿竴涓柟娉曟槸灝嗘祻瑙堝櫒鎺т歡闅愯棌錛屽湪璋冪敤Navigate2涔嬪悗鍐嶆樉紺猴紝浣嗘槸榪欎篃闇瑕侀攣瀹氭帶浠剁殑鏇存柊鍖哄煙錛圠ockWindowUpdate錛変互閬垮厤闂儊銆傚湪IE7涓紝涔熷彲浠ヨ皟鐢?CoInternetSetFeatureEnabled鍑芥暟錛屼紶閫扚EATURE_DISABLE_NAVIGATION_SOUNDS鏉ョ鐢ㄦ祻瑙堟椂鐨勫0闊熾?/p>

鍦ㄩ渶瑕佷嬌鐢ㄤ唬鐞嗘湇鍔″櫒鏃訛紝鏈夊彲鑳介渶瑕佸湪搴旂敤紼嬪簭涓嬌鐢ㄩ潪榛樿鐨勪唬鐞嗘湇鍔″櫒璁劇疆銆傝繖鍙互閫氳繃璋冪敤UrlMkSetSessionOption鏉ュ疄鐜般?br>
Overriding IInternetSecurityManager in a CComControl class
CAxWindow implements IObjectWithSite interface (get it with QueryHost
method). Call SetSite passing your implementation of IServiceProvider.
At this point, AxWin will forward all QueryService calls from hosted
WebBrowser to your implementation.



]]>
ie 鏀誨嚮鐩戞祴http://www.shnenglu.com/bigsml/archive/2008/04/18/47528.html娉℃場鐗?/dc:creator>娉℃場鐗?/author>Fri, 18 Apr 2008 11:49:00 GMThttp://www.shnenglu.com/bigsml/archive/2008/04/18/47528.htmlhttp://www.shnenglu.com/bigsml/comments/47528.htmlhttp://www.shnenglu.com/bigsml/archive/2008/04/18/47528.html#Feedback1http://www.shnenglu.com/bigsml/comments/commentRss/47528.htmlhttp://www.shnenglu.com/bigsml/services/trackbacks/47528.html瀵筰e 鐨勬敾鍑誨垎濂藉嚑綾? 鏈変慨鏀逛富欏? 寮瑰嚭紿楀彛, 鎭舵剰鎻掍歡, 緗戦〉鏈ㄩ┈絳? 鍏朵腑涓浜涙槸鍒╃敤浜唅e 鐨勮剼鏈殑鑷甫鍔熻兘, 鑰屽彟澶栦竴浜涜瀵筰e 瀹炴柦鏀誨嚮鍚庢墠鑳藉仛鍒? 涓昏鎵嬫鏈夊埄鐢ㄧ涓夋柟杞歡婕忔礊, ie 鍫嗗柗灝勭瓑, 鏂囩珷 [ [JavaScript涓殑鍫嗛姘碷|[ http://www.team509.com/download/Heap%20Feng%20Shui%20in%20JavaScript_en_cn.htm ] ] 瀵瑰爢鍠峰皠榪涜浜嗕粙緇? 涓昏鏄埄鐢ㄨ鐩栧嚱鏁拌繑鍥炲湴鍧鎴栬呭璞$殑铏氬嚱鏁拌〃鏉ユ墽琛宻hellcode, 涓昏娑夊強鍒癷e & 緋葷粺鐨勫唴瀛樼鐞?
涓鑸瑂hellcode 鍩烘湰鍙畬鎴愭敾鍑誨姩浣? 鍏蜂綋鐨勫緋葷粺鐨勫悗緇敾鍑昏偗瀹氱涓嶄簡涓嬭澆鎵ц exe 鏂囦歡絳夊姩浣? 騫朵笖鍦ㄦ敾鍑籭e 涔熶細鏈夊悇縐嶇棁鐘? 鍙互鏍規(guī)嵁榪欎簺鍩烘湰瀹炵幇鎭舵剰浠g爜.

1. 鏍規(guī)嵁ie 鐥囩姸
褰搃e 璁塊棶鎭舵剰欏甸潰鐨勯伃鍙楁敾鍑繪椂, 鍏墮噸瑕佽〃鐜版槸
a. 鍐呭瓨浣跨敤
b. cpu 浣跨敤鐜?br>鎵浠ュ疄鏃剁洃嫻嬭繖浜涘弬鏁板彲浠ュ熀鏈垽鏂槸鍚︽湁鏀誨嚮


2. 鏍規(guī)嵁琛屼負
shellcode 濡傛灉琚墽琛? 閭d箞鑲畾浼氳繘琛屾湪椹笅杞芥墽琛岀瓑姝ラ. 涓鑸函shellcode 閲岄潰鐨勫唴瀹逛笉浼氬緢澶? 鎵浠ヤ笉鍙兘瀹屾垚寰堝澶嶆潅鐨勬敾鍑?
win32 鍒涘緩榪涚▼鐨凙PI璋冪敤涓叉槸:
WinExec/ShellExecuteA/CreateProcessA->CreateProcessInternalA->CreateProcessInternalW->ZwCreateProcessEx
鎴?br>CreateProcessW->CreateProcessInternalW->ZwCreateProcessEx

win32 瑕佹墽琛屼笅杞界殑API 涓昏鏄痺sock32.dll 鐨?
recv , recvfrom

鎵浠ュ涓婅堪API 榪涜鎷︽埅, 涓鑸彲浠ユ嫻嬪埌鏄惁鏈塱e 鏄惁琚敾鍑? 浣嗘槸榪欎釜鍙兘鍦ㄦ敾鍑繪垚鍔熷悗, shellcode 鎵ц鍚庢墠鑳借媯嫻嬪埌

3.
鎷︽埅涓浜涙搷浣滄敞鍐岃〃, 鍒涘緩紿楀彛絳堿PI , 鍙互鍋氬埌闃叉琚慨鏀逛富欏? 寮瑰嚭紿楀彛絳?

 

鍒╃敤ms 鐨凞etours 鍙互寰堝鏄撶殑瀹炵幇瀵圭郴緇?API 鐨刪ook
http://blog.csdn.net/hu0406/archive/2008/03/05/2150358.aspx
http://blog.csdn.net/hu0406/archive/2008/03/05/2150351.aspx
http://www.moon-soft.com/doc/2288.htm
http://blog.csdn.net/dedodong/archive/2006/10/07/1323925.aspx

[ [JavaScript涓殑鍫嗛姘碷|[ http://www.team509.com/download/Heap%20Feng%20Shui%20in%20JavaScript_en_cn.htm ] ] ie 鍫嗗柗灝?

[ [涔熻亰inline-hook]|[ http://blog.tom.com/tigerkings941220/article/9211.html ] ] 浠嬬粛浜?榪涚▼鑷韓淇濇姢(閫氳繃鎷︽埅LoadLibraryW)鍜孖E婕忔礊闃叉姢(閫氳繃鎷︽埅CreateProcessInternalW)

[ [maxthon2(閬ㄦ父2) mxsafe.dll瀵圭綉欏墊湪椹殑闃叉姢浠ュ強緇曡繃]|[ http://hi.baidu.com/54nop/blog/item/b52cff6e713964d980cb4a9e.html ] ] 璁ㄨ浜唌axthon2 闃叉緗戦〉鏈ㄩ┈鐨勭瓥鐣? 鎷︽埅 ZwCreateProcessEx/ZwCreateProcess, ZwWriteVirtualMemory, LoadLibraryExW, CreateProcessInternalW )浠ュ強瀵規(guī)姉絳栫暐, 鍏跺疄榪欎釜鍙槸hook & unhook 鐨勬父鎴忎簡..

[ [灝忚PE鐥呮瘨鎶鏈痌|[ http://blog.vckbase.com/windowssky/archive/2007/04/17.html ] ] 浠嬬粛浜?pe 鐥呮瘨 & win32 榪涚▼鍔犺澆鍐呴儴

[ [360瀹夊叏鍗+紼嬪簭鍛樺織鎰胯匽|[ http://blog.csdn.net/dedodong/archive/2006/10/07/1323925.aspx ] ] 閫氳繃鎷︽埅 NtCreateProcessEx/NtCreateProcess 瀹炵幇浜?""緙栧啓涓涓▼搴忥紝鍦ㄦ紼嬪簭涓繍琛宎.exe錛屽茍浣垮緱a.exe璁や負鏄敱explorer.exe榪愯瀹冪殑"""

[ [闃誨嚮鎭舵剰杞歡--娓呴櫎鍜屼繚鎶や綘鐨勭綉绔欑殑灝忔妧宸|[ http://www.googlechinawebmaster.com/labels/badware.html ] ] google 涓婄殑瀵規(guī)伓鎰忚蔣浠?badware) 鐨勪粙緇?

[ [StopBadware Blog]|[ http://blogs.stopbadware.org/articles/2007/11 ] ]


 



]]>
Windows Winnet 瀹炵幇HTTP 鏂囦歡鏂偣緇紶涓嬭澆http://www.shnenglu.com/bigsml/archive/2008/04/17/47449.html娉℃場鐗?/dc:creator>娉℃場鐗?/author>Thu, 17 Apr 2008 15:01:00 GMThttp://www.shnenglu.com/bigsml/archive/2008/04/17/47449.htmlhttp://www.shnenglu.com/bigsml/comments/47449.htmlhttp://www.shnenglu.com/bigsml/archive/2008/04/17/47449.html#Feedback0http://www.shnenglu.com/bigsml/comments/commentRss/47449.htmlhttp://www.shnenglu.com/bigsml/services/trackbacks/47449.html1. MFC 涓嬭澆鏂囦歡

鏈?縐嶆柟娉?
a)
鍒涘緩CInternetSession 瀵硅薄 -> 璋冪敤 CInternetSession::OpenURL 璇ュ嚱鏁拌В鏋怳RL錛岀劧鍚庢墦寮涓嶶RL鎸囧畾鐨勬湇鍔″櫒榪炴帴錛屽悓鏃惰繑鍥炰竴涓彧璇葷殑CInternetFile瀵硅薄 -> CInternetFile::Read 璇誨彇鏂囦歡 -> 鏋愭瀯CInternetSession

b)
鍒涘緩CInternetSession 瀵硅薄 -> 璋冪敤 CInternetSession::GetHttpConnection
榪斿洖CHttpConnection 瀵硅薄 -> 璋冪敤CHttpConnection::OpenRequest 鍒涘緩涓涓狢HttpFile瀵硅薄 -> CHttpFile::SendRequest 鍙戦佽繛鎺ヨ姹?-> CHttpFile::QueryInfo 鑾峰彇HTTP 淇℃伅(姣斿鏂囦歡澶у皬, ETAG絳? | CInternetFile::Read 璇誨彇鏂囦歡 ->  鏋愭瀯CInternetSession

鍦ㄤ笂榪拌繃紼嬩腑, 濡傛灉鍑虹幇閿欒浼氭姏鍑?CInternetException 寮傚父
鍙﹀鍦ㄦ墦寮閾炬帴鍓? 鍙互榪涜濡備笅璁劇疆
CInternetSession::SetOption    璇誨彇鎴栬緗?InternetQuery 閫夐」 (濡傝秴鏃舵垨閲嶈瘯嬈℃暟錛?br>CInternetSession::EnableStatusCallback 璁劇疆鍥炶皟鍑芥暟鐩戣session鐘舵?br>CHttpFile::AddRequestHeaders   璁劇疆HTTP 璇鋒眰澶?闇瑕佸湪CHttpFile::SendRequest 鍓嶈皟鐢?


2. 瀹炵幇鏂偣緇紶
鏂偣緇紶鍏跺疄鏄氳繃鍦℉TTP 璇鋒眰澶翠腑璁劇疆瑕佷笅杞界殑鏂囦歡鍖洪棿鏉ュ疄鐜? 涓涓吀鍨嬬殑HTTP 璇鋒眰澶存槸

  GEThttp://class/download.microtool.de:80/somedata.exe 
  Host:download.microtool.de
  Accept:*/*
  Pragma:no-cache
  Cache-Control:no-cache
  Referer:http://class/download.microtool.de/
  User-Agent:Mozilla/4.04[en](Win95;I;Nav)
  Range:bytes=554554-
 
娉ㄦ剰鏈鍚庝竴琛岋細Range:bytes=554554-錛屾牸寮忎負:Range: bytes=璧峰浣嶇疆 - 緇堟浣嶇疆錛屼篃灝辨槸璇達紝鎴戜滑鍙互閫氳繃璁劇疆Http璇鋒眰澶寸殑璁劇疆璧峰緇撴潫浣嶇疆錛屾潵鑾峰彇HTTP鏂囦歡鐨勬煇涓閮ㄥ垎銆?


3. Win32 WinInet API 瀹炵幇
鍜孧FC 鐨勫嚱鏁板搴? 鎵ц涓嬭澆鎿嶄綔澶ц嚧闇瑕佺殑鍑芥暟鏈夛細

InternetOpen鏄渶鍏堣皟鐢ㄧ殑鍑芥暟錛屽畠榪斿洖HINTERNET鍙ユ焺錛屼範鎯畾涔変負hSession錛屽嵆浼氳瘽鍙ユ焺, 鐩稿綋浜嶤InternetSession
InternetConnect浣跨敤hSession鍙ユ焺錛岃繑鍥炵殑鏄痟ttp榪炴帴鍙ユ焺錛屽畾涔変負hConnect, 鐩稿綋浜?CInternetSession::GetHttpConnection
HttpOpenRequest浣跨敤hConnect鍙ユ焺錛岃繑鍥炵殑鍙ユ焺鏄痟ttp璇鋒眰鍙ユ焺錛屽畾涔変負hRequest, 鐩稿綋浜?CHttpConnection::OpenRequest
HttpSendRequest(鐩稿綋浜?CHttpFile::SendRequest)銆丠ttpQueryInfo銆両nternetSetFilePointer鍜孖nternetReadFile閮戒嬌鐢℉ttpOpenRequest榪斿洖鐨勫彞鏌勶紝鍗砲Request銆?/p>

CInternetSession::OpenURL 鐩稿綋浜庡疄鐜頒簡 InternetConnect & HttpOpenRequest & HttpSendRequest 3涓嚱鏁?

褰撹繖鍑犱釜鍙ユ焺涓嶅啀浣跨敤鏃訛紝搴旇鐢ㄥ嚱鏁癐nternetCloseHandle鎶婂畠鍏抽棴錛屼互閲婃斁鍏跺崰鐢ㄧ殑璧勬簮銆?


鐢╓inInet寮鍙慖nternet瀹㈡埛绔簲鐢ㄦ寚鍗楋紙涓錛?/a>  http://www.vckbase.com/document/viewdoc/?id=545
鐢╓inInet寮鍙慖nternet瀹㈡埛绔簲鐢ㄦ寚鍗楋紙浜岋級 http://www.vckbase.com/document/viewdoc/?id=546
浣跨敤 CInternetSession 灝佽澶氱嚎紼?http 鏂囦歡涓嬭澆 http://www.vckbase.com/document/viewdoc/?id=1693
Http涓嬭澆鐨勬柇鐐圭畫浼?/a>       http://sunyan331.spaces.live.com/blog/cns!89B9F8BF2575E281!947.entry
HTTP鏈嶅姟鍣ㄤ笂鏂偣涓嬭澆鏂囦歡(閲岄潰鏈夊緢涓嶉敊鐨勬簮鐮?      http://www.cnitblog.com/wangk/archive/2007/05/22/5942.html
緙栧啓鏂偣緇紶鍜屽綰跨▼涓嬭澆(鏈夋簮鐮?   http://www.bbbh.org/20060427/2620/
WinInet: implementing resuming feature  http://www.clevercomponents.com/articles/article015/resuming.asp
(寰堣緇嗙殑涓涓唬鐮佽В閲?Retrieving a file via. HTTP  http://www.codeproject.com/KB/IP/getwebfile.aspx 



]]>
MSNP鍗忚鐨勯氫俊榪囩▼[En] http://www.shnenglu.com/bigsml/archive/2008/03/23/45178.html娉℃場鐗?/dc:creator>娉℃場鐗?/author>Sun, 23 Mar 2008 05:13:00 GMThttp://www.shnenglu.com/bigsml/archive/2008/03/23/45178.htmlhttp://www.shnenglu.com/bigsml/comments/45178.htmlhttp://www.shnenglu.com/bigsml/archive/2008/03/23/45178.html#Feedback0http://www.shnenglu.com/bigsml/comments/commentRss/45178.htmlhttp://www.shnenglu.com/bigsml/services/trackbacks/45178.htmlYou have been using MSN for quite some time wondering how it works. Well You need not look any further. This article will not just tell you how MSN works but will also tell you how to make your own version of MSN messenger. You can download a sample application from here MSN Clone .Let's get ready to rumble!!!!

 

We can split up the working of MSN messenger into 2 phases

  • Authentication Phase

  • Instant Messaging Phase

The Authentication Phase involves logging into the MSN messenger server and also (friends) list retrieval in this case.

The Instant Messaging Phase involves sending/accepting requests for an Instant Messaging session and also sending/receiving messages.

 

The MSN messenger protocol is an ASCII based protocol. In other words the commands are in pure English !!!.The first phase involves connecting to an MSN messenger server .In this case we shall connect to the server 64.4.13.58 on port 1863(MSN messenger works through port 1863).

Once the connection is done we need to start the log in process. The first stage in this phase is the versioning stage. In this stage the client (in this case your app) lists/sends the versions that it can support to the server and waits for the server to respond.

VER 0 MSNP7 MSNP6 MSNP5 MSNP4 CVRO

In the MSN messenger protocol a "trial id" is sent along with every command. The trial id starts from 0 and is incremented every time the server responds successfully to the client's commands.

 

The server responds like this

VER 0 MSNP7 MSNP6 MSNP5 MSNP4

The Client and the server have agreed on a version in which they will communicate.

 

Next the client sends a request to the server asking it for the name of the security package it supports for authentication.

INF 1

Unlike Yahoo, Rediff and a few other Messengers MSN does not actually send the password as it is.It encrypts the password while sending it ensuring that your password will not be leaked out easily if somebody monitors your port.

 

The server responds with this

INF 1 MD5

Here MD5 is the name of the security package which the server currently supports.

Next the client sends the userid to the server

 

USR 2  MD5  I  venky_dude@hotmail.com

Here the server does a check whether it contains all the relevant details about the user for authentication .If it does not then it sends the following reply

 XFR 2  NS 64.4.13.55:1863  0

What the server says is that the client should connect to the Notification Server(NS) on 64.4.13.55 on port 1863. We close the current connection and repeat the  steps while being connected to the new server i.e  64.4.13.55

  • (client)   VER 3 MSNP7 MSNP6 MSNP5 MSNP4 CVRO

  • (server) VER 3 MSNP7 MSNP6 MSNP5 MSNP4 

  • (client)   INF  4

  • (server) INF  4  MD5

  • (client)  USR  5  MD5 I venky_dude@hotmail.com

Now the server to which we are connected to has the relevant information about the user trying to log in. The server replies this way

USR 5  MD5  S 989048851.1851137130

 The string which is sent by the server is the " MD5 Hash". It is a hash generated by the server and is used in the authentication process. The client then has to send the password which is encrypted using the MD5 algorithm.In effect the client has to send the unique MD5 equivalent of the MD5 hash i.e 989048851.1851137130 in this case and the password combined .i.e. MD5 equivalent of (hash+pass). In this case it turns out to be 3b7926d277068ec49576a0c40598ff21.

USR 6 MD5 S 3b7926d277068ec49576a0c40598ff21

If the password is right then the server replies with this

USR 6 OK venky_dude@hotmail.com venkat

Here the last word is the nickname/name by which the user is known.

In the new version of the protocol (MSNP7) the server sends additional data like some general information about the user and a authentication code something similar to a cookie which can be used for various other functions.

 

MSG Hotmai Hotmail 362
MIME-Version: 1.0
Content-Type: text/x-msmsgspro file; charset=UT
LoginTime: 1011252477
EmailEnabled: 1
MemberIdHigh: 84736
MemberIdLow: - 1434729391
lang _preference: 103
preferredEmai l: venky_dude@hotmail.com
country: IN
PostalCode:
Gender: M
Kid:0
Age: 22
sid: 517
kv: 2
MSPAuth: 2AAAAAAAADU0p4uxxxJtDJozJSlUTS0i7YpwnC9PUHRv56YKxxxCTWmg$$

Now we are logged into the server but our status is still offline. We need to change our status to online in order to send and receive messages. The client does this in the following way

CHG 7 NLN

The server replies with friends who are online and in various states.

CHG 7 NLN

ILN 7 NLN btxxxe@hotmail.com nick
ILN 7 AWY wmpyxxx@msn.com mike
ILN 7 BSY tehpxxpxx@hotmail.com yeaxxx

MSG Hotmail Hotmail 223
MIME-Version: 1.0
Content-Type: text/x-msmsgsinitialemailnotification; charset=UTF-8

Inbox-Unread: 293
Folders-Unread: 0
Inbox-URL: /cgi-bin/HoTMaiL
Folders-URL: /cgi-bin/folders
Post-URL: http://www.hotmail.com

 

The next command to be sent to the server pertains to the version of the client currently being used.The client send to the server it's version number and also information about the machine like the OS and the build.

CVR 8 0x0409 win 4.10 i386 MSMSGS 4.5.0127 MSMSGS

Here 0x409 win 4.10 i386 specifies that the client is running win98 on a intel microprocessor, and MSMSGS 4.5.0127 MSMSGS here specifies the version and build no of msmsgs.exe (basically the version no of MSN messenger).

The server responds with the url to download the latest version and some other info

CVR 8 4.5.0127 4.5.0127 1.0.0863 http://download.microsoft.com/download/msnmessenger/install/4.5/win98me/en-us/mmssetup.exe http://messenger.microsoft.com

 

It is not necesarry to send the CVR command, the messenger protocol will function properly regardless of this command being sent

 

To get a list of people who are in our friends list we may send this command

LST 9 RL

On sending this command the server will reply by sending the reverse list .The reverse list is basically a list of users who can see you when you are online and send you a message.You could alternatively also request for the forward list by sending LST 9 FL .The forward list contains a list of all users whom the user has added to his/her list.

The server responds this way

LST 9 RL 69 1 19 venky_dude@hotmail.com venkat
LST 9 RL 69 2 19 puxxxxx@hotmail.com PUJA
LST 9 RL 69 3 19 vancxxxxx@hotmail.com ramachandran
LST 9 RL 69 4 19 moxxxxx@hotmail.com chandramouli
LST 9 RL 69 5 19 v_n_xxxxx@hotmail.com Narayanaswamy
LST 9 RL 69 6 19 dexxxxx@hotmail.com Venkatesh
LST 9 RL 69 7 19 lousydxxxxx@hotmail.com deepika%20kalyani%20Vairam                                                  LST 9 RL 69 8 19 hexxxxxr@hotmail.com Hetchar%20Ramachandran
LST 9 RL 69 9 19 ambxxxxx@hotmail.com Aiyer
LST 9 RL 69 10 19 suxxx@hotmail.com Ganesh
LST 9 RL 69 11 19 deexxxxx@hotmail.com Deepak
LST 9 RL 69 12 19 anilxxxxx@hotmail.com anil
LST 9 RL 69 13 19 dixxxxx@hotmail.com <Diamond>
LST 9 RL 69 14 19 nvxxxx@hotmail.com giri
LST 9 RL 69 15 19 shxxx@hotmail.com Hari
LST 9 RL 69 16 19 radhikashuxxxxx@hotmail.com radhika
LST 9 RL 69 17 19 eskaxxxxx@hotmail.com kannan
LST 9 RL 69 18 19 shaxxxxx@hotmail.com Shankar
LST 9 RL 69 19 19 puneetagarxxxxx@hotmail.com puneet

 

 

*Every time a friend comes online the server(NS) sends us the following command

NLN 10NLN deaxxxx@hotmail.com Venkatesh

and when the friend goes offline the server sends us this

FLN 10 FLN deaxxxx@hotmail.com

With the MSNP7 protocol msn has introduced a new challenege authentication mechanism. The MSN server sends t a challenge key which the user has to authenticate succesfully in order for the session to continue.

CHL 0 20881396011366812350

 

The client has to send the md5 equivalent of this string which is formed by appending this hash with the string "Q1P7W2E4J9R8U3S5".So the final string which will be sent to the server will be the md5 equivalent of 20881396011366812350Q1P7W2E4J9R8U3S5

i.e MD5string(20881396011366812350Q1P7W2E4J9R8U3S5 )

So the client response would be something like this

QRY 18 msmsgs@msnmsgr.com 32
0212eaad0876afb8505859ca75d21a78

Here 18 is the trial id .Replace it by the appropriate trial id in your program .

The server will respond in the following way if the authentication is right

QRY 18

We have successfully logged into the MSN Messenger server. The Instant Messaging phase is next.






Instant Messaging in MSN Messenger is session based . The people in between whom the conversation is going to take place have to be in a session mode. We cannot send/receive messages unless we start a chat session with a user. 

There are basically two methods in  which a user can be in a chat session                                                           

  • User sends a chat session request to another user
  • User receives a chat session request from another user

 

User sends a chat session request

 

The client(user) sends a command to the server asking it for the address of the SwitchBoard(SB) server. All instant messaging conversation take place via the switchboard server.

XFR 9 SB

The server(SB) replies back with the ip address of the switchboard server(SB),the port on which to connect and a CKI hash. CKI is a security package and the client has to use the hash to connect to the switchboard server.

 XFR 9 SB 64.4.13.88:1863 CKI 989487642.2070896604     

Now we have to make another  new connection this time to the switchboard server. Our previous connection to the MSN messenger server  must be kept as it is. If we lose connection with that server we would log out.

After we have connected to the switchboard server(SB) we send the following command to the switchboard server.

USR 1 venky_dude@hotmail.com  989487642.2070896604  

If the CKI hash sent by us is right the server(SB) responds back with this

USR 1 OK venky_dude@hotmail.com venkat

After this has been done the user has to "Call" the other user to the chat session. This is done by sending the following command.

CAL 2 deadxxx@hotmail.com 

The server replies back with the a session id which it will pass on to the other user

CAL 2 RINGING 11717653

When the other user replies and is ready for a chat the server(SB) sends us this command

JOI deadlee@hotmail.com Venkatesh

This indicates that the other user has joined in the conversation and we are now ready to send and receive messages.

 

User receives a chat session request

When we are being invited to a chat session by a user the server(NS) send us the following message.

 

RNG 11742066 64.4.13.74:1863 CKI 989495494.750408580 deaxxxx@hotmail.com Venkatesh

Here the server(NS) sends us the session id ,the ip address of the SwitchBoard server to connect to,the port on which to connect to ,the CKI hash and the user trying to start a conversation with us.

Now we have to make another  new connection this time to the switchboard server. Our previous connection to the MSN messenger server  must be kept as it is. If we loose connection with that server we would log out.

We  connect to the switchboard server and send the following command

ANS 1 venky_dude@hotmail.com 989495494.750408580 11742066

Here we send our login name ,the CKI hash that was sent to us and the session Id that was sent to us

The server responds back with 

IRO 1 1 1 deaxxxx@hotmail.com Venkatesh

and

ANS 1 OK

We are now ready to send and receive messages.

 

Before sending/receiving messages let us see how the message is constructed.

When we are sending a message we build the header information  in the following way

MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
X-MMS-IM-Format: FN=Microsoft%20Sans%20Serif; EF=; CO=0; CS=0; PF=22

While sending a message we send it this way

MSG  2  N 137                                                                                                                                                            MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
X-MMS-IM-Format: FN=Microsoft%20Sans%20Serif; EF=; CO=0; CS=0; PF=22

hello

Here 2 is the trial id which has to incremented each time we send a message. 137 is the total length of the message i.e length of the header and length of the actual message that we are sending in this case it is 'hello'.

 While receiving the message it is more or less similar

Here is an example of a message received

MSG deaxxxx@hotmail.com Venkatesh 137
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
X-MMS-IM-Format: FN=Microsoft%20Sans%20Serif; EF=; CO=0; CS=0; PF=22

hello

 

When the other user is typing a message we receive the foll message

MSG deaxxxx@hotmail.com Venkatesh 100
MIME-Version: 1.0
Content-Type: text/x-msmsgscontrol
TypingUser: deaxxxx@hotmail.com

 

I guess now u guys are well on your way to make your own version of  MSN messenger.Post your doubts/comments/message in the Forumn .Do visit my projects page for some cool vb & c++ codes

 I'll keep adding to the protocol ,will try to put in addition functions like add/remove users ,rename user id,file transfer and voice chat, so keep checking back

 

References:

You could take a look at these sites for more information

This is the original protocol published by microsoft.

http://www.tlsecurity.net/Textware/Misc/draft-movva-msn-messenger-protocol-00.txt

This is the MD5 homepage where u can find programs/codes for doing the MD5 encryption

http://userpages.umbc.edu/~mabzug1/cs/md5/md5.html


MSNP10鍗忚鍒嗘瀽 01.鐧誨綍 [by progsoft]
http://blog.csdn.net/progsoft/archive/2004/08/24/82938.aspx

MSN鍗忚涓枃閲婁箟(Zz)
http://blog.csdn.net/fanccYang/archive/2005/03/16/321198.aspx

MSN Protocol Version 8
http://msnpiki.msnfanatic.com/index.php/Main_Page
浠嬬粛浜哅SNP 鐨勬暣涓崗璁?& 鏈嶅姟鍣?Notification Server (NS)  & Switchboard (SB)  鐨勫姛鑳?

MSN Messenger Protocol Version 9
http://zoronax.bot2k3.net/
寰堣緇嗙殑浠嬬粛, 閲岄潰榪樻湁鍘熷鍖呬緥瀛?

MSN Messenger Protocol
http://www.hypothetic.org/docs/msn/client/invitation_types.php
MSNP 鐨勮緇嗗懡浠や粙緇?br>
Reverse-engineering MSN Messenger's Video Conversation Formats[Ramiro Polla]
http://www.libing.net.cn/read.php/1031.htm



]]>
IE 寮傛鍙彃鍏ュ崗璁墿灞?http://www.shnenglu.com/bigsml/archive/2008/03/23/45145.html娉℃場鐗?/dc:creator>娉℃場鐗?/author>Sat, 22 Mar 2008 16:38:00 GMThttp://www.shnenglu.com/bigsml/archive/2008/03/23/45145.htmlhttp://www.shnenglu.com/bigsml/comments/45145.htmlhttp://www.shnenglu.com/bigsml/archive/2008/03/23/45145.html#Feedback1http://www.shnenglu.com/bigsml/comments/commentRss/45145.htmlhttp://www.shnenglu.com/bigsml/services/trackbacks/45145.html鍙彃鍏ュ崗璁墿灞曪紙Asynchronous Pluggable Protocols錛変富瑕佸熀浜庡紓姝ョ殑URL Moniker鎶鏈?IE鐨刄RL Moniker鍦╱rlmon.dll 鍔ㄦ佸簱涓疄鐜扮殑錛?鏈変袱縐嶅鐞嗘満鍒訛細
1. 鏍規(guī)嵁URL 鍗忚璋冪敤澶栭儴紼嬪簭澶勭悊
姣斿telnet: or news: or mailto:錛屽綋璁塊棶榪欎簺url鐨勬椂鍊欎細鎵撳紑鐩稿簲鐨勭▼搴忔潵澶勭悊銆?br>姣斿瑕佹坊鍔爊ote:鍗忚(Registering an Application to a URL Protocol), 鍒欏彧瑕佷慨鏀規(guī)敞鍐岃〃
[HKEY_CLASSES_ROOT]
    [note]
        (Default) = "URL:Note Protocol"
        URL Protocol = ""
        [DefaultIcon]
            (Default) = "notepad.exe"
        [shell]
            [open]
                [command]
                    (Default) = "c:\windows\notepad.exe %1"
鍦↖E 涓緭鍏?note://xxx.txt 鐨勬椂鍊欎細鑷姩鐢╪otepad 鎵撳紑xxx.txt 鏂囦歡

2. 鏍規(guī)嵁URL 鍗忚璋冪敤綾誨璞℃潵澶勭悊
鍙互鏍規(guī)嵁URL 鍗忚鎴栬匨IME type 娉ㄥ唽涓嶅悓鐨勫鐞嗗璞?br>鏈変袱縐嶆柟寮忥細
a) 閫氳繃鍦ㄦ敞鍐岃〃灝哢RL 鍗忚涓嶤OM 瀵硅薄鍏寵仈
涓昏鍦ㄦ敞鍐岃〃涓殑
HKEY_CLASSES_ROOT\PROTOCOLS\Handler # URL 鍗忚
HKEY_CLASSES_ROOT\PROTOCOLS\Filter # Mime Filter

b) 閫氳繃涓存椂娉ㄥ唽綾誨璞″皢URL 鍗忚涓庡叾鍏寵仈
// 娉ㄥ唽
CComPtr<IInternetSession> spSession;
CComPtr<IClassFactory>   spCFHTTP;
HRESULT hr = CoInternetGetSession(0, &spSession, 0);
hr = FilterFactory::CreateInstance(CLSID_HttpProtocol, &spCFHTTP);
hr = spSession->RegisterNameSpace(spCFHTTP, CLSID_NULL, L"http", 0, 0, 0);

// 鍙嶆敞鍐?br>spSession->UnregisterNameSpace(spCFHTTP, L"http");

 

3. FilterFactory 鐨勫疄鐜板彲浠ュ弬鑰?br>Asynchronous Pluggable Protocol Implementation with ATL
http://www.codeguru.com/cpp/com-tech/atl/misc/article.php/c37/

Internet Explorer涓嬭澆鏂囦歡鐨勭粓鏋佽繃婊?/a>
http://blog.csdn.net/111222/archive/2002/02/09/7255.aspx

閫氳繃Mime filter鎶鏈緗戦〉婧愮爜榪涜榪囨護錛堢洃瑙嗕笅杞芥枃浠訛級
http://blog.csdn.net/lion_wing/archive/2006/06/27/839134.aspx

HTML浠g爜榪囨護鎶鏈?/a>
http://blog.csdn.net/lion_wing/articles/534716.aspx

About Asynchronous Pluggable Protocols 錛圡SDN錛?br>
Internet Explorer 緙栫▼綆榪幫紙涔?jié)锛夊湪鑷忿q殑嫻忚鍣ㄤ腑宓屽叆Google宸ュ叿鏉?/a>
http://blog.csdn.net/CathyEagle/archive/2005/12/12/550698.aspx

鏀?000鍒嗭紝楂樻墜榪涙潵鍔ㄦ墜璇曡瘯錛氬浣曟彁鍙朅JAX閲岀殑HTML鍐呭錛?br>http://topic.csdn.net/t/20061214/12/5230161.html
榪欓噷涓昏閫氳繃鐩戣IE 鐨勪笅杞戒粠鑰屼繚瀛楪oogle Map 鐨勫湴鍥炬暟鎹枃浠?  閫氳繃鐩戣http & text/html & application/javascript 鐨勫唴瀹規(guī)潵鑾峰彇鍥劇墖鏂囦歡URL 鍜?淇℃伅.. :)




]]>
const鍜屾寚閽堢粍鍚堢殑鍙樺寲http://www.shnenglu.com/bigsml/archive/2008/02/27/43326.html娉℃場鐗?/dc:creator>娉℃場鐗?/author>Wed, 27 Feb 2008 03:03:00 GMThttp://www.shnenglu.com/bigsml/archive/2008/02/27/43326.htmlhttp://www.shnenglu.com/bigsml/comments/43326.htmlhttp://www.shnenglu.com/bigsml/archive/2008/02/27/43326.html#Feedback0http://www.shnenglu.com/bigsml/comments/commentRss/43326.htmlhttp://www.shnenglu.com/bigsml/services/trackbacks/43326.htmla. char const* p  銆銆銆*p涓嶈兘鍙橈紝p鑳藉彉錛屼笉闇瑕佸垵濮嬪寲
b. const char* p  銆銆銆鍚宎
c. char* const p  銆銆銆*p鑳藉彉錛宲涓嶈兘鍙橈紝闇瑕佸垵濮嬪寲
d. const char* const p  *p涓嶈兘鍙橈紝p涓嶈兘鍙橈紝闇瑕佸垵濮嬪寲
d. const char const* p  *p涓嶈兘鍙橈紝p鑳藉彉錛屼笉闇瑕佸垵濮嬪寲
e. const char const* const p  閿欒
f. char const* const p  鍚宒



]]>
濡備綍紱佺敤Tree Control 鐨勮妭鐐?/title><link>http://www.shnenglu.com/bigsml/archive/2008/01/14/41146.html</link><dc:creator>娉℃場鐗?/dc:creator><author>娉℃場鐗?/author><pubDate>Mon, 14 Jan 2008 11:16:00 GMT</pubDate><guid>http://www.shnenglu.com/bigsml/archive/2008/01/14/41146.html</guid><wfw:comment>http://www.shnenglu.com/bigsml/comments/41146.html</wfw:comment><comments>http://www.shnenglu.com/bigsml/archive/2008/01/14/41146.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.shnenglu.com/bigsml/comments/commentRss/41146.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/bigsml/services/trackbacks/41146.html</trackback:ping><description><![CDATA[<p>Tree Control : how to disable an item </p> <p>Tree Control 涓嶆敮鎸佽妭鐐圭殑紱佺敤, 浣嗘槸鍙互閫氳繃鑷粯瀹炵幇, 涓昏濡備笅:<br><br>1. 鏍囪鑺傜偣鏄惁紱佺敤. 鍙互鐢?SetItemData & GetItemData 鏉ヨ緗?amp;鑾峰彇鑺傜偣鏁版嵁<br><br>2. 鍦ㄧ鐢ㄧ殑鑺傜偣涓? 瑕佽繃婊や竴浜涘鑺傜偣鎿嶄綔, 濡俥xpanding, selecting, drag & drop 絳?<br>TVN_SELCHANGING  鑺傜偣閫変腑鏀瑰彉鏃?br>TVN_ITEMEXPANDING 鑺傜偣灞曞紑鏃?br>TVN_BEGINDRAG  鑺傜偣寮濮嬭鎷栨媺<br>TVN_BEGINLABELEDIT 鑺傜偣琚紪杈?/p> <div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008000">//</span><span style="COLOR: #008000">Preventing selection: (handle TVN_SELCHANGING)</span><span style="COLOR: #008000"><br></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> CYourDialog::OnSelchangingTree(NMHDR</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000"> pNMHDR, LRESULT</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000"> pResult) <br>{<br>  NM_TREEVIEW</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000"> pNMTreeView </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> (NM_TREEVIEW</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">) pNMHDR;<br>  </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(((CItemStruct </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">) m_tree.GetItemData(pNMTreeView</span><span style="COLOR: #000000">-></span><span style="COLOR: #000000">iNewItem))</span><span style="COLOR: #000000">-></span><span style="COLOR: #000000">m_bDisabled)<br>  {<br>    </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">pResult </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">; </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 璁劇疆 *pResult=1 琛ㄧずTVN_SELCHANGING 榪欎釜鎿嶄綔涓嶈兘緇х畫</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">;<br>  }<br>  </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">pResult </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>}</span></div> <p><br>3. 瀵圭鐢ㄨ妭鐐硅繘琛岃嚜鐢? 鐢ㄥ浘鏍?棰滆壊灝嗙鐢ㄨ妭鐐瑰拰鍏朵粬鑺傜偣榪涜鍖哄垎 <br>a) 鐩存帴鍦?WM_PAINT 涓繘琛岃嚜鐢?(鎴栧Tree Control鐨勭粯鍥劇粨鏋滆繘琛屼慨鏀?<br> 鍙互鍙傝? <a target=_blank>濡備綍鍦ㄦ爲鍨嬫帶浠朵腑浣跨敤鑳屾櫙浣嶅浘</a></p> <p>b) 鐩稿簲 WM_OWERDRAW 浜嬩歡 <br> 鍙互鍙傝? <a target=_blank>Outlook椋庢牸鐨勫崟鍒椾嬌鐢ㄤ笉鍚岀殑棰滆壊鏄劇ず鏂伴偖浠舵暟</a></p> <p><br>鍙傝?<br><a target=_blank>MFC Tree Control: How to disable an item?</a> <br><a target=_blank>Setting color and font attribute for individual items</a><br></p> <img src ="http://www.shnenglu.com/bigsml/aggbug/41146.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/bigsml/" target="_blank">娉℃場鐗?/a> 2008-01-14 19:16 <a href="http://www.shnenglu.com/bigsml/archive/2008/01/14/41146.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>COM 綾誨伐鍘傛湁蹇呰瀛樺湪鍚?/title><link>http://www.shnenglu.com/bigsml/archive/2007/11/18/36907.html</link><dc:creator>娉℃場鐗?/dc:creator><author>娉℃場鐗?/author><pubDate>Sun, 18 Nov 2007 14:53:00 GMT</pubDate><guid>http://www.shnenglu.com/bigsml/archive/2007/11/18/36907.html</guid><wfw:comment>http://www.shnenglu.com/bigsml/comments/36907.html</wfw:comment><comments>http://www.shnenglu.com/bigsml/archive/2007/11/18/36907.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.shnenglu.com/bigsml/comments/commentRss/36907.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/bigsml/services/trackbacks/36907.html</trackback:ping><description><![CDATA[<p>1. IClassFactory 鐨勭敤閫?/p> <p>鍦?<a >http://www.80diy.com/home/20041120/19/3572410.html</a> 鐪嬪埌鍑犳鍏充簬COM 鐨勭被鍘傜殑璇? </p> <p>"""<br>綾誨巶鐢ㄦ潵鎶借薄緇勪歡鐨刢reate榪囩▼錛屽鎴蜂笉闇瑕佺煡閬撶粍浠剁殑璇︾粏鎯呭喌錛屼篃涓嶉渶瑕佺煡閬撶被鍘傜殑璇︾粏鎯呭喌錛屽彧瑕佺煡閬揅oCreateInstance鍙互鍒涘緩緇勪歡鍗沖彲銆傝孋oCreateInstance鍐呴儴璋冪敤DllGetClassObject鏉ョ敓鎴愯緇勪歡鐨勭被鍘傦紝鐢變簬綾誨巶鏈夌粍浠剁殑浣滆呮挵鍐欙紝鎵浠ュ緇勪歡綾誨彲璋撶煡鏍圭煡搴曪紝鐢辯被鍘傛潵鐢熸垚緇勪歡瀹屽叏琛屽緱閫氾紝榪欐牱瀹㈡埛鍜岀粍浠跺氨榪涗竴姝ュ垝鍒嗭紝瀹㈡埛鍙兘鏌ヨ璇ョ粍浠舵槸鍚︽敮鎸佹煇鍊熷彛錛岃屽緇勪歡鐨勫叾浠栨儏鍐典竴鏃犳墍鐭ワ紝榪欐牱鐨勫垝鍒嗗彲浠ヤ嬌緇勪歡鍜屽鎴烽棿鐨勮﹀悎鏇村皬銆?br>"""</p> <p>"""<br>緇勪歡濡傛灉灝嗘煇鎺ュ彛鐨勫叏閮ㄦ柟娉曢兘瀹炵幇浜嗭紝灝辯О璇ョ粍浠舵敮鎸佹煇鎺ュ彛錛宑om騫舵病鏈夎瀹氱粍浠跺拰鎺ュ彛涔嬮棿鏄櫄鍑芥暟緇ф壙鐨勫叧緋伙紝鍙槸鍦╟++涓互榪欑鏂規(guī)硶鏉ュ疄鐜版渶濂借屽凡銆?nbsp;  <br>IClassFactory璇寸┛浜嗗氨鏄笓闂ㄦ瀯閫犵粍浠剁殑綾伙紝榪欐牱鍋氭槸涓轟簡鎶借薄錛屽洜涓哄鎴鋒病鏈夊繀瑕佺煡閬撶粍浠舵槸浠涔堬紝濡傛灉鐢卞鎴風洿鎺ユ瀯閫犵粍浠訛紝瀹㈡埛鍔垮繀瑕佺煡閬撶粍浠剁殑淇℃伅錛宑om灝卞け鍘諱簡瀹冪殑鎰忎箟浜嗭紝鎵浠ワ紝瑙勫畾浜嗕竴涓被鍘傦紙鏀寔IClassFactory鎺ュ彛錛夛紝姣忎釜緇勪歡鐨勭被鍘傞兘寰堟竻妤氬茍涓斾篃鍙竻妤氳緇勪歡鐨勪俊鎭紝鑰屽鎴峰彧闇瑕佽皟鐢╟om搴撳嚱鏁癈oCreateInstance灝卞彲浠ヤ簡銆?nbsp;  <br>涓嬮潰鏄祦紼嬪浘錛?nbsp;  <br>  CoCreateInstance -> CoGetClassObject -> DllGetClassObject -> new ClassFactory -> IClassFactory::CreateInstance() -> new Component<br>"""</p> <p>騫朵笖鍦?<a >http://www.codeproject.com/com/comintro2.asp</a> 涔熺湅鍒板嚑孌佃瘽</p> <p>"""<br>姣忔瀹炵幇緇勪歡瀵硅薄綾葷殑鏃跺欙紝閮借鍐欎竴涓梺綾昏礋璐e垱寤虹涓涓粍浠跺璞$被鐨勫疄渚嬨傝繖涓梺綾誨氨鍙繖涓粍浠跺璞$被鐨勭被宸ュ巶錛坈lass factory錛夛紝鍏跺敮涓鐩殑鏄垱寤篊OM瀵硅薄銆備箣鎵浠ヨ涓涓被宸ュ巶錛屾槸鍥犱負璇█鏃犲叧鐨勭紭鏁呫侰OM鏈韓騫朵笉鍒涘緩瀵硅薄錛屽洜涓哄畠涓嶆槸鐙珛浜庤璦鐨勪篃涓嶆槸鐙珛浜庡疄鐜扮殑銆?<br>褰撴煇涓鎴風鎯寵鍒涘緩涓涓狢OM瀵硅薄鏃訛紝COM搴撳氨浠嶤OM鏈嶅姟鍣ㄨ姹傜被宸ュ巶銆傜劧鍚庣被宸ュ巶鍒涘緩COM瀵硅薄騫跺皢瀹冭繑鍥炲鎴風銆傚畠浠殑閫氳鏈哄埗鐢卞嚱鏁癉llGetClassObject()鏉ユ彁渚涖?br>"""</p> <p>鍦?lt;COM 鎶鏈唴騫?gt; 涓? 瀵圭被鍘傜殑寮曞叆涔熸湁鎻忚堪. <br>涓昏鏄?<br>a. 鍦ㄩ潰鍚戝璞$郴緇熶腑, 瀵硅薄鍒涘緩鏄潪甯擱噸瑕佺殑, 鍥犱負瑕佷嬌鐢ㄥ畠蹇呴』鍏堝垱寤哄畠. 鎵浠ュ敖鍙兘鐏墊椿鐨勫垱寤哄璞?component)<br>b. 鍦–oCreateInstance 鍒涘緩瀵硅薄榪囩▼鏄? 浼犵粰涓鍏盋LSID, 鐒跺悗鍒涘緩鎴愮浉搴旂粍浠? 騫惰繑鍥炴墍璇鋒眰鐨勬寚閽? 鍏跺紛绔湪浜庢棤娉曟彁渚涚粰瀹㈡埛涓縐嶆帶鍒跺璞″垱寤鴻繃紼嬬殑鏂規(guī)硶. (闂鍏抽敭涓嶅湪鍒濆鍖? 鑰屾槸鎺у埗鍒涘緩瀵硅薄榪囩▼)<br>c. IClassFactory2 鎴愭壒鐨勮皟鐢ㄦ帴鍙? </p> <p><br>2. <br>鍙傝僀oCreateInstance 鐨勫疄鐜拌繃紼? <br>CoCreateInstance -> CoGetClassObject -[緋葷粺|緇勪歡浠g爜]-> DllGetClassObject -> new ClassFactory -> IClassFactory::CreateInstance() -> new Component</p> <p>鍥犱負 DllGetClassObject -> new ClassFactory -> IClassFactory::CreateInstance() -> new Component 閮芥槸緇勪歡鎵鏉ュ疄鐜扮殑, 鑰岀郴緇熻皟鐢?CoCreateInstance 鎵鎻愪緵鐨勫弬鏁? 鍜岄氳繃鑷繁浣跨敤IClassFactory 鏉ュ垱寤篊omponent 鐨勫弬鏁版槸娌℃湁鍙樺寲鐨? 鎵浠ュ鏋滅渷鐣?ClassFactory 搴旇涔熷彲浠? </p> <p>CoCreateInstance -> CoGetClassObject -[緋葷粺|緇勪歡浠g爜]-> DllGetClassObject -> new Component </p> <p>DllGetClassObject 瀹屽叏鍙互瀹屾垚<COM 鎶鏈唴騫曡鐨?gt; a. 鐏墊椿鍒涘緩瀵硅薄, b. 鎺у埗鍒涘緩榪囩▼, c. IClassFactory2 , 鑰屼笖榪欐牱瀛愮殑瀹炵幇涔熶笌璇█鏃犲叧.  <br>鎵浠ユ劅瑙夋病鏈夊繀瑕佷竴瀹氳鐢ㄥ埌IClassFactory 榪欎釜鎺ュ彛</p> <p><br>3. <br>鍥犳鍦ㄥ疄鐜扮殑鏃跺? 瀹屽叏鍙互榪欐牱瀛愮殑瀹炵幇緇勪歡<br>CCoClass : public IA, public IB, public IClassFactory <br>{<br>......<br>}</p> <p>DllGetClassObject()<br>{<br>new CCoClass<br>}</p> <p>鑰屼笉闇瑕侀澶栫殑鐢ㄤ竴涓被鍗曠嫭鐨勫幓瀹炵幇IClassFactory . 濂藉儚ATL 榛樿鐨勫氨鏄繖涔堝共鐨? 鎻愪緵浜嗕竴涓狢ComCoClass<CCoClass, &CLSID_CCoClass)  瀹炵幇綾? </p> <p>榪欎釜鏄垜鐨勫COM 鐨処ClassFactory 鐨勭悊瑙? 鎰熻娌″繀瑕佸涓涓繖涓笢瑗? <br><br>涓嶇煡閬撳ぇ瀹舵槸濡備綍鐪嬪緟榪欎釜涓滆タ鐨?) </p> <p><br> </p> <img src ="http://www.shnenglu.com/bigsml/aggbug/36907.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/bigsml/" target="_blank">娉℃場鐗?/a> 2007-11-18 22:53 <a href="http://www.shnenglu.com/bigsml/archive/2007/11/18/36907.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>紿楀彛鐨勫瓙綾誨寲涓庤秴綾誨寲http://www.shnenglu.com/bigsml/archive/2007/08/24/30780.html娉℃場鐗?/dc:creator>娉℃場鐗?/author>Fri, 24 Aug 2007 10:58:00 GMThttp://www.shnenglu.com/bigsml/archive/2007/08/24/30780.htmlhttp://www.shnenglu.com/bigsml/comments/30780.htmlhttp://www.shnenglu.com/bigsml/archive/2007/08/24/30780.html#Feedback3http://www.shnenglu.com/bigsml/comments/commentRss/30780.htmlhttp://www.shnenglu.com/bigsml/services/trackbacks/30780.html1. 瀛愮被鍖?
鏀瑰彉涓涓凡緇忓瓨鍦ㄧ殑紿楀彛瀹炰緥鐨勬ц川錛氭秷鎭鐞嗕笌鍏朵粬瀹炰緥灞炴с?/strong>
鍦⊿DK緙栫▼鑼冪暣鍐咃紝瀛愮被鍖栧氨鏄敼鍙樹竴涓獥鍙e疄渚嬬殑紿楀彛鍑芥暟錛堥氳繃GetWindowLong()鍜孲etWindowLong()錛夛紝瀛愮被鍖栨墍瑕佸仛鐨勫氨鏄負鏌愮獥鍙e疄渚嬬紪鍐欐柊鐨勭獥鍙e嚱鏁般傚叾鎿嶄綔鏄湪瀹炰緥綰у埆涓婅繘琛岀殑銆?br>鍦∕FC涓瓙綾誨寲鐨勬儏鍐墊湁鎵涓嶅悓錛氭墍鏈塎FC紿楀彛鏈夌浉鍚岀殑紿楀彛鍑芥暟錛岀敱璇ョ獥鍙e嚱鏁版牴鎹獥鍙e彞鏌勬煡鎵劇獥鍙e疄渚嬶紝鍦ㄦ妸娑堟伅鏄犲皠鍒拌紿楀彛綾伙紙class錛夊緱娑堟伅澶勭悊鍑芥暟涓娿備負浜嗗埄鐢∕FC鐨勬秷鎭槧灝勬満鍒訛紝涓嶅疁鏀瑰彉紿楀彛鍑芥暟錛堝悕錛夛紝MFC涔熸妸瀛愮被鍖栧皝瑁呭湪鍑芥暟SubclassWindow錛堬級涓備絾瀛愮被鍖栫殑鏈川娌℃湁鍙橈細鍦ㄥ疄渚嬬駭鍒獎鍝嶇獥鍙g殑娑堟伅鍙婂叾澶勭悊銆備緥錛?br>Class  B 錛歱ublic A
{
  ……
}
A  a;
B  b;
HWND ha=a.GetSafeHwnd();
b.SubclassWindow(ha); #褰撶劧A 鍜孊 涓嶄竴瀹氭槸緇ф壙鍏崇郴銆?br>娉ㄦ剰錛氬湪琚瓙綾誨寲鐨勭獥鍙i攢姣佷箣鍓嶏紝蹇呴』鎵ц紿楀彛鐨勫弽瀛愮被鍖栵細
b.UnSubclassWindow();


2 瓚呯被鍖?br>紿楀彛瓚呯被鍖栨槸鍦ㄧ獥鍙g被鈥斺擶NDCLASS鎴朩NDCLASSEX錛堥潪MFC綾繪蹇碉級綰у埆榪涜鐨勬敼鍙樼獥鍙g被鐗瑰緛鐨?/strong>銆?br>浣跨敤榪囩▼錛氶鍏堣幏寰椾竴涓凡瀛樺湪鐨勭獥鍙g被錛岀劧鍚庤緗獥鍙g被錛屾渶鍚庢敞鍐岃紿楀彛綾匯?br>渚嬶細
WNDCLASSEX  wc;
wc.cbSize=sizeof(wc); //Windows鐢ㄦ潵榪涜鐗堟湰媯鏌ョ殑錛屼笌紿楀彛鐗瑰緛鏃犲叧
GetClassInfoEx(hinst,”XXXXXX”,&wc);
 // hinst鈥斿畾涔夌獥鍙g被XXXXXX鐨勬ā鍧楃殑鍙ユ焺錛屽涓虹郴緇熷畾涔夌殑紿楀彛綾伙紙濡傦細EDIT銆丅UTTON錛夊垯hinst=NULL.銆?
wc.lpszClassName = “YYYYYYY”;//蹇呴』鏀瑰彉紿楀彛綾葷殑鍚嶅瓧
wc.hbrBackGround = CreateSolidBrush(RGB(0,0.0));//鏀瑰彉鑳屾櫙鍒?
wc.lpfnWndProc = NewWndProc;//鏀瑰彉紿楀彛鍑芥暟
……
RegisterClassEx(&wc);// 娉ㄥ唽鏂扮獥鍙g被
//浣跨敤紿楀彛綾?
……
::CreateWindow(_T(“YYYYYYYY”,……)錛?

鏁呰秴綾誨寲鍙兘鏀瑰彉鑷繁鍒涘緩鐨勭獥鍙g殑鐗瑰緛錛岃屼笉鑳界敤浜庣敱Windows鍒涘緩鐨勭獥鍙o紙濡傚璇濇涓婄殑鎸夐挳灝變笉鑳借繘琛岃秴綾誨寲錛?銆傝屽瓙綾誨寲鏄疄渚嬬駭鍒笂鐨勶紝鍙鑳借幏寰楃獥鍙g殑瀹炰緥錛屽氨鍙鍏跺瓙綾誨寲錛岃繖鏄敮涓鐨勫瓙綾誨寲瀵逛簬瓚呯被鍖栫殑浼樺娍銆傚彟澶栵紝鍑℃槸瀛愮被鍖栧彲瀹炵幇鐨勶紝瓚呯被鍖栭兘鍙疄鐜幫紝涓嶈繃瓚呯被鍖栫敤璧鋒潵杈冮夯鐑︺?


3. 鎬葷粨

錛?錛?瀛愮被鍖栦慨鏀圭獥鍙h繃紼嬪嚱鏁?  瓚呯被鍖栦慨鏀圭獥鍙g被(鏂扮殑紿楀彛綾誨悕)
錛?錛?瀛愮被鍖栨槸鍦ㄧ獥鍙e疄渚嬬駭鍒笂鐨勶紝瓚呯被鍖栨槸鍦ㄧ獥鍙g被錛圵NDCLASS錛夌駭鍒笂鐨勩?
錛?錛?瓚呯被鍖栧彲浠ュ畬鎴愭瘮瀛愮被鍖栨洿澶嶆潅鐨勫姛鑳斤紝鍦⊿DK鑼冪暣涓婏紝鍙互璁や負瀛愮被鍖栨槸瓚呯被鍖栫殑瀛愰泦銆?
錛?錛?瀛愮被鍖栧彧鑳芥敼鍙樼獥鍙e垱寤哄悗鐨勬ц川錛屽浜庣獥鍙e垱寤烘湡闂存棤鑳戒負鍔?鏃犳硶鎴幏ON_CREATE 浜嬩歡)錛岃岃秴綾誨寲鍙互瀹炵幇錛涜秴綾誨寲涓嶈兘鐢ㄤ簬Windows鍒涘緩鐨勭獥鍙o紝瀛愮被鍖栧彲浠ャ?nbsp;


4. 鍏朵粬
鍦?鐪艱涓哄疄(2)錛氫粙緇峎indows鐨勭獥鍙c佹秷鎭佸瓙綾誨寲鍜岃秴綾誨寲 榪欓噷鏈変竴涓緥瀛?.
鍙互寰楀嚭緇撹
a) 瀛愮被鍖栫殑classname 鏄笉浼氬彉鍖栫殑, 鑰岃秴綾誨寲浣跨敤鏂版敞鍐宑lassname
b) 瀛愮被鍖?& 瓚呯被鍖?鎻忚堪鐨勬槸涓涓姩浣?鍜屽疄鐜版柟娉曟病浠涔堝叧緋?.... 涓昏鏄瓙綾誨寲鏄疭ubclassWindow, SubclassDlgItem, 鑰岃秴綾誨寲鏄疪egisterClassEx(&newwindowclass)
c) 鎰熻鍏蜂綋娌℃湁蹇呰鍖哄垎榪欎簺, 瀹炵幇鍔熻兘灝辮浜? 鍛靛懙




]]>
Some DirectShow Samples Break in Visual Studio 2005http://www.shnenglu.com/bigsml/archive/2007/06/26/26978.html娉℃場鐗?/dc:creator>娉℃場鐗?/author>Tue, 26 Jun 2007 03:07:00 GMThttp://www.shnenglu.com/bigsml/archive/2007/06/26/26978.htmlhttp://www.shnenglu.com/bigsml/comments/26978.htmlhttp://www.shnenglu.com/bigsml/archive/2007/06/26/26978.html#Feedback2http://www.shnenglu.com/bigsml/comments/commentRss/26978.htmlhttp://www.shnenglu.com/bigsml/services/trackbacks/26978.htmlzt: http://blogs.msdn.com/mikewasson/archive/2005/05/23/some-directshow-samples-break-in-visual-studio-2005.aspx

DirectX 9.0 涓?VS 2005 涔嬮棿瀛樺湪鍐茬獊, 涓昏鍥犱負VS 2005 鐨勮娉曟瘮VC6 & VS2003 鏇村姞涓ユ牸, 鎵浠ヤ竴浜汥irectX 鑷甫鐨勪唬鐮侀渶瑕佹洿鏀逛互鍚庢墠鑳界紪璇戦氳繃. 鏈潵鎯寵嚜宸辨敼鐨? 涓嶈繃鍦ㄧ綉涓婂彂鐜頒簡鏈変漢宸茬粡鍋氫簡榪欎釜:)


[Note: This post applies to the Platform SDK for Windows Server 2003 SP1 and Server 2003 R2. These issues were fixed in the Windows SDK for Vista.]  

Some of the DirectShow samples break if you install Visual Studio 2005 Beta 2. Most of the errors that I found fall into three categories:

  • C4430: Missing type specifier. To conform with C++, undeclared types do not default to int. All types must be declared. Fix: Declare the type, or suppress the warning with the "/wd4430" flag.
  • C4996: ' xxxx' was declared deprecated. You may be including an older version of strsafe.h from the DirectX SDK or the Platform SDK. You should include the version installed with Visual Studio. (But it's probably harmless to ignore this warning.) 
  • C2065: 'xxx': undeclared identifier. To conform with C++, the scope of a variable declared inside a "for" loop is restricted to the loop. Fixes: (a) Move the declaration outside the for loop. (b) Redeclare the variable in multiple scopes, if you don't need it to persist outside the loop. (c) Set the /Zc:forScope flag. (You can find this under Project, Properties, Configuration Properties, C/C++, Language, Force Conformance In For Loop Scope. Set to "No".)

Here are the specific fixes that I made. Warning: I have not thoroughly tested these, and I only tried them under the "Windows XP 32-bit Debug" environment in Platform SDK. You should use your own judgment before making any of these fixes.

  • BaseClasses\ctlutil.h (278)  
        (LONG) operator=(LONG);
  • BaseClasses\wxdebug.cpp (564)
        static DWORD g_dwLastRefresh = 0;
  • BaseClasses\winutil.cpp (2092)
       UINT Count;
       for (Count = 0;Count < Result;Count++) {
  •  BaseClasses\outputq.cpp (635)
       long iDone = 0;
       for (iDone = 0;
  • Capture\AmCap\amcap.cpp (691)
        for(int i = 0; i < NUMELMS(gcap.rgpmAudioMenu); i++)
  • Capture\AmCap\amcap (2795)
        for(int i = 0; i < NUMELMS(gcap.rgpmAudioMenu); i++)
  • DMODemo\dsutil.cpp (686)
        DWORD i = 0;
        for( i=0; i<m_dwNumBuffers; i++ )
  • dmoimpl.h (622)   [In the Platform SDK headers]
        for (DWORD dw = 0; dw < NUMBEROFOUTPUTS; dw++) {
  • DMO\GargleDMO\MedParamBase\param.cpp (91)
        for (DWORD dwIndex = 0; dwIndex < cParams; dwIndex++)
  • DMO\GargleDMO\MedParamBase\param.cpp (309)
        CCurveItem *pCurve = NULL;
        for (pCurve = pCurveHead;
  • DMO\GargleDMO\gargle.cpp (145)
        for (DWORD i = 0; i < cOutputStreams && SUCCEEDED(hr); ++i)
  • Filters\Dump\dump.cpp (426)
        for (int Loop = 0;Loop < (DataLength % BYTES_PER_LINE);Loop++)
  • Filters\Gargle\gargle.cpp (212)
        static int m_nInstanceCount; // total instances
  • Filters\RGBFilters\RateSource\ratesource.cpp (382)
        for( int y = 0 ; y < DEFAULT_HEIGHT ; y++ )
  • Filters\RGBFilters\RateSource\ratesource.cpp (387)
        for( int y = 0 ; y < DEFAULT_WIDTH ; y++ )
  • VMR\VMRXclBasic and VMR\Ticker: LNK1181: cannot open input file 'dxguid.lib'. This was an error in the makefile. Change to read:
        DXLIB="$(DXSDK_DIR)\Lib\x86"  (currently says "x32")
  • VMR\VMRXcl and VMR\VMRMulti: C1083: Cannot open include file: 'd3dxmath.h': No such file or directory. This is an old DX header that is no longer included in DX or in Visual Studio. Unfortunately the only fix is to download an older version of the DirectX SDK.
  • VMR9\MultiVMR9\GamePlayer\character.cpp (383)
        DWORD i = 0;
        for (i = 0; i < pMeshContainer->NumInfl; ++i)
  • VMR9\MultiVMR9\DLL\MixerControl.h (28)
        static const DWORD MultiVMR9Mixer_DefaultFVF = D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_TEX1;
  • VMR9\VMRAllocator: error LNK2019: unresolved external symbol "wchar_t * __stdcall _com_util::ConvertStringToBSTR(char const *)" (etc).  Add this to the makefile:
        LINK32_LIBS = \
        comsuppw.lib \
        shell32.lib \

 



]]>
鍒╃敤IE 瀹炵幇Web 欏甸潰鎴浘http://www.shnenglu.com/bigsml/archive/2007/06/10/25983.html娉℃場鐗?/dc:creator>娉℃場鐗?/author>Sun, 10 Jun 2007 10:55:00 GMThttp://www.shnenglu.com/bigsml/archive/2007/06/10/25983.htmlhttp://www.shnenglu.com/bigsml/comments/25983.htmlhttp://www.shnenglu.com/bigsml/archive/2007/06/10/25983.html#Feedback2http://www.shnenglu.com/bigsml/comments/commentRss/25983.htmlhttp://www.shnenglu.com/bigsml/services/trackbacks/25983.html1. 鐩殑

   鍦–odeproject 涓湅鍒版湁浜哄仛榪欎釜,  紼嶅井鍋氫簡涓嬩慨鏀? 鍋氭垚浜嗗懡浠よ鐨? 浣跨敤鏂規(guī)硶鏄?nbsp;
   iesnap.exe url filename
      鐢ㄤ互鎶撳彇 URL 瀵逛簬鐨刉eb, 騫朵笖灝哤eb 鐨勬埅鍥句繚瀛樺湪Filename 涓?
      url : 瑕佹埅鍥劇殑緗戝潃
      filename: 鎴浘淇濆瓨鏂囦歡鍚?br>       
2. 鎬濊礬
   
 涓昏浣跨敤WebBrowser Control 鍜?MSHTML 鏉ュ畬鎴?
 a. 鍒涘緩WebBrowser control
 b. 浠嶹ebBrowser Control 鑾峰彇 IWebBrowser2 鎺ュ彛, 鐢?IWebBrowser2::Navigate2 鏉ヨ闂甎RL
 c. 鑾峰緱IHTMLElementRender (WebBrowser -> IHTMLDocument2 -> IHTMLElement -> IHTMLElementRender), 浣跨敤璇ユ帴鍙g殑DrawToDC 鏉ヨ幏鍙朥RL 瀵瑰簲鐨勯〉闈㈡埅鍥懼唴瀹?
 d. 鐢℅DI 鐨?Image 鏉ヤ繚瀛樻埅鍥懼埌Filename

3. 
   鍙互鐪嬬湅鍘熸枃浠ュ緱鍒版洿濂界殑瑙g瓟   
   鎴戠湅鐨勯偅涓枃绔? Capture an HTML document as an image
   鍙﹀涓綃嘋# 鐨勬枃绔? Image Capture Whole Web Page using C#


4. 闂
       
 a. DocumentComplete 浜嬩歡浼氬湪URL 瀵瑰簲欏甸潰鐨勬瘡涓厓绱犱笅杞藉畬姣曠殑鏃跺欓兘浼氬彂鐢? 鎵浠?( 榪樹笉鐭ラ亾鍝釜浜嬩歡鏄暣涓〉闈笅杞藉畬姣曠殑浜嬩歡:/
 b. 鐜板湪鏄氳繃MFC 鏉ュ垱寤篧ebBrowser Control 鐨? 涓嶇煡閬撴庝箞鍦╓in32 Application 涓垱寤鴻繖涓帶浠?
 c. 涓嶇煡閬撳浣曞緱鍒版暣涓〉闈㈢殑澶у皬, 鐜板湪鍙兘淇濆瓨欏甸潰鎴浘鐨勪竴閮ㄥ垎:(
   榪欎釜宸茬粡鐭ラ亾鎬庝箞鍋氫簡. 
   IHTMLElement2 鐨?scrollWidth & scrollHeight 鍔犱笂 scrollLeft & scrollTop 鏉ュ疄鐜? 浣嗘槸涓嶇煡閬撲負浠涔? put_scrollTop & put_scrollLeft 榪欎簺鍑芥暟濂藉儚涓嶅, 鍙兘鎴幏鍒頒竴閮ㄥ垎欏甸潰鎴浘.:( 涓嶇煡閬撲負浠涔?br>   


 浠g爜鍙互鍦ㄨ繖閲屼笅杞? http://www.shnenglu.com/Files/bigsml/iesnapshot.zip



]]>
YC 嫻忚鍣?/title><link>http://www.shnenglu.com/bigsml/archive/2007/04/25/22808.html</link><dc:creator>娉℃場鐗?/dc:creator><author>娉℃場鐗?/author><pubDate>Wed, 25 Apr 2007 09:07:00 GMT</pubDate><guid>http://www.shnenglu.com/bigsml/archive/2007/04/25/22808.html</guid><wfw:comment>http://www.shnenglu.com/bigsml/comments/22808.html</wfw:comment><comments>http://www.shnenglu.com/bigsml/archive/2007/04/25/22808.html#Feedback</comments><slash:comments>17</slash:comments><wfw:commentRss>http://www.shnenglu.com/bigsml/comments/commentRss/22808.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/bigsml/services/trackbacks/22808.html</trackback:ping><description><![CDATA[<p>榪欐嫻忚鍣?縐頒箣涓篩ang C/C++ Compiler & Internet Browser鎴栬匶C緙栬瘧鍨嬫祻瑙堝櫒..<br><br>鏈寮濮嬫槸鍦ㄧ▼搴忓憳鐪嬪埌鐩稿叧鐨勬枃绔犵殑, 寮濮嬩互涓烘槸鍦ㄥ惞..浣嗘槸浠婂ぉ鐢ㄤ粬鐨勭▼搴忕殑鏃跺? 鎰熻鐪熺殑寰坣b..<br><br>"""<br>璁拌呭湪鏉ㄦ檽鍏靛瑙傛懇浜嗚浜у搧鐨勬紨紺?鍙戠幇瀹冩槸鐢卞涓嬩簲涓儴鍒嗙粍鎴愶細HTML瑙f瀽鍣紱XML瑙f瀽鍣紙鐩墠瀹屾垚涓閮ㄥ垎錛夛紱javascript鑴氭湰瑙i噴鍣?C/C++鑴氭湰瑙i噴鍣紱C/C++緙栬瘧鍣紱鏂囨湰鍙婁簩榪涘埗緙栬緫鍣?鍏朵腑鏈浠や漢鐬╃洰鐨勫姛鑳?鑷劧鏄粬鎵鍐呭祵鐨凜/C++瀹炴椂緙栬瘧鍔熻兘浜?榪欐牱浣垮緱C/C++鐨勮繍琛屾晥鏋滅湅涓婂幓綾諱技鍔ㄦ佽璦,瀹冧笉浠呬嬌寰桯TML鏀寔鑴氭湰鍖栫殑鏍囧噯C/C++璇█,鑰屼笖浣垮緱C/C++ 鑳藉涓庤薄JacaScript榪欐牱鐨勫姩鎬佽璦鍙互浜掔浉璋冪敤.鏉ㄦ檽鍏佃“榪欏皢鏄蔣浠跺紑鍙戞柟寮忕殑闈╂柊.閫氳繃榪欎釜瀹炴椂緙栬瘧鍔熻兘,姣忎釜杞歡鍙互鍚屾椂鍒嗗壊鎴愯嫢騫叉ā鍧?鐩鎬簰涔嬮棿鍙互鐙珛榪愯.”璇ョ紪璇戝櫒,涓庝富嫻佺殑C/C++緙栬瘧鍣ㄧ浉姣?YC++鍦ㄥ姛鑳借繘琛屼簡涓浜涘垹鍑忓拰鏀硅壇,姣斿鍘繪帀浜嗘爣鍑咰/C++鐨勫嚱鏁伴噸杞姐佽繍綆楃閲嶈澆銆佹ā鏉跨瓑,鑰屾敼鑹殑鏂瑰悜,涓昏渚ч噸澧炲姞涓庣綉欏靛紑鍙戠幆澧冿紙HTML4.0銆丆SS2.JavaScript錛夌殑浜掔浉鏀寔鍜岃皟鐢?浠や漢棰囨劅鎰忓鐨勬槸,璇ヤ駭鍝佸寘鎷紪璇戝櫒銆丠TML瑙f瀽鍣ㄧ瓑鍦ㄥ唴鐨勪簲涓ā鍧楃殑鎵鏈変唬鐮?閮戒笌鐢辨潹鏅撳叺鐙嚜涓涓漢鐢–璇█寮鍙戝畬鎴?浠庢湭鍊熼壌鍙傝冧換浣曞叾浠栨簮浠g爜.鏉ㄦ檽鍏佃В閲婅涓昏鏄負浜嗕究浜庤皟璇曞拰鎺у埗.榪欐槸鐩稿綋澶х殑宸ヤ綔閲?鏁存暣鑺變簡浠栧叚騫存椂闂?浠庢紨紺虹殑榪愯鏁堟灉鏉ョ湅,榪欐鐢變竴浜烘墜宸ュ畬鎴愮殑浣滃搧,緙栬瘧閫熷害绔熺劧姣擵C++榪樿蹇竴浜?鎹忛湶鏄簮鑷叾璁稿綆楁硶鐨勪紭鍖?濡備笓闂ㄤ負鍙橀噺鍙傛暟浣滀簡鍙緵蹇熸煡鎵劇殑瀛楀吀琛ㄧ瓑.<br>"""<br><br><br>鍦ㄧ敤鐨勬椂鍊? 鍙戠幇鏁翠釜嫻忚鍣ㄦ病鏈変嬌鐢ㄤ竴涓猈indows 鎺т歡, 鎵鏈夌殑鎺т歡閮芥槸鐢辯敤GDI 綰ф潵緇樺埗鎴愮殑... 鍖呮嫭鑿滃崟, 杈撳叆妗? 鎸夐挳, 鏍戝艦鎺т歡絳夌瓑絳?br><br>Orz... 涓鎶?br><br>鍙互鍦ㄨ繖閲屼笅杞借瘯鐢? 瑙e帇緙?涓帇緙╁寘灝辮浜?<br><a href="http://www.shnenglu.com/Files/bigsml/setyc.part01.rar">/Files/bigsml/setyc.part01.rar</a><br><a href="http://www.shnenglu.com/Files/bigsml/setyc.part02.rar">/Files/bigsml/setyc.part02.rar</a><br><a href="http://www.shnenglu.com/Files/bigsml/setyc.part03.rar">/Files/bigsml/setyc.part03.rar</a></p> <img src ="http://www.shnenglu.com/bigsml/aggbug/22808.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/bigsml/" target="_blank">娉℃場鐗?/a> 2007-04-25 17:07 <a href="http://www.shnenglu.com/bigsml/archive/2007/04/25/22808.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>鐢˙oundsChecker媯嫻嬪唴瀛樻硠婕?(zz) http://www.shnenglu.com/bigsml/archive/2006/10/19/13860.html娉℃場鐗?/dc:creator>娉℃場鐗?/author>Thu, 19 Oct 2006 05:45:00 GMThttp://www.shnenglu.com/bigsml/archive/2006/10/19/13860.htmlhttp://www.shnenglu.com/bigsml/comments/13860.htmlhttp://www.shnenglu.com/bigsml/archive/2006/10/19/13860.html#Feedback2http://www.shnenglu.com/bigsml/comments/commentRss/13860.htmlhttp://www.shnenglu.com/bigsml/services/trackbacks/13860.html
銆銆榪欓噷鎴戜滑浠alloc鍑芥暟涓轟緥錛屾埅鑾峰叾浠栫殑鍑芥暟鏂規(guī)硶涓庢綾諱技銆?br />
銆銆闇瑕佽鎴幏鐨勫嚱鏁板彲鑳藉湪DLL涓紝涔熷彲鑳藉湪紼嬪簭鐨勪唬鐮侀噷銆傛瘮濡傦紝濡傛灉闈欐佽繛緇揅-Runtime Library錛岄偅涔坢alloc鍑芥暟鐨勪唬鐮佷細琚繛緇撳埌紼嬪簭閲屻備負浜嗘埅鑾蜂綇瀵硅繖綾誨嚱鏁扮殑璋冪敤錛孊oundsChecker浼氬姩鎬佷慨鏀硅繖浜涘嚱鏁扮殑鎸囦護銆?br />
銆銆浠ヤ笅涓ゆ姹囩紪浠g爜錛屼竴孌墊病鏈塀oundsChecker浠嬪叆錛屽彟涓孌靛垯鏈塀oundsChecker鐨勪粙鍏ワ細
126:聽_CRTIMP聽void*聽__cdecl聽malloc聽(
127:聽size_t聽nSize
128:聽)
129:聽{

00403C10聽push聽ebp
00403C11聽mov聽ebp,esp
130:聽return聽_nh_malloc_dbg(nSize,聽_newmode,聽_NORMAL_BLOCK,聽NULL,聽0);
00403C13聽push聽
0
00403C15聽push聽
0
00403C17聽push聽
1
00403C19聽mov聽eax,[__newmode聽(0042376c)]
00403C1E聽push聽eax
00403C1F聽mov聽ecx,dword聽ptr聽[nSize]
00403C22聽push聽ecx
00403C23聽call聽_nh_malloc_dbg聽(00403c80)
00403C28聽add聽esp,14h
131:聽}
浠ヤ笅榪欎竴孌典唬鐮佹湁BoundsChecker浠嬪叆錛?br />
126:聽_CRTIMP聽void*聽__cdecl聽malloc聽(
127:聽size_t聽nSize
128:聽)
129:聽{

00403C10聽jmp聽01F41EC8
00403C15聽push聽
0
00403C17聽push聽
1
00403C19聽mov聽eax,[__newmode聽(0042376c)]
00403C1E聽push聽eax
00403C1F聽mov聽ecx,dword聽ptr聽[nSize]
00403C22聽push聽ecx
00403C23聽call聽_nh_malloc_dbg聽(00403c80)
00403C28聽add聽esp,14h
131:聽}

銆銆褰揃oundsChecker浠嬪叆鍚庯紝鍑芥暟malloc鐨勫墠涓夋潯姹囩紪鎸囦護琚浛鎹㈡垚涓鏉mp鎸囦護錛屽師鏉ョ殑涓夋潯鎸囦護琚惉鍒板湴鍧01F41EC8澶勪簡銆傚綋紼嬪簭榪涘叆malloc鍚庡厛jmp鍒?1F41EC8錛屾墽琛屽師鏉ョ殑涓夋潯鎸囦護錛岀劧鍚庡氨鏄疊oundsChecker鐨勫ぉ涓嬩簡銆傚ぇ鑷翠笂瀹冧細鍏堣褰曞嚱鏁扮殑榪斿洖鍦板潃錛堝嚱鏁扮殑榪斿洖鍦板潃鍦╯tack涓婏紝鎵浠ュ緢瀹規(guī)槗淇敼錛夛紝鐒跺悗鎶婅繑鍥炲湴鍧鎸囧悜灞炰簬BoundsChecker鐨勪唬鐮侊紝鎺ョ潃璺沖埌malloc鍑芥暟鍘熸潵鐨勬寚浠わ紝涔熷氨鏄湪00403c15鐨勫湴鏂廣傚綋malloc鍑芥暟緇撴潫鐨勬椂鍊欙紝鐢變簬榪斿洖鍦板潃琚慨鏀癸紝瀹冧細榪斿洖鍒癇oundsChecker鐨勪唬鐮佷腑錛屾鏃禕oundsChecker浼氳褰曠敱malloc鍒嗛厤鐨勫唴瀛樼殑鎸囬拡錛岀劧鍚庡啀璺寵漿鍒板埌鍘熸潵鐨勮繑鍥炲湴鍧鍘匯?br />
銆銆濡傛灉鍐呭瓨鍒嗛厤/閲婃斁鍑芥暟鍦―LL涓紝BoundsChecker鍒欓噰鐢ㄥ彟涓縐嶆柟娉曟潵鎴幏瀵硅繖浜涘嚱鏁扮殑璋冪敤銆侭oundsChecker閫氳繃淇敼紼嬪簭鐨凞LL Import Table璁﹖able涓殑鍑芥暟鍦板潃鎸囧悜鑷繁鐨勫湴鍧錛屼互杈懼埌鎴幏鐨勭洰鐨勩?br />
銆銆鎴幏浣忚繖浜涘垎閰嶅拰閲婃斁鍑芥暟錛孊oundsChecker灝辮兘璁板綍琚垎閰嶇殑鍐呭瓨鎴栬祫婧愮殑鐢熷懡鍛ㄦ湡銆傛帴涓嬫潵鐨勯棶棰樻槸濡備綍涓庢簮浠g爜鐩稿叧錛屼篃灝辨槸璇村綋BoundsChecker媯嫻嬪埌鍐呭瓨娉勬紡錛屽畠濡備綍鎶ュ憡榪欏潡鍐呭瓨鍧楁槸鍝浠g爜鍒嗛厤鐨勩傜瓟妗堟槸璋冭瘯淇℃伅錛圖ebug Information錛夈傚綋鎴戜滑緙栬瘧涓涓狣ebug鐗堢殑紼嬪簭鏃訛紝緙栬瘧鍣ㄤ細鎶婃簮浠g爜鍜屼簩榪涘埗浠g爜涔嬮棿鐨勫搴斿叧緋昏褰曚笅鏉ワ紝鏀懼埌涓涓崟鐙殑鏂囦歡閲?.pdb)鎴栬呯洿鎺ヨ繛緇撹繘鐩爣紼嬪簭錛岄氳繃鐩存帴璇誨彇璋冭瘯淇℃伅灝辮兘寰楀埌鍒嗛厤鏌愬潡鍐呭瓨鐨勬簮浠g爜鍦ㄥ摢涓枃浠訛紝鍝竴琛屼笂銆備嬌鐢–ode Injection鍜孌ebug Information錛屼嬌BoundsChecker涓嶄絾鑳借褰曞懠鍙垎閰嶅嚱鏁扮殑婧愪唬鐮佺殑浣嶇疆錛岃屼笖榪樿兘璁板綍鍒嗛厤鏃剁殑Call Stack錛屼互鍙奀all Stack涓婄殑鍑芥暟鐨勬簮浠g爜浣嶇疆銆傝繖鍦ㄤ嬌鐢ㄥ儚MFC榪欐牱鐨勭被搴撴椂闈炲父鏈夌敤錛屼互涓嬫垜鐢ㄤ竴涓緥瀛愭潵璇存槑錛?br />
void聽ShowXItemMenu()
{
銆鈥?br />銆CMenu聽menu;

銆menu.CreatePopupMenu();
//add聽menu聽items.
銆menu.TrackPropupMenu();
銆鈥?br />}

void聽ShowYItemMenu(聽)
{
銆鈥?br />銆CMenu聽menu;
銆menu.CreatePopupMenu();
//add聽menu聽items.
銆menu.TrackPropupMenu();
銆menu.Detach();
//this聽will聽cause聽HMENU聽leak
銆鈥?br />}

BOOL聽CMenu::CreatePopupMenu()
{
銆鈥?br />銆hMenu聽
=聽CreatePopupMenu();
銆鈥?br />}
褰撹皟鐢⊿howYItemMenu()鏃訛紝鎴戜滑鏁呮剰閫犳垚HMENU鐨勬硠婕忋備絾鏄紝瀵逛簬BoundsChecker鏉ヨ琚硠婕忕殑HMENU鏄湪class CMenu::CreatePopupMenu()涓垎閰嶇殑銆傚亣璁劇殑浣犵殑紼嬪簭鏈夎澶氬湴鏂逛嬌鐢ㄤ簡CMenu鐨凜reatePopupMenu()鍑芥暟錛屽CMenu::CreatePopupMenu()閫犳垚鐨勶紝浣犱緷鐒舵棤娉曠‘璁ら棶棰樼殑鏍圭粨鍒板簳鍦ㄥ摢閲岋紝鍦⊿howXItemMenu()涓繕鏄湪ShowYItemMenu()涓紝鎴栬呰繕鏈夊叾瀹冪殑鍦版柟涔熶嬌鐢ㄤ簡CreatePopupMenu()錛熸湁浜咰all Stack鐨勪俊鎭紝闂灝卞鏄撲簡銆侭oundsChecker浼氬涓嬫姤鍛婃硠婕忕殑HMENU鐨勪俊鎭細
Function
File
Line

CMenu::CreatePopupMenu
E:\
8168\vc98\mfc\mfc\include\afxwin1.inl
1009

ShowYItemMenu
E:\testmemleak\mytest.cpp
100
銆銆
榪欓噷鐪佺暐浜嗗叾浠栫殑鍑芥暟璋冪敤

濡傛錛屾垜浠緢瀹規(guī)槗鎵懼埌鍙戠敓闂鐨勫嚱鏁版槸ShowYItemMenu()銆傚綋浣跨敤MFC涔嬬被鐨勭被搴撶紪紼嬫椂錛屽ぇ閮ㄥ垎鐨凙PI璋冪敤閮借灝佽鍦ㄧ被搴撶殑class閲岋紝鏈変簡Call Stack淇℃伅錛屾垜浠氨鍙互闈炲父瀹規(guī)槗鐨勮拷韙埌鐪熸鍙戠敓娉勬紡鐨勪唬鐮併?br />
銆銆璁板綍Call Stack淇℃伅浼氫嬌紼嬪簭鐨勮繍琛屽彉寰楅潪甯告參錛屽洜姝ら粯璁ゆ儏鍐典笅BoundsChecker涓嶄細璁板綍Call Stack淇℃伅銆傚彲浠ユ寜鐓т互涓嬬殑姝ラ鎵撳紑璁板綍Call Stack淇℃伅鐨勯夐」寮鍏籌細

銆銆1. 鎵撳紑鑿滃崟錛欱oundsChecker|Setting鈥?

銆銆2. 鍦‥rror Detection欏典腑錛屽湪Error Detection Scheme鐨凩ist涓夋嫨Custom

銆銆3. 鍦–ategory鐨凜ombox涓夋嫨 Pointer and leak error check

銆銆4. 閽╀笂Report Call Stack澶嶉夋

銆銆5. 鐐瑰嚮Ok

銆銆鍩轟簬Code Injection錛孊oundsChecker榪樻彁渚涗簡API Parameter鐨勬牎楠屽姛鑳斤紝memory over run絳夊姛鑳姐傝繖浜涘姛鑳藉浜庣▼搴忕殑寮鍙戦兘闈炲父鏈夌泭銆傜敱浜庤繖浜涘唴瀹逛笉灞炰簬鏈枃鐨勪富棰橈紝鎵浠ヤ笉鍦ㄦ璇﹁堪浜嗐?br />
銆銆灝界BoundsChecker鐨勫姛鑳藉姝ゅ己澶э紝浣嗘槸闈㈠闅愬紡鍐呭瓨娉勬紡浠嶇劧鏄懼緱鑻嶇櫧鏃犲姏銆傛墍浠ユ帴涓嬫潵鎴戜滑鐪嬬湅濡備綍鐢≒erformance Monitor媯嫻嬪唴瀛樻硠婕忋?br />
銆銆浣跨敤Performance Monitor媯嫻嬪唴瀛樻硠婕?br />
銆銆NT鐨勫唴鏍稿湪璁捐榪囩▼涓凡緇忓姞鍏ヤ簡緋葷粺鐩戣鍔熻兘錛屾瘮濡侰PU鐨勪嬌鐢ㄧ巼錛屽唴瀛樼殑浣跨敤鎯呭喌錛孖/O鎿嶄綔鐨勯綣佸害絳夐兘浣滀負涓涓釜Counter錛屽簲鐢ㄧ▼搴忓彲浠ラ氳繃璇誨彇榪欎簺Counter浜嗚В鏁翠釜緋葷粺鐨勬垨鑰呮煇涓繘紼嬬殑榪愯鐘跺喌銆侾erformance Monitor灝辨槸榪欐牱涓涓簲鐢ㄧ▼搴忋?br />
銆銆涓轟簡媯嫻嬪唴瀛樻硠婕忥紝鎴戜滑涓鑸彲浠ョ洃瑙哖rocess瀵硅薄鐨凥andle Count錛孷irutal Bytes 鍜學orking Set涓変釜Counter銆侶andle Count璁板綍浜嗚繘紼嬪綋鍓嶆墦寮鐨凥ANDLE鐨勪釜鏁幫紝鐩戣榪欎釜Counter鏈夊姪浜庢垜浠彂鐜扮▼搴忔槸鍚︽湁Handle娉勬紡錛沄irtual Bytes璁板綍浜嗚榪涚▼褰撳墠鍦ㄨ櫄鍦板潃絀洪棿涓婁嬌鐢ㄧ殑铏氭嫙鍐呭瓨鐨勫ぇ灝忥紝NT鐨勫唴瀛樺垎閰嶉噰鐢ㄤ簡涓ゆ璧扮殑鏂規(guī)硶錛岄鍏堬紝鍦ㄨ櫄鍦板潃絀洪棿涓婁繚鐣欎竴孌電┖闂達紝榪欐椂鎿嶄綔緋葷粺騫舵病鏈夊垎閰嶇墿鐞嗗唴瀛橈紝鍙槸淇濈暀浜嗕竴孌靛湴鍧銆傜劧鍚庯紝鍐嶆彁浜よ繖孌電┖闂達紝榪欐椂鎿嶄綔緋葷粺鎵嶄細鍒嗛厤鐗╃悊鍐呭瓨銆傛墍浠ワ紝Virtual Bytes涓鑸誨ぇ浜庣▼搴忕殑Working Set銆傜洃瑙哣irutal Bytes鍙互甯姪鎴戜滑鍙戠幇涓浜涚郴緇熷簳灞傜殑闂; Working Set璁板綍浜嗘搷浣滅郴緇熶負榪涚▼宸叉彁浜ょ殑鍐呭瓨鐨勬婚噺錛岃繖涓煎拰紼嬪簭鐢寵鐨勫唴瀛樻婚噺瀛樺湪瀵嗗垏鐨勫叧緋伙紝濡傛灉紼嬪簭瀛樺湪鍐呭瓨鐨勬硠婕忚繖涓間細鎸佺畫澧炲姞錛屼絾鏄疺irtual Bytes鍗存槸璺寵穬寮忓鍔犵殑銆?br />
銆銆鐩戣榪欎簺Counter鍙互璁╂垜浠簡瑙h繘紼嬩嬌鐢ㄥ唴瀛樼殑鎯呭喌錛屽鏋滃彂鐢熶簡娉勬紡錛屽嵆浣挎槸闅愬紡鍐呭瓨娉勬紡錛岃繖浜汣ounter鐨勫間篃浼氭寔緇鍔犮備絾鏄紝鎴戜滑鐭ラ亾鏈夐棶棰樺嵈涓嶇煡閬撳摢閲屾湁闂錛屾墍浠ヤ竴鑸嬌鐢≒erformance Monitor鏉ラ獙璇佹槸鍚︽湁鍐呭瓨娉勬紡錛岃屼嬌鐢˙oundsChecker鏉ユ壘鍒板拰瑙e喅銆?br />
銆銆褰揚erformance Monitor鏄劇ず鏈夊唴瀛樻硠婕忥紝鑰孊oundsChecker鍗存棤娉曟嫻嬪埌錛岃繖鏃舵湁涓ょ鍙兘錛氱涓縐嶏紝鍙戠敓浜嗗伓鍙戞у唴瀛樻硠婕忋傝繖鏃朵綘瑕佺‘淇濅嬌鐢≒erformance Monitor鍜屼嬌鐢˙oundsChecker鏃訛紝紼嬪簭鐨勮繍琛岀幆澧冨拰鎿嶄綔鏂規(guī)硶鏄竴鑷寸殑銆傜浜岀錛屽彂鐢熶簡闅愬紡鐨勫唴瀛樻硠婕忋傝繖鏃朵綘瑕侀噸鏂板鏌ョ▼搴忕殑璁捐錛岀劧鍚庝粩緇嗙爺絀禤erformance Monitor璁板綍鐨凜ounter鐨勫肩殑鍙樺寲鍥撅紝鍒嗘瀽鍏朵腑鐨勫彉鍖栧拰紼嬪簭榪愯閫昏緫鐨勫叧緋伙紝鎵懼埌涓浜涘彲鑳界殑鍘熷洜銆傝繖鏄竴涓棝鑻︾殑榪囩▼錛屽厖婊′簡鍋囪銆佺寽鎯熾侀獙璇併佸け璐ワ紝浣嗚繖涔熸槸涓涓Н绱粡楠岀殑緇濆ソ鏈轟細銆?br />
銆銆鎬葷粨

銆銆鍐呭瓨娉勬紡鏄釜澶ц屽鏉傜殑闂錛屽嵆浣挎槸Java鍜?Net榪欐牱鏈塆abarge Collection鏈哄埗鐨勭幆澧冿紝涔熷瓨鍦ㄧ潃娉勬紡鐨勫彲鑳斤紝姣斿闅愬紡鍐呭瓨娉勬紡銆傜敱浜庣瘒騫呭拰鑳藉姏鐨勯檺鍒訛紝鏈枃鍙兘瀵硅繖涓富棰樺仛涓涓矖嫻呯殑鐮旂┒銆傚叾浠栫殑闂錛屾瘮濡傚妯″潡涓嬬殑娉勬紡媯嫻嬶紝濡備綍鍦ㄧ▼搴忚繍琛屾椂瀵瑰唴瀛樹嬌鐢ㄦ儏鍐佃繘琛屽垎鏋愮瓑絳夛紝閮芥槸鍙互娣卞叆鐮旂┒鐨勯鐩傚鏋滄?zhèn)ㄦ湁浠涔堟兂娉曪紝寤鴻鎴栧彂鐜頒簡鏌愪簺閿欒錛屾榪庡拰鎴戜氦嫻併?




]]>
C璇█涓彲鍙樺弬鏁扮殑鐢ㄦ硶 http://www.shnenglu.com/bigsml/archive/2006/10/19/13859.html娉℃場鐗?/dc:creator>娉℃場鐗?/author>Thu, 19 Oct 2006 04:55:00 GMThttp://www.shnenglu.com/bigsml/archive/2006/10/19/13859.htmlhttp://www.shnenglu.com/bigsml/comments/13859.htmlhttp://www.shnenglu.com/bigsml/archive/2006/10/19/13859.html#Feedback1http://www.shnenglu.com/bigsml/comments/commentRss/13859.htmlhttp://www.shnenglu.com/bigsml/services/trackbacks/13859.html
* 1. 鍙彉鍙傛暟鐨勫畯

涓鑸湪璋冭瘯鎵撳嵃Debug 淇℃伅鐨勬椂鍊? 闇瑕佸彲鍙樺弬鏁扮殑瀹? 浠嶤99寮濮嬪彲浠ヤ嬌緙栬瘧鍣ㄦ爣鍑嗘敮鎸佸彲鍙樺弬鏁板畯(variadic macros), 鍙﹀GCC 涔熸敮鎸佸彲鍙樺弬鏁板畯, 浣嗘槸涓ょ鍦ㄧ粏鑺備笂鍙兘瀛樺湪鍖哄埆.

1. __VA_ARGS__

__VA_ARGS__ 灝?..." 浼犻掔粰瀹?濡?br />#define debug(format, ...) fprintf(stderr, fmt, __VA_ARGS__)

鍦℅CC涓篃鏀寔榪欑被琛ㄧず, 浣嗘槸鍦℅++ 涓笉鏀寔榪欎釜琛ㄧず.

2. GCC 鐨勫鏉傚畯

GCC浣跨敤涓縐嶄笉鍚岀殑璇硶浠庤屽彲浠ヤ嬌浣犲彲浠ョ粰鍙彉鍙傛暟涓涓悕瀛楋紝濡傚悓鍏跺畠鍙傛暟涓鏍楓?br />#define debug(format, args...) fprintf (stderr, format, args)

榪欏拰涓婇潰涓劇殑閭d釜瀹氫箟鐨勫畯渚嬪瓙鏄畬鍏ㄤ竴鏍風殑錛屼絾鏄繖涔堝啓鍙鎬ф洿寮哄茍涓旀洿瀹規(guī)槗榪涜鎻忚堪銆?br />
3. ##__VA_ARGS__

涓婇潰涓や釜瀹氫箟鐨勫畯, 濡傛灉鍑虹幇debug("A Message") 鐨勬椂鍊? 鐢變簬瀹忓睍寮鍚庢湁涓浣欑殑閫楀彿, 鎵浠ュ皢瀵艱嚧緙栬瘧閿欒. 涓轟簡瑙e喅榪欎釜闂錛孋PP浣跨敤涓涓壒孌婄殑鈥?#鈥欐搷浣溿?br />
#define debug(format, ...) fprintf (stderr, format, ## __VA_ARGS__)
榪欓噷錛屽鏋滃彲鍙樺弬鏁拌蹇界暐鎴栦負絀猴紝鈥?#鈥欐搷浣滃皢浣塊澶勭悊鍣紙preprocessor錛夊幓闄ゆ帀瀹冨墠闈㈢殑閭d釜閫楀彿銆傚鏋滀綘鍦ㄥ畯璋冪敤鏃訛紝紜疄鎻愪緵浜嗕竴浜涘彲鍙樺弬鏁幫紝GNU CPP涔熶細宸ヤ綔姝e父錛屽畠浼氭妸榪欎簺鍙彉鍙傛暟鏀懼埌閫楀彿鐨勫悗闈€?br />
4. 鍏朵粬鏂規(guī)硶

涓縐嶆祦琛岀殑鎶宸ф槸鐢ㄤ竴涓崟鐙殑鐢ㄦ嫭寮ф嫭璧鋒潵鐨勭殑 "鍙傛暟" 瀹氫箟鍜岃皟鐢ㄥ畯, 鍙傛暟鍦ㄥ畯鎵╁睍鐨勬椂鍊欐垚涓虹被浼?printf() 閭f牱鐨勫嚱鏁扮殑鏁翠釜鍙傛暟鍒楄〃銆?
#define DEBUG(args) (printf("DEBUG: "), printf(args))


* 2. 鍙彉鍙傛暟鐨勫嚱鏁?

鍐欏彲鍙樺弬鏁扮殑C鍑芥暟瑕佸湪紼嬪簭涓敤鍒頒互涓嬭繖浜涘畯:
void va_start( va_list arg_ptr, prev_param )
type va_arg( va_list arg_ptr, type )
void va_end( va_list arg_ptr )

va鍦ㄨ繖閲屾槸variable-argument(鍙彉鍙傛暟)鐨勬剰鎬?榪欎簺瀹忓畾涔夊湪stdarg.h涓?涓嬮潰鎴戜滑鍐欎竴涓畝鍗曠殑鍙彉鍙傛暟鐨勫嚱鏁?璇ュ嚱鏁拌嚦灝戞湁涓涓暣鏁板弬鏁?絎簩涓弬鏁頒篃鏄暣鏁?鏄彲閫夌殑.鍑芥暟鍙槸鎵撳嵃榪欎袱涓弬鏁扮殑鍊?
void simple_va_fun(int i, ...)
{
聽聽 聽va_list arg_ptr;
聽聽 聽int j=0;
聽聽 聽
聽聽 聽va_start(arg_ptr, i);
聽聽 聽j=va_arg(arg_ptr, int);
聽聽 聽va_end(arg_ptr);
聽聽 聽printf("%d %d\n", i, j);
聽聽 聽return;
}

鍦ㄧ▼搴忎腑鍙互榪欐牱璋冪敤:
simple_va_fun(100);
simple_va_fun(100,200);

浠庤繖涓嚱鏁扮殑瀹炵幇鍙互鐪嬪埌,浣跨敤鍙彉鍙傛暟搴旇鏈変互涓嬫楠?
1)棣栧厛鍦ㄥ嚱鏁伴噷瀹氫箟涓涓獀a_list鍨嬬殑鍙橀噺,榪欓噷鏄痑rg_ptr,榪欎釜鍙橀噺鏄寚鍚戝弬鏁扮殑鎸囬拡.
2)鐒跺悗鐢╲a_start瀹忓垵濮嬪寲鍙橀噺arg_ptr,榪欎釜瀹忕殑絎簩涓弬鏁版槸絎竴涓彲鍙樺弬鏁扮殑鍓嶄竴涓弬鏁?鏄竴涓浐瀹氱殑鍙傛暟.
3)鐒跺悗鐢╲a_arg榪斿洖鍙彉鐨勫弬鏁?騫惰祴鍊肩粰鏁存暟j. va_arg鐨勭浜屼釜鍙傛暟鏄綘瑕佽繑鍥炵殑鍙傛暟鐨勭被鍨?榪欓噷鏄痠nt鍨?
4)鏈鍚庣敤va_end瀹忕粨鏉熷彲鍙樺弬鏁扮殑鑾峰彇.鐒跺悗浣犲氨鍙互鍦ㄥ嚱鏁伴噷浣跨敤絎簩涓弬鏁頒簡.濡傛灉鍑芥暟鏈夊涓彲鍙樺弬鏁扮殑,渚濇璋冪敤va_arg鑾峰彇鍚勪釜鍙傛暟.

濡傛灉鎴戜滑鐢ㄤ笅闈笁縐嶆柟娉曡皟鐢ㄧ殑璇?閮芥槸鍚堟硶鐨?浣嗙粨鏋滃嵈涓嶄竴鏍?
1)simple_va_fun(100);
緇撴灉鏄?100 -123456789(浼氬彉鐨勫?
2)simple_va_fun(100,200);
緇撴灉鏄?100 200
3)simple_va_fun(100,200,300);
緇撴灉鏄?100 200

鎴戜滑鐪嬪埌絎竴縐嶈皟鐢ㄦ湁閿欒,絎簩縐嶈皟鐢ㄦ紜?絎笁縐嶈皟鐢ㄥ敖綆$粨鏋滄紜?浣嗗拰鎴戜滑鍑芥暟鏈鍒濈殑璁捐鏈夊啿紿?涓嬮潰涓鑺傛垜浠帰璁ㄥ嚭鐜拌繖浜涚粨鏋滅殑鍘熷洜鍜屽彲鍙樺弬鏁板湪緙栬瘧鍣ㄤ腑鏄浣曞鐞嗙殑.
* 3. 鍙彉鍙傛暟鍑芥暟鍘熺悊

va_start,va_arg,va_end鏄湪stdarg.h涓瀹氫箟鎴愬畯鐨?鐢變簬紜歡騫沖彴鐨勪笉鍚?緙栬瘧鍣ㄧ殑涓嶅悓,鎵浠ュ畾涔夌殑瀹忎篃鏈夋墍涓嶅悓,涓嬮潰浠C++涓璼tdarg.h閲寈86騫沖彴鐨勫畯瀹氫箟鎽樺綍濡備笅:

typedef char * va_list;
#define _INTSIZEOF(n) ((sizeof(n)+sizeof(int)-1)&~(sizeof(int) - 1) )
#define va_start(ap,v) ( ap = (va_list)&v + _INTSIZEOF(v) )
#define va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )
#define va_end(ap) ( ap = (va_list)0 )

瀹氫箟_INTSIZEOF(n)涓昏鏄負浜嗗唴瀛樺榻?C璇█鐨勫嚱鏁版槸浠庡彸鍚戝乏鍘嬪叆鍫嗘爤鐨?璁炬暟鎹繘鏍堟柟鍚戜負浠庨珮鍦板潃鍚戜綆鍦板潃鍙戝睍,鍗抽鍏堝帇鍏ョ殑鏁版嵁鍦ㄩ珮鍦板潃). 涓嬪浘鏄嚱鏁扮殑鍙傛暟鍦ㄥ爢鏍堜腑鐨勫垎甯冧綅緗?

浣庡湴鍧聽聽 聽|-----------------------------|<-- &v
聽聽 聽聽聽 聽|絎琻-1涓弬鏁?鏈鍚庝竴涓浐瀹氬弬鏁?|
聽聽 聽聽聽 聽|-----------------------------|<--va_start鍚巃p鎸囧悜
聽聽 聽聽聽 聽|絎琻涓弬鏁?絎竴涓彲鍙樺弬鏁? |
聽聽 聽聽聽 聽|-----------------------------|
聽聽 聽聽聽 聽|....... |
聽聽 聽聽聽 聽|-----------------------------|
聽聽 聽聽聽 聽|鍑芥暟榪斿洖鍦板潃 |
楂樺湴鍧聽 |-----------------------------|

1. va_list 琚畾涔変負char *
2. va_start 灝嗗湴鍧ap瀹氫箟涓?&v+_INTSIZEOF(v),鑰?amp;v鏄浐瀹氬弬鏁板湪鍫嗘爤鐨勫湴鍧,鎵浠a_start(ap, v)浠ュ悗,ap鎸囧悜絎竴涓彲鍙樺弬鏁板湪鍫嗘爤鐨勫湴鍧
3. va_arg 鍙栧緱綾誨瀷t鐨勫彲鍙樺弬鏁板?浠nt鍨嬩負渚?va_arg鍙杋nt鍨嬬殑榪斿洖鍊?
聽聽 j= ( *(int*)((ap += _INTSIZEOF(int))-_INTSIZEOF(int)) );
4. va_end 浣縜p涓嶅啀鎸囧悜鍫嗘爤,鑰屾槸璺烴ULL涓鏍?榪欐牱緙栬瘧鍣ㄤ笉浼氫負va_end浜х敓浠g爜.

鍦ㄤ笉鍚岀殑鎿嶄綔緋葷粺鍜岀‖浠跺鉤鍙扮殑瀹氫箟鏈変簺涓嶅悓,浣嗗師鐞嗗嵈鏄浉浼肩殑.


* 4. 灝忕粨

瀵逛簬鍙彉鍙傛暟鐨勫嚱鏁?鍥犱負va_start, va_arg, va_end絳夊畾涔夋垚瀹?鎵浠ュ畠鏄懼緱寰堟剼锠?鍙彉鍙傛暟鐨勭被鍨嬪拰涓暟闇瑕佸湪璇ュ嚱鏁頒腑鐢辯▼搴忎唬鐮佹帶鍒?鍙﹀,緙栬瘧鍣ㄥ鍙彉鍙傛暟鐨勫嚱鏁扮殑鍘熷瀷媯鏌ヤ笉澶熶弗鏍?瀵圭紪紼嬫煡閿欎笉鍒?
鎵浠ユ垜浠啓涓涓彲鍙樺嚱鏁扮殑C鍑芥暟鏃?鏈夊埄涔熸湁寮?鎵浠ュ湪涓嶅繀瑕佺殑鍦哄悎,鏃犻渶鐢ㄥ埌鍙彉鍙傛暟.濡傛灉鍦–++閲?鎴戜滑搴旇鍒╃敤C++鐨勫鎬佹ф潵瀹炵幇鍙彉鍙傛暟鐨勫姛鑳?灝介噺閬垮厤鐢–璇█鐨勬柟寮忔潵瀹炵幇.


* 5. 闄勪竴浜涗唬鐮?br />
#define debug(format, ...) fprintf(stderr, fmt, __VA_ARGS__)
#define debug(format, args...) fprintf (stderr, format, args)
#define debug(format, ...) fprintf (stderr, format, ## __VA_ARGS__)

// 浣跨敤va... 瀹炵幇
void debug(const char *fmt, ...)
{
聽聽聽 int nBuf;
聽聽聽 char szBuffer[1024];
聽聽聽 va_list args;

聽聽聽 va_start(args, fmt);
聽聽聽 nBuf = vsprintf(szBuffer, fmt, args) ;
聽聽聽 assert(nBuf >= 0);

聽聽聽 printf("QDOGC ERROR:%s\n",szBuffer);
聽聽聽 va_end(args);
}



]]>
閫氳繃渚嬪瓙瀛︿範 CPPUnit http://www.shnenglu.com/bigsml/archive/2006/10/18/13836.html娉℃場鐗?/dc:creator>娉℃場鐗?/author>Wed, 18 Oct 2006 12:59:00 GMThttp://www.shnenglu.com/bigsml/archive/2006/10/18/13836.htmlhttp://www.shnenglu.com/bigsml/comments/13836.htmlhttp://www.shnenglu.com/bigsml/archive/2006/10/18/13836.html#Feedback0http://www.shnenglu.com/bigsml/comments/commentRss/13836.htmlhttp://www.shnenglu.com/bigsml/services/trackbacks/13836.html
class聽SimpleCalcTest聽:聽public聽CPPUNIT_NS::TestFixture
{
聽聽聽聽CPPUNIT_TEST_SUITE(聽SimpleCalcTest聽);
聽聽聽聽CPPUNIT_TEST(聽testAdd聽);
聽聽聽聽CPPUNIT_TEST(聽testSub聽);
聽聽聽聽CPPUNIT_TEST(聽testMul);
聽聽聽聽CPPUNIT_TEST(聽testDiv聽);
聽聽聽聽CPPUNIT_TEST_SUITE_END();

private聽:
聽聽聽聽SimpleCalculator聽
*聽sc;

public:
聽聽聽聽
virtualvoid聽setUp()
聽聽聽聽{
聽聽聽聽聽聽聽聽sc聽
=new聽SimpleCalculator();
聽聽聽聽}
聽聽聽聽
virtualvoid聽tearDown()
聽聽聽聽{
聽聽聽聽聽聽聽聽delete聽sc;
聽聽聽聽}

聽聽聽聽
void聽testAdd(){
聽聽聽聽聽聽聽聽CPPUNIT_ASSERT_EQUAL(聽sc
->add(5,6),聽11);
聽聽聽聽}

聽聽聽聽
void聽testSub(){
聽聽聽聽聽聽聽聽CPPUNIT_ASSERT_EQUAL(聽sc
->sub(5,6),聽-1聽);
聽聽聽聽}

聽聽聽聽
void聽testMul(){
聽聽聽聽聽聽聽聽CPPUNIT_ASSERT_EQUAL(聽sc
->mul(5,6),聽30聽);
聽聽聽聽}

聽聽聽聽
void聽testDiv(){
聽聽聽聽聽聽聽聽CPPUNIT_ASSERT_EQUAL(聽sc
->div(12,6),聽2聽);
聽聽聽聽}
};

//聽鎶婅繖涓猅estSuite娉ㄥ唽鍒板悕瀛椾負"alltest"鐨凾estSuite涓?聽濡傛灉娌℃湁瀹氫箟浼氳嚜鍔ㄥ畾涔?br />//聽涔熷彲浠PPUNIT_TEST_SUITE_REGISTRATION(聽MathTest聽);娉ㄥ唽鍒板叏灞鐨勪竴涓湭鍛藉悕鐨凾estSuite涓?
CPPUNIT_TEST_SUITE_REGISTRATION(聽SimpleCalcTest,聽"alltest"聽);

int聽main()
{
聽聽聽聽CPPUNIT_NS::TestResult聽r;
聽聽聽聽CPPUNIT_NS::TestResultCollector聽result;
聽聽聽聽r.addListener(聽
&result聽);
聽聽聽聽
聽聽聽聽
//聽浠庢敞鍐岀殑TestSuite涓幏鍙栫壒瀹氱殑TestSuite,聽娌℃湁鍙傛暟鑾峰彇鍏ㄥ眬鐨勬湭鍛藉悕鐨凾estSuite.
聽聽聽聽CPPUNIT_NS::TestFactoryRegistry::getRegistry("alltest").makeTest()->run(聽&r聽);
聽聽聽聽CPPUNIT_NS::TextOutputter聽
out(聽&result,聽std::cout聽);
聽聽聽聽
out.write();
聽聽聽聽
return0;
}

浠庝笂闈㈢殑浠g爜鍙互鐪嬪埌, 浣跨敤CPPUnit 涓昏鏄袱涓楠?
1. 鍒涘緩TestSuite
棣栧厛浠嶤PPUNIT_NS::TestFixture 鐢熸垚涓涓瓙綾? 鐒跺悗鐢ㄥ畯 CPPUNIT_TEST_SUITE, CPPUNIT_TEST, CPPUNIT_TEST_SUITE_END 鏉ュ畾涔夎嫻嬭瘯鐨勫悇涓皬鍗曞厓, 騫朵笖瀹炵幇CPPUNIT_TEST 涓畾涔夌殑綾誨嚱鏁? 鍦ㄦ瘡涓被鍑芥暟涓嬌鐢?CPPUNIT_ASSERT, CPPUNIT_ASSERT_MESSAGE, CPPUNIT_FAIL, CPPUNIT_ASSERT_EQUAL, CPPUNIT_ASSERT_EQUAL_MESSAGE, CPPUNIT_ASSERT_DOUBLES_EQUAL 絳夋潵瀵圭粨鏋滆繘琛屾柇璦.

鐒跺悗閫氳繃瀹?CPPUNIT_TEST_SUITE_REGISTRATION 灝嗘祴璇曠被娉ㄥ唽鍒癟estSuite涓?

2. Main
鍦╩ain紼嬪簭涓TestSuite 榪涜嫻嬭瘯.


CPPUnit鐨勬洿璇︾粏鐨勮祫鏂欏彲浠ユ煡鐪?
IBM 鐨?渚垮埄鐨勫紑鍙戝伐鍏?CppUnit 蹇熶嬌鐢ㄦ寚鍗?/a>聽 姣旇緝璇︾粏鐨勪粙緇嶄簡CppUnit
VCKBase鐨?
CppUnit嫻嬭瘯妗嗘灦鍏ラ棬 璇︾粏鐨勪粙緇嶄簡VC6涓婱FC Dialog涓嬬殑CPPUnit鐨勪嬌鐢?br />CSDN 鐨?濡備綍浣跨敤CppUnit鍋氬崟鍏冩祴璇?/a> 浠嬬粛浜哣C6鐨凪FC 涓嬬殑CPPUnit鐨勪嬌鐢? 鍜孷CKBase鐨勫疄鐜扮◢寰湁鐐瑰樊鍒?br />Meng Yan ( 瀛熷博 ) 鐨勬枃绔?CPPUnit Lite 瀵笴PPUnit鐨勪嬌鐢ㄥ拰瀹忚繘琛屼簡綆鍗曠殑鍒嗘瀽





]]>
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
      <noscript id="pjuwb"></noscript>
            <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
              <dd id="pjuwb"></dd>
              <abbr id="pjuwb"></abbr>
              99精品久久免费看蜜臀剧情介绍| 91久久久久| 久久成人在线| 欧美一区日本一区韩国一区| 狠狠网亚洲精品| 欧美激情精品| 欧美日韩另类视频| 午夜欧美精品久久久久久久| 亚洲欧美在线播放| 亚洲成人在线| 亚洲精品一区二区三区不| 国产精品女人久久久久久| 欧美一区二区成人| 久久欧美中文字幕| 一区二区三区久久久| 亚洲女ⅴideoshd黑人| 加勒比av一区二区| 日韩视频在线免费观看| 国产精品一区免费在线观看| 美日韩精品免费| 欧美日韩免费观看一区二区三区| 中文精品视频| 欧美一区二区在线观看| 日韩手机在线导航| 欧美亚洲一级片| 中国女人久久久| 久久久久久999| 欧美日韩一区二区三区四区在线观看 | 久久精品视频一| 一区二区日韩欧美| 久久精品成人一区二区三区蜜臀 | 午夜精品视频在线| 欧美1区2区| 久久精品99国产精品酒店日本| 免费在线成人| 久久裸体艺术| 国产精品视频一二三| 亚洲国产精品综合| 国产综合在线看| 亚洲图片你懂的| 日韩一区二区高清| 久久久久国产成人精品亚洲午夜| 中文精品一区二区三区| 欧美大片一区二区三区| 久久精品导航| 国产美女一区二区| 亚洲网站在线| 中日韩美女免费视频网址在线观看 | 亚洲视频在线观看免费| 麻豆乱码国产一区二区三区| 久久国产精品高清| 国产精品人人爽人人做我的可爱| 亚洲精品国产精品国自产在线| 精品999网站| 欧美在线高清| 久久视频在线视频| 黑人操亚洲美女惩罚| 欧美一区二区三区成人| 欧美一级在线播放| 国产精品视频久久一区| 中文在线资源观看网站视频免费不卡 | 欧美极品在线播放| 亚洲国产精品一区| 亚洲精品免费一二三区| 欧美不卡视频一区| 亚洲国产日韩欧美在线图片| 亚洲免费久久| 欧美日韩亚洲一区二| 日韩亚洲精品电影| 亚洲欧美日韩一区在线| 国产精品乱码人人做人人爱| 亚洲在线中文字幕| 欧美专区第一页| 国产一区深夜福利| 久久亚洲风情| 一区二区免费在线视频| 欧美三级午夜理伦三级中视频| 99国产一区| 欧美一区二区三区免费观看| 国产精品爽爽爽| 久久成人精品无人区| 你懂的国产精品| 99国产精品久久久久老师| 欧美日韩在线直播| 性色av一区二区怡红| 欧美大胆a视频| 亚洲视频每日更新| 国产在线视频欧美| 欧美大秀在线观看| 在线亚洲一区| 鲁大师成人一区二区三区| 亚洲精品国产视频| 国产噜噜噜噜噜久久久久久久久| 久久久综合网| 在线天堂一区av电影| 久久久久久亚洲精品不卡4k岛国| 亚洲国产天堂久久国产91| 欧美理论片在线观看| 亚洲性视频网址| 欧美成人一区二区在线| 亚洲欧美激情诱惑| 亚洲激情在线| 国产人成一区二区三区影院| 玖玖精品视频| 亚洲欧美日韩国产精品| 亚洲福利一区| 久久国产精品久久久久久| 亚洲欧洲一区二区天堂久久| 国产精品揄拍500视频| 欧美日韩国产色站一区二区三区| 欧美一级久久| 亚洲视频在线一区观看| 亚洲高清免费在线| 久久另类ts人妖一区二区| 亚洲综合好骚| 一区二区三区欧美激情| 在线观看精品| 国产亚洲成av人片在线观看桃| 欧美黄色aa电影| 久久久久久69| 久久精品国产久精国产爱| 亚洲视频网站在线观看| 91久久精品国产91久久| 欧美成人免费网站| 久久久久久久精| 欧美一区二区三区视频免费播放| 日韩亚洲精品电影| 亚洲国产三级| 亚洲国产成人av| 影音先锋久久精品| 国产一区日韩一区| 国产一区二区三区精品欧美日韩一区二区三区 | 在线一区二区三区四区| 亚洲精品在线视频观看| 在线看日韩欧美| 国产综合香蕉五月婷在线| 国产亚洲激情视频在线| 国产精品一区二区三区久久 | 欧美插天视频在线播放| 久久免费精品日本久久中文字幕| 欧美在线国产精品| 欧美亚洲综合久久| 久久超碰97人人做人人爱| 欧美一区二区三区在线看| 久久久久久夜精品精品免费| 久久精品五月婷婷| 久久偷窥视频| 老司机aⅴ在线精品导航| 久久影院午夜片一区| 美女黄毛**国产精品啪啪| 美国十次成人| 亚洲国产天堂久久综合网| 亚洲激情在线| 亚洲少妇最新在线视频| 亚洲欧美成人一区二区在线电影 | 亚洲欧洲精品成人久久奇米网| 亚洲精品久久7777| 一区二区三区免费观看| 亚洲综合大片69999| 午夜影视日本亚洲欧洲精品| 欧美综合二区| 免费在线亚洲欧美| 国产精品v欧美精品v日本精品动漫| 国产精品久久久久999| 国内精品视频在线播放| 亚洲精品日产精品乱码不卡| 在线视频精品| 久久久久久一区二区三区| 亚洲国产精品久久久久秋霞不卡| 夜夜嗨av色一区二区不卡| 亚洲欧美一区二区三区在线| 久久欧美中文字幕| 国产精品ⅴa在线观看h| 韩国一区电影| 亚洲私拍自拍| 欧美成人亚洲成人| 中文欧美日韩| 蜜桃av一区二区| 国产精品永久入口久久久| 亚洲高清视频中文字幕| 亚洲一区在线看| 欧美大片一区二区三区| 亚洲私人黄色宅男| 欧美aⅴ一区二区三区视频| 欧美亚一区二区| 亚洲高清在线播放| 久久国产精品久久久| 日韩天堂在线视频| 久久视频免费观看| 国产精品免费视频观看| 亚洲人成网站在线播| 久久国产精品久久久| 99视频国产精品免费观看| 久久人人97超碰精品888 | 久久久爽爽爽美女图片| 国产精品国产三级国产专播品爱网| 亚洲国产精品999| 久久国内精品自在自线400部| 一区二区三区高清视频在线观看| 久久综合电影一区|