﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-ngaut</title><link>http://www.cppblog.com/ngaut/</link><description>asm/c/c++/......</description><language>zh-cn</language><lastBuildDate>Sun, 05 Jul 2009 17:24:22 GMT</lastBuildDate><pubDate>Sun, 05 Jul 2009 17:24:22 GMT</pubDate><ttl>60</ttl><item><title>.net winform ListView操作</title><link>http://www.cppblog.com/ngaut/archive/2009/05/31/86276.html</link><dc:creator>ngaut</dc:creator><author>ngaut</author><pubDate>Sun, 31 May 2009 08:25:00 GMT</pubDate><guid>http://www.cppblog.com/ngaut/archive/2009/05/31/86276.html</guid><wfw:comment>http://www.cppblog.com/ngaut/comments/86276.html</wfw:comment><comments>http://www.cppblog.com/ngaut/archive/2009/05/31/86276.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ngaut/comments/commentRss/86276.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ngaut/services/trackbacks/86276.html</trackback:ping><description><![CDATA[<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;Form1_Load(</span><span style="COLOR: #0000ff">object</span><span style="COLOR: #000000">&nbsp;sender,&nbsp;EventArgs&nbsp;e)<br><img id=Codehighlighter1_60_102_Open_Image onclick="this.style.display='none'; Codehighlighter1_60_102_Open_Text.style.display='none'; Codehighlighter1_60_102_Closed_Image.style.display='inline'; Codehighlighter1_60_102_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_60_102_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_60_102_Closed_Text.style.display='none'; Codehighlighter1_60_102_Open_Image.style.display='inline'; Codehighlighter1_60_102_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_60_102_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_60_102_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CreateMyListView();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;CreateMyListView()<br><img id=Codehighlighter1_153_3391_Open_Image onclick="this.style.display='none'; Codehighlighter1_153_3391_Open_Text.style.display='none'; Codehighlighter1_153_3391_Closed_Image.style.display='inline'; Codehighlighter1_153_3391_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_153_3391_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_153_3391_Closed_Text.style.display='none'; Codehighlighter1_153_3391_Open_Image.style.display='inline'; Codehighlighter1_153_3391_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_153_3391_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_153_3391_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Create&nbsp;a&nbsp;new&nbsp;ListView&nbsp;control.</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ListView&nbsp;listView1&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;ListView();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;listView1.Bounds&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;Rectangle(</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;Point(</span><span style="COLOR: #000000">10</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">10</span><span style="COLOR: #000000">),&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;Size(</span><span style="COLOR: #000000">300</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">200</span><span style="COLOR: #000000">));<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Set&nbsp;the&nbsp;view&nbsp;to&nbsp;show&nbsp;details.</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;listView1.View&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;View.Details;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Allow&nbsp;the&nbsp;user&nbsp;to&nbsp;edit&nbsp;item&nbsp;text.</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;listView1.LabelEdit&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Allow&nbsp;the&nbsp;user&nbsp;to&nbsp;rearrange&nbsp;columns.</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;listView1.AllowColumnReorder&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Display&nbsp;check&nbsp;boxes.&nbsp;是否显示复选框</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;listView1.CheckBoxes&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Select&nbsp;the&nbsp;item&nbsp;and&nbsp;subitems&nbsp;when&nbsp;selection&nbsp;is&nbsp;made.&nbsp;是否选中整行</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;listView1.FullRowSelect&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Display&nbsp;grid&nbsp;lines.&nbsp;是否显示网格</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;listView1.GridLines&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Sort&nbsp;the&nbsp;items&nbsp;in&nbsp;the&nbsp;list&nbsp;in&nbsp;ascending&nbsp;order.&nbsp;升序还是降序</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;listView1.Sorting&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;SortOrder.Ascending;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Create&nbsp;three&nbsp;items&nbsp;and&nbsp;three&nbsp;sets&nbsp;of&nbsp;subitems&nbsp;for&nbsp;each&nbsp;item.</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ListViewItem&nbsp;item1&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;ListViewItem(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">item1</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Place&nbsp;a&nbsp;check&nbsp;mark&nbsp;next&nbsp;to&nbsp;the&nbsp;item.&nbsp;复选框是否选中</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;item1.Checked&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;item1.SubItems.Add(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;item1.SubItems.Add(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;item1.SubItems.Add(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ListViewItem&nbsp;item2&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;ListViewItem(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">item2</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;item2.SubItems.Add(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;item2.SubItems.Add(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">5</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;item2.SubItems.Add(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">6</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ListViewItem&nbsp;item3&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;ListViewItem(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">item3</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Place&nbsp;a&nbsp;check&nbsp;mark&nbsp;next&nbsp;to&nbsp;the&nbsp;item.</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;item3.Checked&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;item3.SubItems.Add(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">7</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;item3.SubItems.Add(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">8</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;item3.SubItems.Add(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">9</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Create&nbsp;columns&nbsp;for&nbsp;the&nbsp;items&nbsp;and&nbsp;subitems.</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;listView1.Columns.Add(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Item&nbsp;Column</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">,&nbsp;HorizontalAlignment.Left);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;listView1.Columns.Add(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Column&nbsp;2</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">,&nbsp;HorizontalAlignment.Left);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;listView1.Columns.Add(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Column&nbsp;3</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">,&nbsp;HorizontalAlignment.Left);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;listView1.Columns.Add(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Column&nbsp;4</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">,&nbsp;HorizontalAlignment.Center);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">Add&nbsp;the&nbsp;items&nbsp;to&nbsp;the&nbsp;ListView.</span><span style="COLOR: #008000"><br><img id=Codehighlighter1_2276_2298_Open_Image onclick="this.style.display='none'; Codehighlighter1_2276_2298_Open_Text.style.display='none'; Codehighlighter1_2276_2298_Closed_Image.style.display='inline'; Codehighlighter1_2276_2298_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_2276_2298_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_2276_2298_Closed_Text.style.display='none'; Codehighlighter1_2276_2298_Open_Image.style.display='inline'; Codehighlighter1_2276_2298_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;listView1.Items.AddRange(</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;ListViewItem[]&nbsp;</span><span id=Codehighlighter1_2276_2298_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_2276_2298_Open_Text><span style="COLOR: #000000">{&nbsp;item1,&nbsp;item2,&nbsp;item3&nbsp;}</span></span><span style="COLOR: #000000">);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Create&nbsp;two&nbsp;ImageList&nbsp;objects.</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ImageList&nbsp;imageListSmall&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;ImageList();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ImageList&nbsp;imageListLarge&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;ImageList();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Initialize&nbsp;the&nbsp;ImageList&nbsp;objects&nbsp;with&nbsp;bitmaps.</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;imageListSmall.Images.Add(Bitmap.FromFile(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">C:\\MySmallImage1.bmp</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">));<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;imageListSmall.Images.Add(Bitmap.FromFile(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">C:\\MySmallImage2.bmp</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">));<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;imageListLarge.Images.Add(Bitmap.FromFile(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">C:\\MyLargeImage1.bmp</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">));<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;imageListLarge.Images.Add(Bitmap.FromFile(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">C:\\MyLargeImage2.bmp</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">));<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">Assign&nbsp;the&nbsp;ImageList&nbsp;objects&nbsp;to&nbsp;the&nbsp;ListView.</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;listView1.LargeImageList&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;imageListLarge;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;listView1.SmallImageList&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;imageListSmall;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">大图标<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">listView1.View&nbsp;=&nbsp;View.LargeIcon;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">小图标<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">listView1.View&nbsp;=&nbsp;View.SmallIcon;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">列表<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">listView1.View&nbsp;=&nbsp;View.List;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">详细信息</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;listView1.View&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;View.Details;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Add&nbsp;the&nbsp;ListView&nbsp;to&nbsp;the&nbsp;control&nbsp;collection.</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.Controls.Add(listView1);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></div>
<img src ="http://www.cppblog.com/ngaut/aggbug/86276.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ngaut/" target="_blank">ngaut</a> 2009-05-31 16:25 <a href="http://www.cppblog.com/ngaut/archive/2009/05/31/86276.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DbEntry.net 对事务的处理</title><link>http://www.cppblog.com/ngaut/archive/2009/04/05/78990.html</link><dc:creator>ngaut</dc:creator><author>ngaut</author><pubDate>Sun, 05 Apr 2009 01:37:00 GMT</pubDate><guid>http://www.cppblog.com/ngaut/archive/2009/04/05/78990.html</guid><wfw:comment>http://www.cppblog.com/ngaut/comments/78990.html</wfw:comment><comments>http://www.cppblog.com/ngaut/archive/2009/04/05/78990.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ngaut/comments/commentRss/78990.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ngaut/services/trackbacks/78990.html</trackback:ping><description><![CDATA[public void UsingTransaction(IsolationLevel il, CallbackVoidHandler callback)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (Scope&lt;ConnectionContext&gt;.Current != null)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ConnectionContext et = Scope&lt;ConnectionContext&gt;.Current;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (et.IsolationLevel == il)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; callback();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NewTransaction(callback);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void NewTransaction(CallbackVoidHandler callback)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NewTransaction(IsolationLevel.ReadCommitted, callback);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void NewTransaction(IsolationLevel il, CallbackVoidHandler callback)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NewConnection(delegate<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ConnectionContext cc = ConProvider;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cc.BeginTransaction(il);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OnBeginTransaction();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; callback();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cc.Commit();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OnCommittedTransaction();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cc.Rollback();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; finally<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OnTransactionError();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; });<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br><img src ="http://www.cppblog.com/ngaut/aggbug/78990.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ngaut/" target="_blank">ngaut</a> 2009-04-05 09:37 <a href="http://www.cppblog.com/ngaut/archive/2009/04/05/78990.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>受经济危机影响，开始变卖家产</title><link>http://www.cppblog.com/ngaut/archive/2009/02/08/73229.html</link><dc:creator>ngaut</dc:creator><author>ngaut</author><pubDate>Sun, 08 Feb 2009 12:45:00 GMT</pubDate><guid>http://www.cppblog.com/ngaut/archive/2009/02/08/73229.html</guid><wfw:comment>http://www.cppblog.com/ngaut/comments/73229.html</wfw:comment><comments>http://www.cppblog.com/ngaut/archive/2009/02/08/73229.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ngaut/comments/commentRss/73229.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ngaut/services/trackbacks/73229.html</trackback:ping><description><![CDATA[<p style="FONT-SIZE: 14pt">自己以前购买的一些书籍，一律五折，三本起购，运费20&nbsp; 顺丰快递<br></p>
<p style="FONT-SIZE: 14pt">visual c++ 网络游戏建模与实现 第2版 苏羽 关沫 许研 科学出版社 36元<br>分布式操作系统 (美)Andrew S.Tanenbaum著 陆丽娜 伍卫国 刘隆国等译 电子工业出版社 45元<br>visual c#2005 程序开发与界面设计秘诀 章立民 机械工业出版社 78元(附光盘)<br>现代编译程序实现 java语言 第二版 影印版 高等教育出版社 38元<br>计算机组成原理 第三版 网络版 白中英主编 科学出版社 33元<br>软件加密原理与应用 飞天诚信编著 电子工业出版社 55元<br>数据结构与算法分析 c语言描述 (美)Mark Allen Weiss著 冯舜玺译 机械工业出版社 35元<br>编译器构造 C语言描述(英文版) (美)查尔斯 N.费希尔 小查理德 J.勒布朗 著 机械工业出版社 79元<br>编译原理 技术与工具(compilers principles,Techniques,&amp;Tools) 第二版 英文版 (美)Alfred V.Aho&nbsp;Monica S.Lam &nbsp;Ravi Sethi Jeffrey D.Ullman著 人民邮电出版社 79元<br>程序员修炼之道(影印版) (美)Andrew Hunt David Thomas 著 中国电力出版社 39元<br>托马斯微积分 第10版 FINNEY WEIR GIORDANO 叶其孝 王耀东 唐兢 译 高等教育出版社 88元<br>脚本驱动的应用软件开发方法与实践 陆其明编著 清华大学出版社 38元<br>游戏之旅--我的编程感悟 云风 著 电子工业出版社 46元<br>c++高级编程 (美)Nicholas A.Solter Scott J.Kleper 著 刘鑫 杨健康 等译 机械工业出版社 88元<br>从问题到程序 程序设计与c语言引论 裘宗燕 机械工业出版社 36元<br>游戏脚本高级编程 Alex Varanese 陈洪等译&nbsp; 清华大学出版社 98元 附光盘 <br></p>
<p style="FONT-SIZE: 14pt">职业经理人常犯的11钟错误 余世维 中国社会出版社 38元<br>马云点评创业 &lt;&lt;赢在中国&gt;&gt;项目组 中国民主法制出版社 38元<br>有效沟通细节训练&nbsp;&nbsp; 陈玲 企业管理出版社 35元<br>朱自清散文经典 中国文史出版社&nbsp; 36元<br>托马斯微积分 影印版 第十版 高等教育出版社 上下册95元<br>重温微积分&nbsp; 齐民友&nbsp; 高等教育出版社 39.6元<br>低成本为王&nbsp; 赵为民 饶润平 世界知识出版社 29.8元<br>真北 刘祥亚译 广东省出版集团 42元<br>我的特种生涯 猎鹰 东方出版社 26元&nbsp; <br></p>
<p style="FONT-SIZE: 14pt"><br>联系方式 qq: 112339223</p>
<img src ="http://www.cppblog.com/ngaut/aggbug/73229.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ngaut/" target="_blank">ngaut</a> 2009-02-08 20:45 <a href="http://www.cppblog.com/ngaut/archive/2009/02/08/73229.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>对ucc编译器中分析typedef声明的一点笔记</title><link>http://www.cppblog.com/ngaut/archive/2008/12/28/70559.html</link><dc:creator>ngaut</dc:creator><author>ngaut</author><pubDate>Sun, 28 Dec 2008 03:47:00 GMT</pubDate><guid>http://www.cppblog.com/ngaut/archive/2008/12/28/70559.html</guid><wfw:comment>http://www.cppblog.com/ngaut/comments/70559.html</wfw:comment><comments>http://www.cppblog.com/ngaut/archive/2008/12/28/70559.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ngaut/comments/commentRss/70559.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ngaut/services/trackbacks/70559.html</trackback:ping><description><![CDATA[<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">typedef&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;a;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">a是TypedefNames，作用域为all&nbsp;the&nbsp;scope<br></span><span style="color: #008000;">//</span><span style="color: #008000;">overload：表示在嵌套作用域中，类型定义名是否作为变量，而不是类型名</span><span style="color: #008000;"><br></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;f(</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;a)&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">由于之前a已经是typedef了，所以这里标记为overload,&nbsp;<br></span><span style="color: #008000;">//</span><span style="color: #008000;">那么在函数f的作用域中只能作为变量，而不是类型名,那么下面用a作为类型来定义变量都是语法错误</span><span style="color: #008000;"><br></span><span style="color: #000000;">{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">语法分析时typedef是声明，a已经被声明为char了，所以这里报告a重声明了<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">typedef&nbsp;char&nbsp;a;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">%c</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;a);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>}<br><br></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;main()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;typedef&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;a;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">在mian的作用域里面，a就是char&nbsp;*类型了</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;a&nbsp;x&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">void</span><span style="color: #000000;">*</span><span style="color: #000000;">)</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">Hello,&nbsp;World&nbsp;%c\n</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>}</span></div>
<br>引用ucc的文档：<br>在大多数情况下，C语言是一个LL(0)文法，解析器可以根据当前的记号而决定与什么产生式和非终结符匹配。但是由于C语言引入了类型定义而破坏了这个特性。比如说在复合语句中遇到一个标识符，如果是类型定义名，则应该为声明，否则为语句。为了简洁性，ucc将语法分析和语义检查分成两个独立的阶段，但是类型定义又要求在语法分析中做一定的语义检查，为此，ucc在语法分析中对于类型定义做最小的检查。对于语法分析器来说，只要知道一个标识符是类型定义名就足够了，而不需要知道具体的类型。<br>语法分析中用以进行语义检查的数据结构和算法如下：<br>typedef struct tdname<br>{<br>&nbsp;&nbsp;&nbsp; char *id;<br>&nbsp;&nbsp;&nbsp; int level;<br>&nbsp;&nbsp;&nbsp; int overload;<br>} *TDName;<br>tdname表示一个类型定义名。<br>&nbsp;id： 名字<br>&nbsp;level： 类型定义名被定义点的嵌套层次，文件作用域的嵌套层次为0，复合语句的起始处嵌套层次加1，复合语句的结束处嵌套层次减1。有可能在多个作用域中定义同一个类型定义名，level表示这些作用域中嵌套层次最小的。比如说对于如下代码片段：<br>typedef int a;<br>int f(void)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp; typedef int a;<br>}<br>其中level值应为0。这样在其它函数中a的定义也是可见的。<br>overload：表示在嵌套作用域中，类型定义名是否作为变量，而不是类型名。比如如下代码片段：<br>typedef int a;<br>int f(int a)<br>{<br>}<br>在f的函数定义中，a是参数，而不是类型定义名。<br>ucc使用两个向量：TypedefNames记录了所有定义的类型名。OverloadNames记录当前作用域中被重载了的类型名。<br>对于每一个声明，调用CheckTypedefName函数，如果该声明属于类型定义，则查看相应的类型名是否存在，如果不存在，则加入新的类型定义，如果存在，修改level为最小的嵌套层次。如果该声明不属于类型定义并且该声明所定义的变量已定义为外部作用域的类型名，则标记该类型名被重载，并且将其加入OverloadNames中。<br>每当一个复合语句结束时，重置OverloadNames中的所有类型名的重载状态。<br><br><img src ="http://www.cppblog.com/ngaut/aggbug/70559.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ngaut/" target="_blank">ngaut</a> 2008-12-28 11:47 <a href="http://www.cppblog.com/ngaut/archive/2008/12/28/70559.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>gPXE源码笔记</title><link>http://www.cppblog.com/ngaut/archive/2008/12/17/69690.html</link><dc:creator>ngaut</dc:creator><author>ngaut</author><pubDate>Wed, 17 Dec 2008 14:31:00 GMT</pubDate><guid>http://www.cppblog.com/ngaut/archive/2008/12/17/69690.html</guid><wfw:comment>http://www.cppblog.com/ngaut/comments/69690.html</wfw:comment><comments>http://www.cppblog.com/ngaut/archive/2008/12/17/69690.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ngaut/comments/commentRss/69690.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ngaut/services/trackbacks/69690.html</trackback:ping><description><![CDATA[<p>随手记下的<br><br>系统入口:<br>src\core\Main.c中的main函数，重点关注其中的autoboot()函数<br>autoboot函数中重点关注netboot()函数，改函数实现如下：</p>
<p><br>/**<br>&nbsp;* Boot from a network device<br>&nbsp;*<br>&nbsp;* @v netdev&nbsp;&nbsp;Network device<br>&nbsp;* @ret rc&nbsp;&nbsp;Return status code<br>&nbsp;*/<br>static int netboot ( struct net_device *netdev ) {<br>&nbsp;char buf[256];<br>&nbsp;struct in_addr next_server;<br>&nbsp;int rc;</p>
<p>&nbsp;/* Open device and display device status */<br>&nbsp;if ( ( rc = ifopen ( netdev ) ) != 0 )<br>&nbsp;&nbsp;return rc;<br>&nbsp;ifstat ( netdev );</p>
<p>&nbsp;/* Wait for link-up */<br>&nbsp;printf ( "Waiting for link-up on %s...", netdev-&gt;name );<br>&nbsp;if ( ( rc = iflinkwait ( netdev, LINK_WAIT_MS ) ) != 0 ) {<br>&nbsp;&nbsp;printf ( " no link detected\n" );<br>&nbsp;&nbsp;return rc;<br>&nbsp;}<br>&nbsp;printf ( " ok\n" );</p>
<p>&nbsp;/* Configure device via DHCP */<br>&nbsp;if ( ( rc = dhcp ( netdev ) ) != 0 )<br>&nbsp;&nbsp;return rc;<br>&nbsp;route();</p>
<p>&nbsp;/* Try to boot an embedded image if we have one */<br>&nbsp;rc = boot_embedded_image ();<br>&nbsp;if ( rc != ENOENT )<br>&nbsp;&nbsp;return rc;</p>
<p>&nbsp;/* Try to download and boot whatever we are given as a filename */<br>&nbsp;fetch_ipv4_setting ( NULL, &amp;next_server_setting, &amp;next_server );<br>&nbsp;fetch_string_setting ( NULL, &amp;filename_setting, buf, sizeof ( buf ) );<br>&nbsp;if ( buf[0] ) {<br>&nbsp;&nbsp;printf ( "Booting from filename \"%s\"\n", buf );<br>&nbsp;&nbsp;return boot_next_server_and_filename ( next_server, buf );<br>&nbsp;}<br>&nbsp;<br>&nbsp;/* No filename; try the root path */<br>&nbsp;fetch_string_setting ( NULL, &amp;root_path_setting, buf, sizeof ( buf ) );<br>&nbsp;if ( buf[0] ) {<br>&nbsp;&nbsp;printf ( "Booting from root path \"%s\"\n", buf );<br>&nbsp;&nbsp;return boot_root_path ( buf );<br>&nbsp;}</p>
<p>&nbsp;printf ( "No filename or root path specified\n" );<br>&nbsp;return -ENOENT;<br>}</p>
<p>关注其中的boot_next_server_and_filename()函数, 该函数实现如下：<br>/**<br>&nbsp;* Boot using next-server and filename<br>&nbsp;*<br>&nbsp;* @v filename&nbsp;&nbsp;Boot filename<br>&nbsp;* @ret rc&nbsp;&nbsp;Return status code<br>&nbsp;*/<br>static int boot_next_server_and_filename ( struct in_addr next_server,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; const char *filename ) {<br>&nbsp;struct uri *uri;<br>&nbsp;struct image *image;<br>&nbsp;char buf[ 23 /* tftp://xxx.xxx.xxx.xxx/ */ + strlen(filename) + 1 ];<br>&nbsp;int filename_is_absolute;<br>&nbsp;int rc;</p>
<p>&nbsp;/* Construct URI */<br>&nbsp;uri = parse_uri ( filename );<br>&nbsp;if ( ! uri ) {<br>&nbsp;&nbsp;printf ( "Out of memory\n" );<br>&nbsp;&nbsp;return -ENOMEM;<br>&nbsp;}<br>&nbsp;filename_is_absolute = uri_is_absolute ( uri );<br>&nbsp;uri_put ( uri );<br>&nbsp;if ( ! filename_is_absolute ) {<br>&nbsp;&nbsp;/* Construct a tftp:// URI for the filename.&nbsp; We can't<br>&nbsp;&nbsp; * just rely on the current working URI, because the<br>&nbsp;&nbsp; * relative URI resolution will remove the distinction<br>&nbsp;&nbsp; * between filenames with and without initial slashes,<br>&nbsp;&nbsp; * which is significant for TFTP.<br>&nbsp;&nbsp; */<br>&nbsp;&nbsp;snprintf ( buf, sizeof ( buf ), "tftp://%s/%s",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; inet_ntoa ( next_server ), filename );<br>&nbsp;&nbsp;filename = buf;<br>&nbsp;}</p>
<p>&nbsp;image = alloc_image();<br>&nbsp;if ( ! image ) {<br>&nbsp;&nbsp;printf ( "Out of memory\n" );<br>&nbsp;&nbsp;return -ENOMEM;<br>&nbsp;}<br>&nbsp;if ( ( rc = imgfetch ( image, filename,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; register_and_autoload_image ) ) != 0 ) {<br>&nbsp;&nbsp;printf ( "Could not load %s: %s\n",<br>&nbsp;&nbsp;&nbsp; filename, strerror ( rc ) );<br>&nbsp;&nbsp;goto done;<br>&nbsp;}<br>&nbsp;if ( ( rc = imgexec ( image ) ) != 0 ) {<br>&nbsp;&nbsp;printf ( "Could not boot %s: %s\n",<br>&nbsp;&nbsp;&nbsp; filename, strerror ( rc ) );<br>&nbsp;&nbsp;goto done;<br>&nbsp;}</p>
<p>&nbsp;done:<br>&nbsp;image_put ( image );<br>&nbsp;return rc;<br>}</p>
<p>其中imgfetch函数用于从服务器获取启动镜像，而imgexec 函数用于执行启动镜像，imgfetch函数实现如下：<br>/**<br>&nbsp;* Fetch an image<br>&nbsp;*<br>&nbsp;* @v uri_string&nbsp;URI as a string (e.g. "<a href="http://www.nowhere.com/vmlinuz">http://www.nowhere.com/vmlinuz</a>")<br>&nbsp;* @v name&nbsp;&nbsp;Name for image, or NULL<br>&nbsp;* @v register_image&nbsp;Image registration routine<br>&nbsp;* @ret rc&nbsp;&nbsp;Return status code<br>&nbsp;*/<br>int imgfetch ( struct image *image, const char *uri_string,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int ( * image_register ) ( struct image *image ) ) {<br>&nbsp;struct uri *uri;<br>&nbsp;int rc;</p>
<p>&nbsp;if ( ! ( uri = parse_uri ( uri_string ) ) )<br>&nbsp;&nbsp;return -ENOMEM;</p>
<p>&nbsp;image_set_uri ( image, uri );</p>
<p>&nbsp;if ( ( rc = create_downloader ( &amp;monojob, image, image_register,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LOCATION_URI, uri ) ) == 0 )<br>&nbsp;&nbsp;rc = monojob_wait ( uri_string );</p>
<p>&nbsp;uri_put ( uri );<br>&nbsp;return rc;<br>}<br>其中create_downloader函数执行下载任务，改函数实现如下：<br>/**<br>&nbsp;* Instantiate a downloader<br>&nbsp;*<br>&nbsp;* @v job&nbsp;&nbsp;Job control interface<br>&nbsp;* @v image&nbsp;&nbsp;Image to fill with downloaded file<br>&nbsp;* @v register_image&nbsp;Image registration routine<br>&nbsp;* @v type&nbsp;&nbsp;Location type to pass to xfer_open()<br>&nbsp;* @v ...&nbsp;&nbsp;Remaining arguments to pass to xfer_open()<br>&nbsp;* @ret rc&nbsp;&nbsp;Return status code<br>&nbsp;*<br>&nbsp;* Instantiates a downloader object to download the specified URI into<br>&nbsp;* the specified image object.&nbsp; If the download is successful, the<br>&nbsp;* image registration routine @c register_image() will be called.<br>&nbsp;*/<br>int create_downloader ( struct job_interface *job, struct image *image,<br>&nbsp;&nbsp;&nbsp;int ( * register_image ) ( struct image *image ),<br>&nbsp;&nbsp;&nbsp;int type, ... ) {<br>&nbsp;struct downloader *downloader;<br>&nbsp;va_list args;<br>&nbsp;int rc;</p>
<p>&nbsp;/* Allocate and initialise structure */<br>&nbsp;downloader = zalloc ( sizeof ( *downloader ) );<br>&nbsp;if ( ! downloader )<br>&nbsp;&nbsp;return -ENOMEM;<br>&nbsp;downloader-&gt;refcnt.free = downloader_free;<br>&nbsp;job_init ( &amp;downloader-&gt;job, &amp;downloader_job_operations,<br>&nbsp;&nbsp;&nbsp;&nbsp; &amp;downloader-&gt;refcnt );<br>&nbsp;xfer_init ( &amp;downloader-&gt;xfer, &amp;downloader_xfer_operations,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;downloader-&gt;refcnt );<br>&nbsp;downloader-&gt;image = image_get ( image );<br>&nbsp;downloader-&gt;register_image = register_image;<br>&nbsp;va_start ( args, type );</p>
<p>&nbsp;/* Instantiate child objects and attach to our interfaces */<br>&nbsp;if ( ( rc = xfer_vopen ( &amp;downloader-&gt;xfer, type, args ) ) != 0 )<br>&nbsp;&nbsp;goto err;</p>
<p>&nbsp;/* Attach parent interface, mortalise self, and return */<br>&nbsp;job_plug_plug ( &amp;downloader-&gt;job, job );<br>&nbsp;ref_put ( &amp;downloader-&gt;refcnt );<br>&nbsp;va_end ( args );<br>&nbsp;return 0;</p>
<p>&nbsp;err:<br>&nbsp;downloader_finished ( downloader, rc );<br>&nbsp;ref_put ( &amp;downloader-&gt;refcnt );<br>&nbsp;va_end ( args );<br>&nbsp;return rc;<br>}<br>注意到struct downloader，看看downloader的具体定义:</p>
<p>/** A downloader */<br>struct downloader {<br>&nbsp;/** Reference count for this object */<br>&nbsp;struct refcnt refcnt;</p>
<p>&nbsp;/** Job control interface */<br>&nbsp;struct job_interface job;<br>&nbsp;/** Data transfer interface */<br>&nbsp;struct xfer_interface xfer;</p>
<p>&nbsp;/** Image to contain downloaded file */<br>&nbsp;struct image *image;<br>&nbsp;/** Current position within image buffer */<br>&nbsp;size_t pos;<br>&nbsp;/** Image registration routine */<br>&nbsp;int ( * register_image ) ( struct image *image );<br>};<br>来看看其中的struct xfer_interface xfer的定义：</p>
<p>/** Data transfer interface operations */<br>struct xfer_interface_operations {<br>&nbsp;/** Close interface<br>&nbsp; *<br>&nbsp; * @v xfer&nbsp;&nbsp;Data transfer interface<br>&nbsp; * @v rc&nbsp;&nbsp;Reason for close<br>&nbsp; */<br>&nbsp;void ( * close ) ( struct xfer_interface *xfer, int rc );<br>&nbsp;/** Redirect to new location<br>&nbsp; *<br>&nbsp; * @v xfer&nbsp;&nbsp;Data transfer interface<br>&nbsp; * @v type&nbsp;&nbsp;New location type<br>&nbsp; * @v args&nbsp;&nbsp;Remaining arguments depend upon location type<br>&nbsp; * @ret rc&nbsp;&nbsp;Return status code<br>&nbsp; */<br>&nbsp;int ( * vredirect ) ( struct xfer_interface *xfer, int type,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; va_list args );<br>&nbsp;/** Check flow control window<br>&nbsp; *<br>&nbsp; * @v xfer&nbsp;&nbsp;Data transfer interface<br>&nbsp; * @ret len&nbsp;&nbsp;Length of window<br>&nbsp; *<br>&nbsp; * Flow control is regarded as advisory but not mandatory.<br>&nbsp; * Users who have control over their own rate of data<br>&nbsp; * generation should perform a flow control check before<br>&nbsp; * generating new data.&nbsp; Users who have no control (such as<br>&nbsp; * NIC drivers or filter layers) are not obliged to check.<br>&nbsp; *<br>&nbsp; * Data transfer interfaces must be prepared to accept<br>&nbsp; * datagrams even if they are advertising a window of zero<br>&nbsp; * bytes.<br>&nbsp; */<br>&nbsp;size_t ( * window ) ( struct xfer_interface *xfer );<br>&nbsp;/** Allocate I/O buffer<br>&nbsp; *<br>&nbsp; * @v xfer&nbsp;&nbsp;Data transfer interface<br>&nbsp; * @v len&nbsp;&nbsp;I/O buffer payload length<br>&nbsp; * @ret iobuf&nbsp;&nbsp;I/O buffer<br>&nbsp; */<br>&nbsp;struct io_buffer * ( * alloc_iob ) ( struct xfer_interface *xfer,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; size_t len );<br>&nbsp;/** Deliver datagram as I/O buffer with metadata<br>&nbsp; *<br>&nbsp; * @v xfer&nbsp;&nbsp;Data transfer interface<br>&nbsp; * @v iobuf&nbsp;&nbsp;Datagram I/O buffer<br>&nbsp; * @v meta&nbsp;&nbsp;Data transfer metadata<br>&nbsp; * @ret rc&nbsp;&nbsp;Return status code<br>&nbsp; *<br>&nbsp; * A data transfer interface that wishes to support only raw<br>&nbsp; * data delivery should set this method to<br>&nbsp; * xfer_deliver_as_raw().<br>&nbsp; */<br>&nbsp;int ( * deliver_iob ) ( struct xfer_interface *xfer,<br>&nbsp;&nbsp;&nbsp;&nbsp;struct io_buffer *iobuf,<br>&nbsp;&nbsp;&nbsp;&nbsp;struct xfer_metadata *meta );<br>&nbsp;/** Deliver datagram as raw data<br>&nbsp; *<br>&nbsp; * @v xfer&nbsp;&nbsp;Data transfer interface<br>&nbsp; * @v data&nbsp;&nbsp;Data buffer<br>&nbsp; * @v len&nbsp;&nbsp;Length of data buffer<br>&nbsp; * @ret rc&nbsp;&nbsp;Return status code<br>&nbsp; *<br>&nbsp; * A data transfer interface that wishes to support only I/O<br>&nbsp; * buffer delivery should set this method to<br>&nbsp; * xfer_deliver_as_iob().<br>&nbsp; */<br>&nbsp;int ( * deliver_raw ) ( struct xfer_interface *xfer,<br>&nbsp;&nbsp;&nbsp;&nbsp;const void *data, size_t len );<br>};</p>
<p>/** A data transfer interface */<br>struct xfer_interface {<br>&nbsp;/** Generic object communication interface */<br>&nbsp;struct interface intf;<br>&nbsp;/** Operations for received messages */<br>&nbsp;struct xfer_interface_operations *op;<br>};<br>其中struct xfer_interface_operations *op的初始化如下<br>哈哈，下载主要干事的家伙在这里，代码里面到处都是用c实现面向对象<br>/** Downloader data transfer interface operations */<br>static struct xfer_interface_operations downloader_xfer_operations = {<br>&nbsp;.close&nbsp;&nbsp;= downloader_xfer_close,<br>&nbsp;.vredirect&nbsp;= xfer_vopen,<br>&nbsp;.window&nbsp;&nbsp;= unlimited_xfer_window,<br>&nbsp;.alloc_iob&nbsp;= default_xfer_alloc_iob,<br>&nbsp;.deliver_iob&nbsp;= downloader_xfer_deliver_iob,<br>&nbsp;.deliver_raw&nbsp;= xfer_deliver_as_iob,<br>};<br>imgexec函数的实现如下：<br>/**<br>&nbsp;* Execute loaded image<br>&nbsp;*<br>&nbsp;* @v image&nbsp;&nbsp;Loaded image<br>&nbsp;* @ret rc&nbsp;&nbsp;Return status code<br>&nbsp;*/<br>int image_exec ( struct image *image ) {<br>&nbsp;struct uri *old_cwuri;<br>&nbsp;int rc;</p>
<p>&nbsp;/* Image must be loaded first */<br>&nbsp;if ( ! ( image-&gt;flags &amp; IMAGE_LOADED ) ) {<br>&nbsp;&nbsp;DBGC ( image, "IMAGE %p could not execute: not loaded\n",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; image );<br>&nbsp;&nbsp;return -ENOTTY;<br>&nbsp;}</p>
<p>&nbsp;assert ( image-&gt;type != NULL );</p>
<p>&nbsp;/* Check that image is actually executable */<br>&nbsp;if ( ! image-&gt;type-&gt;exec )<br>&nbsp;&nbsp;return -ENOEXEC;</p>
<p>&nbsp;/* Switch current working directory to be that of the image itself */<br>&nbsp;old_cwuri = uri_get ( cwuri );<br>&nbsp;churi ( image-&gt;uri );</p>
<p>&nbsp;/* Try executing the image 又见到工厂，插件式设计思想*/<br>&nbsp;if ( ( rc = image-&gt;type-&gt;exec ( image ) ) != 0 ) {<br>&nbsp;&nbsp;DBGC ( image, "IMAGE %p could not execute: %s\n",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; image, strerror ( rc ) );<br>&nbsp;&nbsp;goto done;<br>&nbsp;}</p>
<p>&nbsp;done:<br>&nbsp;/* Reset current working directory */<br>&nbsp;churi ( old_cwuri );<br>&nbsp;uri_put ( old_cwuri );</p>
<p>&nbsp;return rc;<br>}<br></p>
<img src ="http://www.cppblog.com/ngaut/aggbug/69690.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ngaut/" target="_blank">ngaut</a> 2008-12-17 22:31 <a href="http://www.cppblog.com/ngaut/archive/2008/12/17/69690.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]udpcast</title><link>http://www.cppblog.com/ngaut/archive/2008/10/27/65265.html</link><dc:creator>ngaut</dc:creator><author>ngaut</author><pubDate>Mon, 27 Oct 2008 15:39:00 GMT</pubDate><guid>http://www.cppblog.com/ngaut/archive/2008/10/27/65265.html</guid><wfw:comment>http://www.cppblog.com/ngaut/comments/65265.html</wfw:comment><comments>http://www.cppblog.com/ngaut/archive/2008/10/27/65265.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ngaut/comments/commentRss/65265.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ngaut/services/trackbacks/65265.html</trackback:ping><description><![CDATA[<pre>Guofu,<br>  Following is what I got from  Alain long time ago.  Hope this helps.<br>   <br>  Thanks,<br>  Sai<br>   <br>  *****************************************************************<br>  There are no format documents yet about the protocol. The protocol is<br>not based on an RFC, but is homegrown specifically for udpcast.<br><br>Updcast uses two UDP port numbers, 9000 and 9001.<br><br>The receiver listens on 9000 (portbase), the sender on 9001 <br>(portbase+1)<br><br>The protocol runs as follows:<br><br>1. When the sender starts up, it broadcast a CMD_HELLO message to the<br>local network broadcast address<br><br>2. When the receiver starts up, or whenever it receives a CMD_HELLO<br>message, it sends a CMD_CONNECT_REQ address. If the CMD_CONNECT_REQ is<br>sent at startup, it is broadcast; else it is sent to the server's<br>address (as deducted from the CMD_HELLO message).<br><br>This allows the rendez-vous to be established no matter whether the<br>client or the server first starts up. Additionnally, the server can be<br>set up to periodically send its CMD_HELLO message (interesting for<br>asynchronous mode, see below).<br><br><br>3. The server replies to each CMD_CONNECT_REQ with a CMD_CONNECT_REPLY<br>(unicasted to the client who sent the CMD_CONNECT_REQ). The connect<br>reply contains the client number that the server assigned to that<br>client (clNr), the block size (size of packed), a bitmask of<br>capabilities, and the multicast address to be used for the actual data<br>transfer transfer.<br><br>At this stage, server and client know about each other, and are ready<br>to start the transfer. For convenience, the transfer may either be<br>started at the server, or at any participating client.<br><br>4. If transfer start is initiated by a client, it sends the server a<br>CMD_GO message.<br><br>5. If the transfer start is initiated by the server (or, after<br>reception of the CMD_GO message from a client), the server starts<br>transfering data by sending CMD_DATA packets. The reception of the<br>first CMD_DATA packet is a signal to all clients that now the<br>rendez-vous phase is over, and that the transfer has started.<br><br>The data is subdivided into slices, which are themselves subdivided<br>into stripes (only in FEC mode), which are subdivided in network<br>packets, which are made up of bytes.<br><br>A CMD_DATA packet contains the slice number (sliceNo), the block<br>number within that slice (blockNo), and the total number of bytes in<br>the slice, and then the data itself.<br><br>After each slice has been transmitted, lost packets are handled.<br><br>In FEC mode, lost packets are recovered by the client by using the<br>error correction packets included in each slice.<br><br>A CMD_FEC packet contains the number of stripes in the slice, the<br>slice number, the block number, and the number of bytes.<br><br><br>In non-FEC mode, the server asks each client to acknowledge at the end<br>of the slice (CMD_REQACK). The CMD_REQACK contains the identifier of<br>the slice to be acknowleged (sliceNo), the number of bytes in that<br>slice (bytes), and a retransmission counter. The clients reply to the<br>CMD_REQACK either with a CMD_OK (if they received everything) or with<br>a CMD_RETRANSMIT (if packets were missed). Both the CMD_OK and<br>CMD_RETRANSMIT message contain the sliceNo. The CMD_RETRANSMIT message<br>contains also a bitmap of the missed packets, and the retransmit id.<br><br>In response the CMD_RETRANSMIT messages, the server will retransmit<br>packets that have been missed by at least one client, increments the<br>rxmit counter and then send another CMD_REQACK. The rxmit counter is<br>used to discard late CMD_RETRANSMIT messages: indeed, after a round of<br>retransmission, CMD_RETRANSMIT messages from the previous round should<br>be ignored, or else the server may resend packets that have been<br>received in this round.<br><br>Clients may leave a transmission by sending a CMD_DISCONNECT. Sending<br>the CMD_DISCONNECT is important, or else the server will needlessly<br>wait for the acknowledgments of these clients. However, if a client<br>crashes without sending a CMD_DISCONNECT, the server has a timeout to<br>detect this situation, and continue with the other clients ("The<br>client #n has been dropped by the server").<br><br>When all clients have received all packets (i.e. all clients have send<br>a CMD_OK for that slice), the sender moves on to the next slice, until<br>end of file is reached. The server signals end of transfer by sending<br>a slice of zero bytes.<br><br>Including slice size in every packet, and number of stripes in every<br>FEC packet may seem redundant. However, this is needed in order to<br>make the protocol robust in cases of packet loss: if the number of<br>bytes was only in the first or in the last packet, then the loss of<br>that packet would make it hard to recover, because not only the data<br>was lost, but also the meta-data needed to reconstruct that<br>slice. This is especially relevant in FEC mode.<br><br>FEC mode is intended for unidirectional (asynchronous mode). In this<br>mode, there are no acknowledgments, and no retransmissions. This is<br>intended for situations where no receiver-to-sender communication is<br>possible, or where the latency of such a communication would be<br>prohibitively high, such as multicast over satellite.<br><br>The server sends (one or several) CMD_HELLO which includes the<br>multicast address it intends to use, and then starts with the<br>data. Each slice not only contains the data, but also a configurable<br>number of redundant "error correction" packets.<br><br>FEC mode uses an algorithm based on Vandermonde matrices to<br>recalculate the contents of any lost packets. The algorithm is chosen<br>such that all k data packets may be restored as long as the receiver<br>has gotten at least k packets (be it data or FEC). For example, with<br>k-3 data packets, and 3 FEC packets, all k data packets may be<br>reconstructed. K is a parameter of the algorithm, and the higher the<br>value for k, the more computation intensive the algorithm<br>is. Moreover, values of k greater than 128 are not supported. For that<br>reason, each slice (which may be up to 1024 packets) is subdivided in<br>several stripes (of at most 128 packets), which are interleaved<br>(i.e. first comes 1st packet of 1st stripe, than 1st packet of 2nd<br>stripe, ..., then 1st packet of last stripe, than 2nd packet of 1st<br>stripe, etc.) That way a burst loss of packets (for instance, 6<br>packets in a row) won't overly impact one stripe but will rather be<br>spread out among several. Indeed, if udp-sender has been set up to<br>include l redundant packets per stripe, it must be avoided at all cost<br>that more than l packets are lost per stripe, or otherwise the loss in<br>uncrecoverable.<br><br>Additional complications in the protocol arise from the fact that a<br>first version of the protocol used the native byte ordering from Intel<br>processors, rather than use the network byte order. This made udpcast<br>unportable to non-PC architectures. This was changed two years ago;<br>however in order to stay compatible with older versions, the receiver<br>and sender are able to detect that packets with the "wrong" byte order<br>have been received, and are able to correct for that: if the message<br>code (CMD_*) doesn't make sense in network byte order, udpcast tries<br>to interpret it in Intel byte order, and if that matches a known code,<br>the packet is byte-swapped.<br><br><br>Regards,<br><br>Alain<br></pre><img src ="http://www.cppblog.com/ngaut/aggbug/65265.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ngaut/" target="_blank">ngaut</a> 2008-10-27 23:39 <a href="http://www.cppblog.com/ngaut/archive/2008/10/27/65265.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>小心vmware6.0和vs2008的冲突</title><link>http://www.cppblog.com/ngaut/archive/2008/10/22/64683.html</link><dc:creator>ngaut</dc:creator><author>ngaut</author><pubDate>Wed, 22 Oct 2008 02:35:00 GMT</pubDate><guid>http://www.cppblog.com/ngaut/archive/2008/10/22/64683.html</guid><wfw:comment>http://www.cppblog.com/ngaut/comments/64683.html</wfw:comment><comments>http://www.cppblog.com/ngaut/archive/2008/10/22/64683.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/ngaut/comments/commentRss/64683.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ngaut/services/trackbacks/64683.html</trackback:ping><description><![CDATA[如果安装vmware6.0后，vs2008打开工程后自动关闭，卸载vmware试试，偶被这个问题小郁闷了一把
<img src ="http://www.cppblog.com/ngaut/aggbug/64683.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ngaut/" target="_blank">ngaut</a> 2008-10-22 10:35 <a href="http://www.cppblog.com/ngaut/archive/2008/10/22/64683.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>asio工程向boost.asio转换注意事项</title><link>http://www.cppblog.com/ngaut/archive/2008/10/21/64602.html</link><dc:creator>ngaut</dc:creator><author>ngaut</author><pubDate>Tue, 21 Oct 2008 03:50:00 GMT</pubDate><guid>http://www.cppblog.com/ngaut/archive/2008/10/21/64602.html</guid><wfw:comment>http://www.cppblog.com/ngaut/comments/64602.html</wfw:comment><comments>http://www.cppblog.com/ngaut/archive/2008/10/21/64602.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ngaut/comments/commentRss/64602.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ngaut/services/trackbacks/64602.html</trackback:ping><description><![CDATA[<h3>What are the differences in the source code?</h3>
<p>— Asio is in a namespace called <tt>asio::</tt>, whereas Boost.Asio puts everything under <tt>boost::asio::</tt>.</p>
<p>— The main Asio header file is called <tt>asio.hpp</tt>. The corresponding header in Boost.Asio is <tt>boost/asio.hpp</tt>. All other headers are similarly changed.</p>
<p>— Any macros used by or defined in Asio are prefixed with <tt>ASIO_</tt>. In Boost.Asio they are prefixed with <tt>BOOST_ASIO_</tt>.</p>
<p>— Asio includes a class for launching threads, <tt>asio::thread</tt>. Boost.Asio does not include this class, to avoid overlap with the Boost.Thread library</p>
<p>— Boost.Asio uses the Boost.System library to provide support for error codes (<tt>boost::system::error_code</tt> and <tt>boost::system::system_error</tt>). Asio includes these under its own namespace (<tt>asio::error_code</tt> and <tt>asio::system_error</tt>). The Boost.System version of these classes currently supports better extensibility for user-defined error codes. 需要包含&lt;boost/system/system_error.hpp&gt; 头文件</p>
<p>— Asio is header-file-only and for most uses does not require linking against any Boost library. Boost.Asio always requires that you link against the Boost.System library, and also against Boost.Thread if you want to launch threads using <tt>boost::thread</tt>.需要包含&lt;boost/thread.hpp&gt; </p>
<img src ="http://www.cppblog.com/ngaut/aggbug/64602.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ngaut/" target="_blank">ngaut</a> 2008-10-21 11:50 <a href="http://www.cppblog.com/ngaut/archive/2008/10/21/64602.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>os开发资源</title><link>http://www.cppblog.com/ngaut/archive/2008/10/14/63986.html</link><dc:creator>ngaut</dc:creator><author>ngaut</author><pubDate>Tue, 14 Oct 2008 13:26:00 GMT</pubDate><guid>http://www.cppblog.com/ngaut/archive/2008/10/14/63986.html</guid><wfw:comment>http://www.cppblog.com/ngaut/comments/63986.html</wfw:comment><comments>http://www.cppblog.com/ngaut/archive/2008/10/14/63986.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ngaut/comments/commentRss/63986.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ngaut/services/trackbacks/63986.html</trackback:ping><description><![CDATA[http://wiki.osdev.org/Serial_ports<br><a href="http://wiki.zh-kernel.org/project/linux-acpi">http://wiki.zh-kernel.org/project/linux-acpi</a><br><a href="http://udpcast.linux.lu/mkimagedoc.html">http://udpcast.linux.lu/mkimagedoc.html</a><br><a href="http://linuxguy.org/docs/linuxdisk/">http://linuxguy.org/docs/linuxdisk/</a><br><br><br>build floppy linux<br>http://ljh.ee.nchu.edu.tw/~cch/program/fdlinux.html<br>http://hi.baidu.com/magicfrog/blog/index/5<br>
<img src ="http://www.cppblog.com/ngaut/aggbug/63986.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ngaut/" target="_blank">ngaut</a> 2008-10-14 21:26 <a href="http://www.cppblog.com/ngaut/archive/2008/10/14/63986.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>发一个招聘贴</title><link>http://www.cppblog.com/ngaut/archive/2008/09/19/62309.html</link><dc:creator>ngaut</dc:creator><author>ngaut</author><pubDate>Fri, 19 Sep 2008 14:06:00 GMT</pubDate><guid>http://www.cppblog.com/ngaut/archive/2008/09/19/62309.html</guid><wfw:comment>http://www.cppblog.com/ngaut/comments/62309.html</wfw:comment><comments>http://www.cppblog.com/ngaut/archive/2008/09/19/62309.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ngaut/comments/commentRss/62309.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ngaut/services/trackbacks/62309.html</trackback:ping><description><![CDATA[要求:<br>1. 熟悉汇编语言，c/c++，熟悉80x86体系架构，实模式，保护模式<br>2. 良好的数据结构与算法基础<br>3. 熟悉MFC或者STL<br>4. 工作地点在武汉<br>5. 学历不限，英语不限，人品良好，有团队精神<br>6. 特别优秀者，只需具备：人品良好，有团队精神<br><br>有以下经验优先：<br>1. os引导程序开发， os开发<br>2. bios开发经验<br>3. 熟悉Linux裁剪，Linux内核<br>4. 有编译器开发经验<br><br>tel:13554674976&nbsp; 刘先生<br><br> <img src ="http://www.cppblog.com/ngaut/aggbug/62309.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ngaut/" target="_blank">ngaut</a> 2008-09-19 22:06 <a href="http://www.cppblog.com/ngaut/archive/2008/09/19/62309.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>