﻿<?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++博客-天书的博客</title><link>http://www.cppblog.com/skybook/</link><description /><language>zh-cn</language><lastBuildDate>Sat, 04 Jul 2009 08:30:10 GMT</lastBuildDate><pubDate>Sat, 04 Jul 2009 08:30:10 GMT</pubDate><ttl>60</ttl><item><title>datastudio 中文设置字符串  ?;NEWCODESET=gb2312,8859_1,819</title><link>http://www.cppblog.com/skybook/archive/2009/07/03/89166.html</link><dc:creator>天书</dc:creator><author>天书</author><pubDate>Fri, 03 Jul 2009 08:19:00 GMT</pubDate><guid>http://www.cppblog.com/skybook/archive/2009/07/03/89166.html</guid><wfw:comment>http://www.cppblog.com/skybook/comments/89166.html</wfw:comment><comments>http://www.cppblog.com/skybook/archive/2009/07/03/89166.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/skybook/comments/commentRss/89166.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/skybook/services/trackbacks/89166.html</trackback:ping><description><![CDATA[ <img src ="http://www.cppblog.com/skybook/aggbug/89166.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/skybook/" target="_blank">天书</a> 2009-07-03 16:19 <a href="http://www.cppblog.com/skybook/archive/2009/07/03/89166.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>c#  indexof() 大小写敏感控制 using System.Globalization;  if (Compare.IndexOf(strcuscmd,curLineCmd,CompareOptions.IgnoreCase) !=-1)</title><link>http://www.cppblog.com/skybook/archive/2009/06/22/88297.html</link><dc:creator>天书</dc:creator><author>天书</author><pubDate>Mon, 22 Jun 2009 08:57:00 GMT</pubDate><guid>http://www.cppblog.com/skybook/archive/2009/06/22/88297.html</guid><wfw:comment>http://www.cppblog.com/skybook/comments/88297.html</wfw:comment><comments>http://www.cppblog.com/skybook/archive/2009/06/22/88297.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/skybook/comments/commentRss/88297.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/skybook/services/trackbacks/88297.html</trackback:ping><description><![CDATA[ <img src ="http://www.cppblog.com/skybook/aggbug/88297.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/skybook/" target="_blank">天书</a> 2009-06-22 16:57 <a href="http://www.cppblog.com/skybook/archive/2009/06/22/88297.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PHP 配置文件 配置 httpd.conf   Alias /myweb "D:/My Documents/MyPHP"</title><link>http://www.cppblog.com/skybook/archive/2009/04/19/80434.html</link><dc:creator>天书</dc:creator><author>天书</author><pubDate>Sun, 19 Apr 2009 03:22:00 GMT</pubDate><guid>http://www.cppblog.com/skybook/archive/2009/04/19/80434.html</guid><wfw:comment>http://www.cppblog.com/skybook/comments/80434.html</wfw:comment><comments>http://www.cppblog.com/skybook/archive/2009/04/19/80434.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/skybook/comments/commentRss/80434.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/skybook/services/trackbacks/80434.html</trackback:ping><description><![CDATA[  <img src ="http://www.cppblog.com/skybook/aggbug/80434.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/skybook/" target="_blank">天书</a> 2009-04-19 11:22 <a href="http://www.cppblog.com/skybook/archive/2009/04/19/80434.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>读XML文件动态生成TreeView (递归生成)</title><link>http://www.cppblog.com/skybook/archive/2009/02/20/74407.html</link><dc:creator>天书</dc:creator><author>天书</author><pubDate>Fri, 20 Feb 2009 07:21:00 GMT</pubDate><guid>http://www.cppblog.com/skybook/archive/2009/02/20/74407.html</guid><wfw:comment>http://www.cppblog.com/skybook/comments/74407.html</wfw:comment><comments>http://www.cppblog.com/skybook/archive/2009/02/20/74407.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/skybook/comments/commentRss/74407.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/skybook/services/trackbacks/74407.html</trackback:ping><description><![CDATA[<p>&nbsp; private void InstructorTree_Load(object sender, EventArgs e)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xmlfile = Application.StartupPath + "<a href="file://cc08help.xml/">\\CC08Help.xml</a>";<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GetInsEvent += new GetInstructorHandle(HelpForm_GetInsEvent);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GetHtmlEvent += new GetNodeHtml(InstructorTree_GetHtmlEvent);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ReadXMLGetFileName();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.tvHelp.ImageList = this.imgLHelp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //由Excel导出的XML文档动态生成树<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (xmlfile != "")<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; InitTreeView(xmlfile, this.tvHelp);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; foreach (TreeNode tn in tvHelp.Nodes)<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; SetLeafNodeImageIndex(tn);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.tvHelp.Nodes[0].Expand();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private TreeNode curTn = null;<br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private void InitTreeView(string xmlfileName, TreeView tv)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XmlDocument xdoc = new XmlDocument();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xdoc.Load(xmlfileName);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XmlNode xn = xdoc.SelectSingleNode("Help");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TreeNode tn = new TreeNode();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tn.Text = xn.ChildNodes[0].Attributes[0].Value;//命令联机帮助<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tv.Nodes.Add(tn);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="COLOR: #ff0000">makeOutTreeView(xn.ChildNodes[0], tn);</span>&nbsp;<span style="COLOR: #008000"> //递归<br></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p><span style="COLOR: #ff00ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private void makeOutTreeView(XmlNode xn,TreeNode tn)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (xn.ChildNodes.Count != 0)<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; for (int i = 0; i &lt; xn.ChildNodes.Count; i++)<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; curTn = new TreeNode();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; curTn.Text = xn.ChildNodes[i].Attributes[0].Value;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tn.Nodes.Add(curTn);</span></p>
<p style="COLOR: #ff00ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; makeOutTreeView(xn.ChildNodes[i], curTn);<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; }</p>
<img src ="http://www.cppblog.com/skybook/aggbug/74407.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/skybook/" target="_blank">天书</a> 2009-02-20 15:21 <a href="http://www.cppblog.com/skybook/archive/2009/02/20/74407.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Excel 文件导出成 XML文件（树结构）</title><link>http://www.cppblog.com/skybook/archive/2009/02/20/74405.html</link><dc:creator>天书</dc:creator><author>天书</author><pubDate>Fri, 20 Feb 2009 07:16:00 GMT</pubDate><guid>http://www.cppblog.com/skybook/archive/2009/02/20/74405.html</guid><wfw:comment>http://www.cppblog.com/skybook/comments/74405.html</wfw:comment><comments>http://www.cppblog.com/skybook/archive/2009/02/20/74405.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/skybook/comments/commentRss/74405.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/skybook/services/trackbacks/74405.html</trackback:ping><description><![CDATA[<p>using System;<br>using System.Collections.Generic;<br>using System.ComponentModel;<br>using System.Data;<br>using System.Drawing;<br>using System.Text;<br>using System.Windows.Forms;<br>using System.Xml;</p>
<p><br>namespace ExcelToXml<br>{<br>&nbsp;&nbsp;&nbsp; public partial class Form1 : Form<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public Form1()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; InitializeComponent();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private string xmlFile = "";<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private DataSet ds = null;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private string excelFileName = ""; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private void ReadXMLGetFileName()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XmlDocument xdoc = new XmlDocument();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string file = Application.StartupPath + "//excelFile.xml";<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xdoc.Load(file);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XmlNode xno = xdoc.SelectSingleNode("excelFile");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; xno.ChildNodes.Count; i++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (xno.ChildNodes[i].Name == "FileName")<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; excelFileName = xno.ChildNodes[i].InnerText;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private void Form1_Load(object sender, EventArgs e)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xmlFile = Application.StartupPath + "<a href="file://cc08help.xml/">\\CC08Help.xml</a>";<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ReadXMLGetFileName();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ds = ReadExcelToTree.ExcelToDataSet(@excelFileName);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (ds != 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; xmlFormExcel(ds.Tables[0], xmlFile);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private XmlNode curNode = null;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private string curNodeName = "";<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private XmlDocument xdoc = null;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: #ff6600"> void xmlFormExcel(DataTable dt,string xmlFile)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xdoc = new XmlDocument();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xdoc.Load(xmlFile);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; curNodeName = "Help";<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; curNode = xdoc.SelectSingleNode(curNodeName);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int colums = dt.Columns.Count;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XmlNode[] curNodeLevel = new XmlNode[colums];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; dt.Rows.Count; i++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DataRow dr = dt.Rows[i];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int j = 1; j &lt;= colums; j++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (j == 1 &amp;&amp; dr[j].ToString() != String.Empty)<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; XmlElement xe = xdoc.CreateElement("tn");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xe.SetAttribute("value",dr[j].ToString());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; curNode.AppendChild(xe);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; curNodeLevel[0] = xe;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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; else if (j &gt;= 2)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (dr[j].ToString() != string.Empty)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XmlElement xe = xdoc.CreateElement("tn");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xe.SetAttribute("value", dr[j].ToString());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; curNodeLevel[j - 2].AppendChild(xe);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; curNodeLevel[j - 1] = xe;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xdoc.Save(xmlFile);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br></span>&nbsp;&nbsp;&nbsp; }<br>}</p>
<img src ="http://www.cppblog.com/skybook/aggbug/74405.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/skybook/" target="_blank">天书</a> 2009-02-20 15:16 <a href="http://www.cppblog.com/skybook/archive/2009/02/20/74405.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>创建触发器 ——触发器可以在查询分析器里创建，也可以在表名上点右键-&gt;“所有任务”-&gt;“管理触发器”来创建，不过都是要写 T-SQL 语句的，只是在查询分析器里要先确定当前操作的数据库。CREATE TRIGGER 触发器名称ON 表名FOR INSERT、UPDATE 或 DELETE  AS   T-SQL 语句</title><link>http://www.cppblog.com/skybook/archive/2009/02/19/74300.html</link><dc:creator>天书</dc:creator><author>天书</author><pubDate>Thu, 19 Feb 2009 07:48:00 GMT</pubDate><guid>http://www.cppblog.com/skybook/archive/2009/02/19/74300.html</guid><wfw:comment>http://www.cppblog.com/skybook/comments/74300.html</wfw:comment><comments>http://www.cppblog.com/skybook/archive/2009/02/19/74300.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/skybook/comments/commentRss/74300.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/skybook/services/trackbacks/74300.html</trackback:ping><description><![CDATA[<p>触发器是一种特殊的存储过程，类似于事件函数，SQL Server&#8482; 允许为 INSERT、UPDATE、DELETE 创建触发器，即当在表中插入、更新、删除记录时，触发一个或一系列 T-SQL语句。</p>
<p>触发器可以在查询分析器里创建，也可以在表名上点右键-&gt;&#8220;所有任务&#8221;-&gt;&#8220;管理触发器&#8221;来创建，不过都是要写 T-SQL 语句的，只是在查询分析器里要先确定当前操作的数据库。</p>
<p>创建触发器用 CREATE TRIGGER<br><br><strong>CREATE TRIGGER 触发器名称<br>ON 表名<br>FOR INSERT、UPDATE 或 DELETE<br>AS<br>&nbsp;&nbsp;&nbsp; T-SQL 语句</strong><br>注意：触发器名称是不加引号的。<br><br>如下是联机丛书上的一个示例，当在 titles 表上更改记录时，发送邮件通知 MaryM。<br>CREATE TRIGGER reminder<br>ON titles<br>FOR INSERT, UPDATE, DELETE <br>AS<br>&nbsp;&nbsp; EXEC master..xp_sendmail 'MaryM', <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'Don''t forget to print a report for the distributors.'</p>
<img src ="http://www.cppblog.com/skybook/aggbug/74300.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/skybook/" target="_blank">天书</a> 2009-02-19 15:48 <a href="http://www.cppblog.com/skybook/archive/2009/02/19/74300.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>触发器作用  一种特殊的存储过程，它在插入，删除或修改特定表中的数据时触发执行</title><link>http://www.cppblog.com/skybook/archive/2009/02/19/74299.html</link><dc:creator>天书</dc:creator><author>天书</author><pubDate>Thu, 19 Feb 2009 07:42:00 GMT</pubDate><guid>http://www.cppblog.com/skybook/archive/2009/02/19/74299.html</guid><wfw:comment>http://www.cppblog.com/skybook/comments/74299.html</wfw:comment><comments>http://www.cppblog.com/skybook/archive/2009/02/19/74299.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/skybook/comments/commentRss/74299.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/skybook/services/trackbacks/74299.html</trackback:ping><description><![CDATA[&nbsp; <span style="COLOR: red">触发器是一种特殊的存储过程，它在插入，删除或修改特定表中</span>
<p style="FONT-SIZE: 14pt; COLOR: red; FONT-FAMILY: Arial">的数据时触发执行，它比数据库本身标准的功能有更精细和更复杂的</p>
<p style="FONT-SIZE: 10pt"><span style="FONT-SIZE: 14pt; COLOR: red">数据控制能力。</span><br>数据库触发器有以下的作用：</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp; * 安全性。可以基于数据库的值使用户具有操作数据库的某种权</p>
<p style="FONT-SIZE: 10pt">利。</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # 可以基于时间限制用户的操作，例如不允许下班后和节假日</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 修改数据库数据。</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # 可以基于数据库中的数据限制用户的操作，例如不允许股票</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 的价格的升幅一次超过10%。</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp; * 审计。可以跟踪用户对数据库的操作。</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # 审计用户操作数据库的语句。</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # 把用户对数据库的更新写入审计表。</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp; * 实现复杂的数据完整性规则。</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # 实现非标准的数据完整性检查和约束。触发器可产生比规则</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 更为复杂的限制。与规则不同，触发器可以引用列或数据库对</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 象。例如，触发器可回退任何企图吃进超过自己保证金的期货。</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # 提供可变的缺省值。</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp; * 实现复杂的非标准的数据库相关完整性规则。触发器可以对数</p>
<p style="FONT-SIZE: 10pt">据库中相关的表进行连环更新。例如，在auths表author_code列上的</p>
<p style="FONT-SIZE: 10pt">删除触发器可导致相应删除在其它表中的与之匹配的行。</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # 在修改或删除时级联修改或删除其它表中的与之匹配的行。</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # 在修改或删除时把其它表中的与之匹配的行设成NULL值。</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # 在修改或删除时把其它表中的与之匹配的行级联设成缺省值。</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # 触发器能够拒绝或回退那些破坏相关完整性的变化，取消试</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 图进行数据更新的事务。当插入一个与其主健不匹配的外部键</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 时，这种触发器会起作用。例如，可以在books.author_code</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 列上生成一个插入触发器，如果新值与auths.author_code列</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 中的某值不匹配时，插入被回退。</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp; * 同步实时地复制表中的数据。</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp; * 自动计算数据值，如果数据的值达到了一定的要求，则进行特</p>
<p style="FONT-SIZE: 10pt">定的处理。例如，如果公司的帐号上的资金低于5万元则立即给财务人</p>
<p style="FONT-SIZE: 10pt">员发送警告数据。<br><br><br></p>
<p>触发器是一种特殊的存储过程，类似于事件函数，SQL Server&#8482; 允许为 INSERT、UPDATE、DELETE 创建触发器，即当在表中插入、更新、删除记录时，触发一个或一系列 T-SQL语句。</p>
<p>触发器可以在查询分析器里创建，也可以在表名上点右键-&gt;&#8220;所有任务&#8221;-&gt;&#8220;管理触发器&#8221;来创建，不过都是要写 T-SQL 语句的，只是在查询分析器里要先确定当前操作的数据库。</p>
<p>创建触发器用 CREATE TRIGGER<br><br><strong>CREATE TRIGGER 触发器名称<br>ON 表名<br>FOR INSERT、UPDATE 或 DELETE<br>AS<br>&nbsp;&nbsp;&nbsp; T-SQL 语句</strong><br>注意：触发器名称是不加引号的。<br><br>如下是联机丛书上的一个示例，当在 titles 表上更改记录时，发送邮件通知 MaryM。<br>CREATE TRIGGER reminder<br>ON titles<br>FOR INSERT, UPDATE, DELETE <br>AS<br>&nbsp;&nbsp; EXEC master..xp_sendmail 'MaryM', <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'Don''t forget to print a report for the distributors.'</p>
<img src ="http://www.cppblog.com/skybook/aggbug/74299.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/skybook/" target="_blank">天书</a> 2009-02-19 15:42 <a href="http://www.cppblog.com/skybook/archive/2009/02/19/74299.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ASP.NET与ASP相比，主要有哪些进步？  执行效率的大幅提高  强大的开发工具支持  多处理器环境的可靠性  安全型</title><link>http://www.cppblog.com/skybook/archive/2009/02/19/74296.html</link><dc:creator>天书</dc:creator><author>天书</author><pubDate>Thu, 19 Feb 2009 07:29:00 GMT</pubDate><guid>http://www.cppblog.com/skybook/archive/2009/02/19/74296.html</guid><wfw:comment>http://www.cppblog.com/skybook/comments/74296.html</wfw:comment><comments>http://www.cppblog.com/skybook/archive/2009/02/19/74296.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/skybook/comments/commentRss/74296.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/skybook/services/trackbacks/74296.html</trackback:ping><description><![CDATA[<p>参考答案：<br><span style="COLOR: #008000">执行效率的大幅提高 <br></span>ASP以源码形式存放，以解释方式运行，每次ASP网页调用都需要对源码进行解释，运行效率不高.　　ASP.net是把基于通用语言的程序在服务器上运行。不像以前的ASP即时解释程序，而是将程序在服务器端首次运行时进行编译，这样的执行效果，当然比一条一条的解释强很多.<br><span style="COLOR: #008000">强大的开发工具支持</span><br>ASP.net可以使用VS Studio 系列的强大的开发工具，只是所见即所得的开发支持。<br><span style="COLOR: #008000">可扩充的适应性</span><br>Asp.net可以完美支持windows平台，也可以通过mono来支持linux的平台。而且，asp.Net是语言独立的，也就是说不但可以用C#编写相关的代码，你也可以使用vb，jscript等语言来编写。<br><span style="COLOR: #008000">多处理器环境的可靠性</span> <br>ASP.net已经被刻意设计成为一种可以用于多处理器的开发工具，它在多处理器的环境下用特殊的无缝连接技术，将很大的提高运行速度。即使你现在的ASP.net应用软件是为一个处理器开发的，将来多处理器运行时不需要任何改变都能提高他们的效能，但现在的ASP确做不到这一点。<br><span style="COLOR: #008000">安全型</span><br>AspNet内置了强大的安全型管理机制，相对asp，安全型得到了很大的提高。</p>
<p style="COLOR: #ff6600"><span style="COLOR: #ff0000">点评：</span></p>
<p style="COLOR: #ff6600">和asp相比，asp.net确实有了很大的飞跃，特别是这种代码分类的方式，给编程人员带来了很大的方便，了解asp.net的进步，可以让我们更有信心学习asp。net.。</p>
<img src ="http://www.cppblog.com/skybook/aggbug/74296.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/skybook/" target="_blank">天书</a> 2009-02-19 15:29 <a href="http://www.cppblog.com/skybook/archive/2009/02/19/74296.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C# 能对内存进行直接操作吗？   可以，但是要用unsafe来标示</title><link>http://www.cppblog.com/skybook/archive/2009/02/19/74293.html</link><dc:creator>天书</dc:creator><author>天书</author><pubDate>Thu, 19 Feb 2009 07:22:00 GMT</pubDate><guid>http://www.cppblog.com/skybook/archive/2009/02/19/74293.html</guid><wfw:comment>http://www.cppblog.com/skybook/comments/74293.html</wfw:comment><comments>http://www.cppblog.com/skybook/archive/2009/02/19/74293.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/skybook/comments/commentRss/74293.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/skybook/services/trackbacks/74293.html</trackback:ping><description><![CDATA[<p>C#可否对内存进行直接的操作 ?<br><span style="COLOR: #99cc00">可以使用指针</span><br>在这篇文章中将描述C#的一个特性指针和所谓的不安全代码。<br><br><strong>非安全代码</strong><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 非安全代码就是不在 CLR 完全控制下执行的代码，它有可能会导致一些问题，因此他们必须用 &#8220;unsafe&#8221; 进行表明：<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; unsafe<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ...<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // unsafe context: can use pointers here<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ...<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在其他一些地方也可以使用关键字 &#8216;unsafe&#8217;，例如我们可以将类或方法表明为非安全的：<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; unsafe class Class1 {}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; static unsafe void FastMove ( int* pi, int* pdi, int length) {...} <br><br>&#8216;unsafe&#8217; 关键字的必要性是它可以防止程序员的一些意外的用法。你可能会问既然是不安全的为什么还有人要用它。答案就是有时候，在有些情况下，还需要用到指针。<br><br>指针<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 指针是一种用来存储其他变量地址的特殊的变量，如果你把第一个变量的地址赋给第二个变量，你可以说第一个变量是指向第二个，CLR支持3种指针类型：受托管指针, 非托管指针和非托管函数指针。受托管指针存储在堆上的托管块的引用，一个非托管指针是传统的C++指针并且每次使用必须要放在unsafe代码块中，一个非托管函数指针也是指向函数地址的传统的C++指针(delegates 可以被看做是非托管函数指针).<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 你可以像下面这样的声明来创建指针：类型* 变量_名称; <br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 既然类型可以是任意一个非引用类型并且不包含引用类型字段，它只能是：sbyte, byte, short, ushort, int, uint, long, ulong, char, float, double, decimal, bool 和枚举类型以及其他指针类型，也可以是任何用户自定义的包括非托管类型字段的结构体.<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 下面是不同类型指针声明的示例：<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int* pi //declaration a pointer to integer variable<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; float* pf, pq // two pointers to float variables. Not *pf, *pq <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char* pz // pointer to char<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 就像前面说的非托管代码CLR是不能验证的，为了编译你需要指定 /unsafe 编译选项，如果你是使用的是Microsoft Visual Studio你需要在项目选项中把 'Allow unsafe code block'设置成 True。<br><br><br><br><strong>指针的基本用法</strong><br><br>还有一些与指针紧密联系的操作符，那就是 &amp; 操作符，&amp; 返回它所操作对象的地址。<br><br>例如:<br>unsafe <br>{<br>int* pi;<br>int x = 1;<br>pi = &amp;x;<br>System.Console.WriteLine("Value of x is: " + *pi);<br>}<br><br>在这个例子中我们创建了2个变量，&#8217;pi&#8217;是指向int的指针，&#8217;x&#8217;是int，然后我们将&#8217;x&#8217;在内存中的地址赋予&#8217;pi&#8217;，理解我们放在 &#8217;pi&#8217; 变量中的是 &#8217;x&#8217;的地址而不是&#8217;x&#8217;的值非常重要 (使用: pi = x 将返回错误 "Cannot implicitly convert type 'int' to 'int*'")<br><br>编译后执行将会输出:<br><br>Value of x is: 1 <br><br>指针可以接受 null 值，也可能使用 void 指针类型，下面的代码可以正常编译：<br><br>unsafe <br>{<br>nt x = 10;<br>void* px = &amp;x;<br>double *pd = (double*)px;<br>}<br><br>fixed 关键字和垃圾回收<br><br>在 C# 中使用指针需要比在 C++种更加注意。这是因为垃圾回收器(g.c.)会运行内存清理，在清理的过程中，g.c.会改变对象的物理内存位置，如果 g.c.改变了对象的位置指针将指向错误的内存位置。为了避免这样的问题（已经与垃圾回收器连接），C# 包含 'fixed' 关键字. 它通知系统不要让垃圾回收器重新部署对象。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果我们忘了 &#8217;<span style="COLOR: #993300">fixed&#8217; </span>关键字编译器会给我们相应的警告，但它没有智能到在下面的情况中也会警告我们。下面的代码有一个严重的Bug尽管编译很正常。<br><br><strong>C# 指针和 WinApi</strong><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 使用指针最重要的好处就是可以与其他二进制代码进行交互。许多 WinApi 函数都使用指针，例如GetComputerName (Kernel32.lib.)可以提供我们的计算机的名称。<br><br>BOOL GetComputerName(LPTSTR lpBuffer, // computer name<br>LPDWORD lpnSize // size of name buffer);<br><br>下面的程序演示如何使用GetComputerName：<br><br>[System.Runtime.InteropServices.DllImport("Kernel32")]<br>static extern unsafe bool GetComputerName(byte* lpBuffer,long* nSize);<br>static void Main()<br>{<br>byte[] buffor = new byte[512];<br>long size = buffor.Length;<br>unsafe<br>{<br>long* pSize = &amp;size;<br>fixed (byte* pBuffor = buffor)<br>{<br>GetComputerName(pBuffor,pSize);<br>}<br>}<br>System.Text.Encoding textEnc = new System.Text.ASCIIEncoding();<br>System.Console.WriteLine("Computer name: {0}",textEnc.GetString(buffor)); <br>}<br><br>结论<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 我们已经看到指针是C#语言中非常有用的部分，使用指针并不难但是要非常小心，因为有可能会导致难以诊断的问题，使用指针会扰乱垃圾回收器的功能，特别当我们在程序中大量使用指针。因此在之用指针之前我们应该多考虑，或者尝试其他的解决办法。</p>
<img src ="http://www.cppblog.com/skybook/aggbug/74293.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/skybook/" target="_blank">天书</a> 2009-02-19 15:22 <a href="http://www.cppblog.com/skybook/archive/2009/02/19/74293.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C#漂亮窗体  public partial class ApplicationForm : Office2007RibbonForm</title><link>http://www.cppblog.com/skybook/archive/2009/02/19/74246.html</link><dc:creator>天书</dc:creator><author>天书</author><pubDate>Thu, 19 Feb 2009 01:46:00 GMT</pubDate><guid>http://www.cppblog.com/skybook/archive/2009/02/19/74246.html</guid><wfw:comment>http://www.cppblog.com/skybook/comments/74246.html</wfw:comment><comments>http://www.cppblog.com/skybook/archive/2009/02/19/74246.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/skybook/comments/commentRss/74246.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/skybook/services/trackbacks/74246.html</trackback:ping><description><![CDATA[<p>using System.Windows.Forms;<br>using DevComponents.DotNetBar;<br>using DevComponents.DotNetBar.Rendering;<br><br>public partial class ApplicationForm : Office2007RibbonForm<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ......<br>}<br><br>菜单加载<br>仿真制作 DevComponents.DotNetBar.RibbonBarMergeContainer<br>ribbonBar2 DevComponents.DotNetBar.RibbonBar</p>
<p style="COLOR: #ff6600">窗体Form直接加载菜单条</p>
<p style="COLOR: #ff6600">this.Controls.Add(this.仿真制作);</p>
<img src ="http://www.cppblog.com/skybook/aggbug/74246.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/skybook/" target="_blank">天书</a> 2009-02-19 09:46 <a href="http://www.cppblog.com/skybook/archive/2009/02/19/74246.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>