<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_Answer</title><subtitle type="text">专注于Mobile,WinCE</subtitle><id>http://feed.cnblogs.com/blog/u/23354/rss</id><updated>2012-05-27T10:23:09Z</updated><author><name>answer</name><uri>http://www.cnblogs.com/answer/</uri></author><generator>feed.cnblogs.com</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/answer/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/23354/rss"/><entry><id>http://www.cnblogs.com/answer/archive/2012/05/27/2520401.html</id><title type="text">SQLITE入门至精通</title><summary type="text">菜鸟入门 1。从www.sqlite .org 下载SQLite 3.3.4的版本 为了方便，我把它解压了，就一个SQLite3.exe，放入Windows目录下。 Cmd 进入命令行 1) 创建数据库文件: &gt;SQLite3 d:\test.db 回车 就生成了一个test.db在d盘。 这样同时也SQLite3挂上了这个test.db 2) 用.help可以看看有什么命令 &gt;.help 回车即可 3)可以在这里直接输入SQL语句创建表格 用;结束 ，然后回车就可以看到了 4)看看有创建了多少表 &gt;.tables 5)看表结构 &gt;.schema 表...</summary><published>2012-05-27T10:23:00Z</published><updated>2012-05-27T10:23:00Z</updated><author><name>answer</name><uri>http://www.cnblogs.com/answer/</uri></author><link rel="alternate" href="http://www.cnblogs.com/answer/archive/2012/05/27/2520401.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/answer/archive/2012/05/27/2520401.html"/><content type="html">&lt;div&gt;&lt;p&gt;&lt;span style="color: #000000;"&gt;&lt;strong style="color: #ff0000;"&gt;菜鸟入门&lt;/strong&gt; &lt;br /&gt; 1。从&lt;a href="http://www.sqlite.org/"&gt;www.sqlite .org&lt;/a&gt; 下载SQLite  3.3.4的版本&lt;br /&gt; &amp;nbsp;&amp;nbsp; 为了方便，我把它解压了，就一个SQLite3.exe，放入Windows目录下。&lt;br /&gt; &amp;nbsp;&amp;nbsp; Cmd 进入命令行&lt;br /&gt; &amp;nbsp;&amp;nbsp; 1)&lt;br /&gt; &amp;nbsp;&amp;nbsp; &lt;span style="color: #0000ff;"&gt;&lt;strong&gt;创建数据库文件:&lt;/strong&gt; &lt;br /&gt;&lt;/span&gt; &amp;nbsp;&amp;nbsp; &amp;gt;SQLite3 d:\test.db 回车&lt;br /&gt; &amp;nbsp;&amp;nbsp; 就生成了一个test.db在d盘。&lt;br /&gt; &amp;nbsp;&amp;nbsp; 这样同时也SQLite3挂上了这个test.db&lt;br /&gt; &amp;nbsp;&amp;nbsp; 2) &lt;br /&gt; &amp;nbsp;&amp;nbsp; &lt;strong style="color: #0000ff;"&gt;用.help可以看看有什么命令&lt;/strong&gt; &lt;br /&gt; &amp;nbsp;&amp;nbsp; &amp;gt;.help 回车即可&lt;br /&gt; &amp;nbsp;&amp;nbsp; 3)可以在这里直接输入SQL语句创建表格 &lt;strong style="color: #0000ff;"&gt;用;结束&lt;/strong&gt; ，然后回车就可以看到了&lt;br /&gt; &amp;nbsp;&amp;nbsp; 4)看看有&lt;strong style="color: #0000ff;"&gt;创建了多少表&lt;/strong&gt; &lt;br /&gt; &amp;nbsp;&amp;nbsp; &amp;gt;.tables &lt;br /&gt; &amp;nbsp;&amp;nbsp; 5)看表结构&lt;br /&gt; &amp;nbsp;&amp;nbsp; &amp;gt;.schema 表名&lt;br /&gt; &amp;nbsp;&amp;nbsp; 6)&lt;strong style="color: #0000ff;"&gt;看看目前的数据库&lt;/strong&gt; &lt;br /&gt; &amp;nbsp;&amp;nbsp; &amp;gt;.database&lt;br /&gt; &amp;nbsp;&amp;nbsp; 7)&lt;strong style="color: #0000ff;"&gt;如果要把查询输出到文件&lt;/strong&gt; &lt;br /&gt; &amp;nbsp;&amp;nbsp; &amp;gt;.output 文件名&lt;br /&gt; &amp;nbsp;&amp;nbsp; &amp;gt; 查询语句；&lt;br /&gt; &amp;nbsp;&amp;nbsp; 查询结果就输出到了文件c:\query.txt &lt;/span&gt; &lt;/p&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp; 把查询结果用屏幕输出&lt;br /&gt; &amp;nbsp;&amp;nbsp; &amp;gt;.output stdout&lt;br /&gt;&lt;/span&gt; &lt;/p&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp; 8)把表结构输出，同时索引也会输出&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .dump 表名&lt;br /&gt; &amp;nbsp;&amp;nbsp; 9)&lt;strong style="color: #0000ff;"&gt;退出&lt;/strong&gt; &lt;br /&gt; &amp;nbsp;&amp;nbsp; &amp;gt;.exit 或者.quit&lt;/span&gt; &lt;/p&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;2。从&lt;a href="http://sqlite.phxsoftware.com/"&gt;http://sqlite .phxsoftware.com/&lt;/a&gt; 下载Ado.net驱动。&lt;br /&gt; &amp;nbsp;&amp;nbsp; 下载了安装，在安装目录中存在System.Data.SQLite .dll&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; 我们只需要拷贝这个文件到引用目录，并添加引用即可对SQLite 数据库操作了&lt;br /&gt; &amp;nbsp;&amp;nbsp; 所有的Ado.net对象都是以SQLite 开头的，比如SQLiteConnection&lt;br /&gt; &amp;nbsp;&amp;nbsp; 连接串只需要如下方式&lt;br /&gt; &amp;nbsp;&amp;nbsp; Data Source=d:\test.db 或者DataSource=test.db--应用在和应用程序或者.net能够自动找到的目录&lt;br /&gt; &amp;nbsp;&amp;nbsp; 剩下的就很简单了~~&lt;/span&gt; &lt;/p&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;3。&lt;strong style="color: #0000ff;"&gt;SQL语法&lt;/strong&gt; &lt;br /&gt; &amp;nbsp;&amp;nbsp; 由于以前用SQLServer或者ISeries，所以DDL的语法很汗颜&lt;br /&gt; &amp;nbsp;&amp;nbsp; 1)&lt;strong style="color: #0000ff;"&gt;创建一个单个Primary Key的table&lt;br /&gt;&lt;/strong&gt; &amp;nbsp;&amp;nbsp; CREATE TABLE&amp;nbsp; [Admin] (&lt;br /&gt; &amp;nbsp;[UserName] [nvarchar] (20)&amp;nbsp;&amp;nbsp; PRIMARY KEY NOT NULL ,&lt;br /&gt; &amp;nbsp;[Password] [nvarchar] (50)&amp;nbsp;&amp;nbsp; NOT NULL ,&lt;br /&gt; &amp;nbsp;[Rank] [smallint] NOT NULL ,&lt;br /&gt; &amp;nbsp;[MailServer] [nvarchar] (50)&amp;nbsp;&amp;nbsp; NOT NULL ,&lt;br /&gt; &amp;nbsp;[MailUser] [nvarchar] (50)&amp;nbsp;&amp;nbsp; NOT NULL ,&lt;br /&gt; &amp;nbsp;[MailPassword] [nvarchar] (50)&amp;nbsp;&amp;nbsp; NOT NULL ,&lt;br /&gt; &amp;nbsp;[Mail] [nvarchar] (50)&amp;nbsp;&amp;nbsp; NOT NULL &lt;br /&gt; &amp;nbsp;&amp;nbsp; ) ;&lt;br /&gt;&lt;strong style="color: #0000ff;"&gt;&amp;nbsp;&amp;nbsp; 2)创建一个多个Primary Key的table&lt;/strong&gt; &lt;br /&gt; &amp;nbsp;&amp;nbsp; CREATE TABLE&amp;nbsp; [CodeDetail] (&lt;br /&gt; &amp;nbsp;[CdType] [nvarchar] (10)&amp;nbsp; NOT NULL ,&lt;br /&gt; &amp;nbsp;[CdCode] [nvarchar] (20)&amp;nbsp; NOT NULL ,&lt;br /&gt; &amp;nbsp;[CdString1] [ntext]&amp;nbsp;&amp;nbsp; NOT NULL ,&lt;br /&gt; &amp;nbsp;[CdString2] [ntext]&amp;nbsp;&amp;nbsp; NOT NULL ,&lt;br /&gt; &amp;nbsp;[CdString3] [ntext]&amp;nbsp;&amp;nbsp; NOT NULL,&lt;br /&gt; &amp;nbsp; PRIMARY KEY (CdType,CdCode)&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt; &amp;nbsp;&amp;nbsp; ) ;&lt;br /&gt; &amp;nbsp;&amp;nbsp; 3)&lt;strong style="color: #0000ff;"&gt;创建索引&lt;/strong&gt; &lt;br /&gt; &amp;nbsp;&amp;nbsp; CREATE&amp;nbsp; INDEX [IX_Account] ON&amp;nbsp; [Account]([IsCheck], [UserName]);&lt;br /&gt; &amp;nbsp;&amp;nbsp; &lt;br /&gt; &amp;nbsp;&amp;nbsp; 还可以视图等等。&lt;br /&gt; 4.还有很有用的SQL&lt;br /&gt; &amp;nbsp; Select * from Sqlite_master &lt;br /&gt; &amp;nbsp; Select datetime('now')&lt;br /&gt; &amp;nbsp; Select date('now')&lt;br /&gt; &amp;nbsp; Select time('now')&lt;br /&gt; &amp;nbsp; &lt;/span&gt; &lt;/p&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;&lt;strong style="color: #0000ff;"&gt;&lt;span style="font-size: 10.5pt; color: black; line-height: 180%;"&gt;SQLite &lt;/span&gt; &lt;span style="font-size: 10.5pt; color: black; line-height: 180%;"&gt;内建函数表&lt;/span&gt; &lt;/strong&gt; &lt;/span&gt; &lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;table width="100%"&gt; &lt;tbody&gt;&lt;tr&gt; &lt;td&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;&lt;strong&gt;&lt;span style="font-size: 9pt; color: #143884;"&gt;算术函数&lt;/span&gt; &lt;/strong&gt; &lt;/span&gt; &lt;/p&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;&lt;span style="font-size: 9pt; color: #143884;"&gt;abs(X)&lt;/span&gt; &lt;/span&gt; &lt;/p&gt; &lt;/td&gt; &lt;td&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;&lt;span style="font-size: 9pt; color: #143884;"&gt;返回给定数字表达式的绝对值。&lt;/span&gt; &lt;/span&gt; &lt;/p&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;&lt;span style="font-size: 9pt; color: #143884;"&gt;max(X,Y[,...])&lt;/span&gt; &lt;/span&gt; &lt;/p&gt; &lt;/td&gt; &lt;td&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;&lt;span style="font-size: 9pt; color: #143884;"&gt;返回表达式的最大值。&lt;/span&gt; &lt;/span&gt; &lt;/p&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;&lt;span style="font-size: 9pt; color: #143884;"&gt;min(X,Y[,...])&lt;/span&gt; &lt;/span&gt; &lt;/p&gt; &lt;/td&gt; &lt;td&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;&lt;span style="font-size: 9pt; color: #143884;"&gt;返回表达式的最小值。&lt;/span&gt; &lt;/span&gt; &lt;/p&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;&lt;span style="font-size: 9pt; color: #143884;"&gt;random(*)&lt;/span&gt; &lt;/span&gt; &lt;/p&gt; &lt;/td&gt; &lt;td&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;&lt;span style="font-size: 9pt; color: #143884;"&gt;返回随机数。&lt;/span&gt; &lt;/span&gt; &lt;/p&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;&lt;span style="font-size: 9pt; color: #143884;"&gt;round(X[,Y])&lt;/span&gt; &lt;/span&gt; &lt;/p&gt; &lt;/td&gt; &lt;td&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;&lt;span style="font-size: 9pt; color: #143884;"&gt;返回数字表达式并四舍五入为指定的长度或精度。&lt;/span&gt; &lt;/span&gt; &lt;/p&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;&lt;strong&gt;&lt;span style="font-size: 9pt; color: #143884;"&gt;字符处理函数&lt;/span&gt; &lt;/strong&gt; &lt;/span&gt; &lt;/p&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;&lt;span style="font-size: 9pt; color: #143884;"&gt;length(X)&lt;/span&gt; &lt;/span&gt; &lt;/p&gt; &lt;/td&gt; &lt;td&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;&lt;span style="font-size: 9pt; color: #143884;"&gt;返回给定字符串表达式的字符个数。&lt;/span&gt; &lt;/span&gt; &lt;/p&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;&lt;span style="font-size: 9pt; color: #143884;"&gt;lower(X)&lt;/span&gt; &lt;/span&gt; &lt;/p&gt; &lt;/td&gt; &lt;td&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;&lt;span style="font-size: 9pt; color: #143884;"&gt;将大写字符数据转换为小写字符数据后返回字符表达式。&lt;/span&gt; &lt;/span&gt; &lt;/p&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;&lt;span style="font-size: 9pt; color: #143884;"&gt;upper(X)&lt;/span&gt; &lt;/span&gt; &lt;/p&gt; &lt;/td&gt; &lt;td&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;&lt;span style="font-size: 9pt; color: #143884;"&gt;返回将小写字符数据转换为大写的字符表达式。&lt;/span&gt; &lt;/span&gt; &lt;/p&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;&lt;span style="font-size: 9pt; color: #143884;"&gt;substr(X,Y,Z)&lt;/span&gt; &lt;/span&gt; &lt;/p&gt; &lt;/td&gt; &lt;td&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;&lt;span style="font-size: 9pt; color: #143884;"&gt;返回表达式的一部分。&lt;/span&gt; &lt;/span&gt; &lt;/p&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;&lt;span style="font-size: 9pt; color: #143884;"&gt;randstr()&lt;/span&gt; &lt;/span&gt; &lt;/p&gt; &lt;/td&gt; &lt;td&gt; &lt;p&gt;&amp;nbsp; &lt;/p&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;&lt;span style="font-size: 9pt; color: #143884;"&gt;quote(A)&lt;/span&gt; &lt;/span&gt; &lt;/p&gt; &lt;/td&gt; &lt;td&gt; &lt;p&gt;&amp;nbsp; &lt;/p&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;&lt;span style="font-size: 9pt; color: #143884;"&gt;like(A,B)&lt;/span&gt; &lt;/span&gt; &lt;/p&gt; &lt;/td&gt; &lt;td&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;&lt;span style="font-size: 9pt; color: #143884;"&gt;确定给定的字符串是否与指定的模式匹配。&lt;/span&gt; &lt;/span&gt; &lt;/p&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;&lt;span style="font-size: 9pt; color: #143884;"&gt;glob(A,B)&lt;/span&gt; &lt;/span&gt; &lt;/p&gt; &lt;/td&gt; &lt;td&gt; &lt;p&gt;&amp;nbsp; &lt;/p&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;&lt;strong&gt;&lt;span style="font-size: 9pt; color: #143884;"&gt;条件判断函数&lt;/span&gt; &lt;/strong&gt; &lt;/span&gt; &lt;/p&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;&lt;span style="font-size: 9pt; color: #143884;"&gt;coalesce(X,Y[,...])&lt;/span&gt; &lt;/span&gt; &lt;/p&gt; &lt;/td&gt; &lt;td&gt; &lt;p&gt;&amp;nbsp; &lt;/p&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;&lt;span style="font-size: 9pt; color: #143884;"&gt;ifnull(X,Y)&lt;/span&gt; &lt;/span&gt; &lt;/p&gt; &lt;/td&gt; &lt;td&gt; &lt;p&gt;&amp;nbsp; &lt;/p&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;&lt;span style="font-size: 9pt; color: #143884;"&gt;nullif(X,Y)&lt;/span&gt; &lt;/span&gt; &lt;/p&gt; &lt;/td&gt; &lt;td&gt; &lt;p&gt;&amp;nbsp; &lt;/p&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;&lt;strong&gt;&lt;span style="font-size: 9pt; color: #143884;"&gt;集合函数&lt;/span&gt; &lt;/strong&gt; &lt;/span&gt; &lt;/p&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;&lt;span style="font-size: 9pt; color: #143884;"&gt;avg(X)&lt;/span&gt; &lt;/span&gt; &lt;/p&gt; &lt;/td&gt; &lt;td&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;&lt;span style="font-size: 9pt; color: #143884;"&gt;返回组中值的平均值。&lt;/span&gt; &lt;/span&gt; &lt;/p&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;&lt;span style="font-size: 9pt; color: #143884;"&gt;count(X)&lt;/span&gt; &lt;/span&gt; &lt;/p&gt; &lt;/td&gt; &lt;td&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;&lt;span style="font-size: 9pt; color: #143884;"&gt;返回组中项目的数量。&lt;/span&gt; &lt;/span&gt; &lt;/p&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;&lt;span style="font-size: 9pt; color: #143884;"&gt;max(X)&lt;/span&gt; &lt;/span&gt; &lt;/p&gt; &lt;/td&gt; &lt;td&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;&lt;span style="font-size: 9pt; color: #143884;"&gt;返回组中值的最大值。&lt;/span&gt; &lt;/span&gt; &lt;/p&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;&lt;span style="font-size: 9pt; color: #143884;"&gt;min(X)&lt;/span&gt; &lt;/span&gt; &lt;/p&gt; &lt;/td&gt; &lt;td&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;&lt;span style="font-size: 9pt; color: #143884;"&gt;返回组中值的最小值。&lt;/span&gt; &lt;/span&gt; &lt;/p&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;&lt;span style="font-size: 9pt; color: #143884;"&gt;sum(X)&lt;/span&gt; &lt;/span&gt; &lt;/p&gt; &lt;/td&gt; &lt;td&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;&lt;span style="font-size: 9pt; color: #143884;"&gt;返回表达式中所有值的和。&lt;/span&gt; &lt;/span&gt; &lt;/p&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;&lt;strong&gt;&lt;span style="font-size: 9pt; color: #143884;"&gt;其他函数&lt;/span&gt; &lt;/strong&gt; &lt;/span&gt; &lt;/p&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;&lt;span style="font-size: 9pt; color: #143884;"&gt;typeof(X)&lt;/span&gt; &lt;/span&gt; &lt;/p&gt; &lt;/td&gt; &lt;td&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;&lt;span style="font-size: 9pt; color: #143884;"&gt;返回数据的类型。&lt;/span&gt; &lt;/span&gt; &lt;/p&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;&lt;span style="font-size: 9pt; color: #143884;"&gt;last_insert_rowid()&lt;/span&gt; &lt;/span&gt; &lt;/p&gt; &lt;/td&gt; &lt;td&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;&lt;span style="font-size: 9pt; color: #143884;"&gt;返回最后插入的数据的&lt;/span&gt; &lt;span style="font-size: 9pt; color: #143884;"&gt;ID&lt;/span&gt; &lt;span style="font-size: 9pt; color: #143884;"&gt;。&lt;/span&gt; &lt;/span&gt; &lt;/p&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;&lt;span style="font-size: 9pt; color: #143884;"&gt;sqlite_version(*)&lt;/span&gt; &lt;/span&gt; &lt;/p&gt; &lt;/td&gt; &lt;td&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;&lt;span style="font-size: 9pt; color: #143884;"&gt;返回&lt;/span&gt; &lt;span style="font-size: 9pt; color: #143884;"&gt;SQLite &lt;/span&gt; &lt;span style="font-size: 9pt; color: #143884;"&gt;的版本。&lt;/span&gt; &lt;/span&gt; &lt;/p&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;&lt;span style="font-size: 9pt; color: #143884;"&gt;change_count()&lt;/span&gt; &lt;/span&gt; &lt;/p&gt; &lt;/td&gt; &lt;td&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;&lt;span style="font-size: 9pt; color: #143884;"&gt;返回受上一语句影响的行数。&lt;/span&gt; &lt;/span&gt; &lt;/p&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;&lt;span style="font-size: 9pt; color: #143884;"&gt;last_statement_change_count()&lt;/span&gt; &lt;/span&gt; &lt;/p&gt; &lt;/td&gt; &lt;td&gt; &lt;p&gt;&amp;nbsp; &lt;/p&gt; &lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt; oh,还有就是看到有人说，好像成批插入的时候，启动事务，比不启动事务快n倍&lt;br /&gt; 还有就是尽量使用参数化的SQL,估计和商用DB一样能够自动Prepare.&lt;br /&gt;&lt;/span&gt; &lt;/p&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;===========&lt;/span&gt; &lt;/p&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;sqlite 可以在shell/dos command底下直接执行命令：&lt;br /&gt;&lt;br /&gt; sqlite3 film.db "select * from film;"&lt;br /&gt;&lt;br /&gt;&lt;strong style="color: #0000ff;"&gt;输出 HTML 表格：&lt;/strong&gt; &lt;br /&gt;&lt;br /&gt; sqlite3 -html film.db "select * from film;"&lt;br /&gt;&lt;br /&gt;&lt;strong style="color: #0000ff;"&gt;将数据库「倒出来」：&lt;br /&gt;&lt;/strong&gt; &lt;br /&gt; sqlite3 film.db ".dump" &amp;gt; output.sql&lt;br /&gt;&lt;br /&gt; 利用输出的资料，建立一个一模一样的数据库（加上以上指令，就是标准的SQL数据库备份了）：&lt;br /&gt;&lt;br /&gt; sqlite3 film.db &amp;lt; output.sql&lt;br /&gt;&lt;br /&gt; 在大量插入资料时，你可能会需要先打这个指令：&lt;br /&gt;&lt;br /&gt; begin;&lt;br /&gt;&lt;br /&gt; 插入完资料后要记得打这个指令，资料才会写进数据库中：&lt;br /&gt;&lt;br /&gt; commit; &lt;/span&gt;    &lt;/p&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;&lt;strong style="color: #ff0000;"&gt;SQLITE 深入------常见问题&lt;/strong&gt; &lt;br /&gt;&lt;/span&gt; &lt;/p&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;&lt;strong&gt;如何建立自动增长字段?&lt;/strong&gt; &lt;/span&gt; &lt;/p&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;简短回答：&lt;span style="color: #ff0000;"&gt;&lt;strong&gt;声明为 INTEGER PRIMARY KEY 的列将会自动增长&lt;/strong&gt; &lt;/span&gt; 。&lt;/span&gt; &lt;/p&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;长一点的答案： 如果你声明表的一列为 INTEGER PRIMARY KEY，那么， 每当你在该列上插入一NULL值时， NULL自动被转换为一个比该列中最大值大1的一个整数，如果表是空的， 将会是1。 (如果是最大可能的主键 9223372036854775807，那个，将键值将是随机未使用的数。） 如，有下列表：&lt;/span&gt; &lt;/p&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;CREATE TABLE t1(&lt;br /&gt; a INTEGER PRIMARY KEY,&lt;br /&gt; b INTEGER&lt;br /&gt; );&lt;br /&gt; 在该表上，下列语句&lt;/span&gt; &lt;/p&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;INSERT INTO t1 VALUES(NULL,123);&lt;br /&gt; 在逻辑上等价于：&lt;/span&gt; &lt;/p&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;INSERT INTO t1 VALUES((SELECT max(a) FROM t1)+1,123);&lt;br /&gt; 有一个新的API叫做 &lt;strong&gt;&lt;span style="color: #ff0000;"&gt;&lt;strong&gt;sqlite3_last_insert_rowid()， 它将返回最近插入的整数值。&lt;/strong&gt; &lt;/span&gt; &lt;/strong&gt; 注 意该整数会比表中该列上的插入之前的最大值大1。 该键值在当前的表中是唯一的。但有可能与已从表中删除的值重叠。 要想建立在整个表的生命周期中唯一的键值，需要在 INTEGER PRIMARY KEY 上增加AUTOINCREMENT声明。那么，新的键值将会比该表中曾能存在过的最大值大1。 如果最大可能的整数值在数据表中曾经存在过，INSERT将会失败， 并返回SQLITE_FULL错误代码。&lt;/span&gt; &lt;/p&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;&lt;strong&gt;多个应用程序或一个应用程序的多个实例可以同时访问同一个数据库文件吗？&lt;/strong&gt; &lt;/span&gt; &lt;/p&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;多个进程可同时打开同一个数据库。多个进程可以同时进行SELECT 操作，但在任一时刻，只能有一个进程对数据库进行更改。&lt;/span&gt; &lt;/p&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;SQLite 使用读、写锁控制对数据库的访问。（在Win95/98/ME等不支持读、 写锁的系统下，使用一个概率性的模拟来代替。）但使用时要注意： 如果数据库文件存放于一个NFS文件系统上，这种锁机制可能不能正常工作。 这是因为 fcntl() 文件锁在很多NFS上没有正确的实现。 在可能有多个进程同时访问数据库的时候，应该避免将数据库文件放到NFS上。 在Windows上，Microsoft的文档中说：如果使用 FAT 文件系统而没有运行 share.exe 守护进程，那么锁可能是不能正常使用的。那些在Windows上有很多经验的人告诉我： 对于网络文件，文件锁的实现有好多Bug，是靠不住的。如果他们说的是对的， 那么在两台或多台Windows机器间共享数据库可能会引起不期望的问题。&lt;/span&gt; &lt;/p&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;我们意识到，没有其它嵌入式的 SQL 数据库引擎能象 SQLite  这样处理如此多的并发。SQLite 允许多个进程同时打开一个数据库， 同时读一个数据库。当有任何进程想要写时，它必须在更新过程中锁住数据库文件。 但那通常只是几毫秒的时间。其它进程只需等待写进程干完活结束。 典型地，其它嵌入式的SQL数据库引擎同时只允许一个进程连接到数据库。&lt;/span&gt; &lt;/p&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;但是，Client/Server数据库引擎（如 PostgreSQL, MySQL, 或 Oracle） 通常支持更高级别的并发，并且允许多个进程同时写同一个数据库。 这种机制在Client/Server结构的数据库上是可能的， 因为总是有一个单一的服务器进程很好地控制、协调对数据库的访问。 如果你的应用程序需要很多的并发，那么你应该考虑使用一个Client/Server 结构的数据库。但经验表明，很多应用程序需要的并发，往往比其设计者所想象的少得多。&lt;/span&gt; &lt;/p&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;当SQLite 试图访问一个被其它进程锁住的文件时，缺省的行为是返回 SQLITE_BUSY。 可以在C代码中使用 sqlite3_busy_handler() 或 sqlite3_busy_timeout() API 函数调整这一行为。&lt;/span&gt; &lt;/p&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;&lt;strong&gt;在SQLite 数据库中如何列出所有的表和索引？&lt;/strong&gt; &lt;/span&gt; &lt;/p&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;如果你运行 sqlite3 命令行来访问你的数据库，可以键入 &amp;#8220;.tables&amp;#8221;来获得所有表的列表。或者，你可以输入 &amp;#8220;.schema&amp;#8221; 来看整个数据库模式，包括所有的表的索引。 输入这些命令，后面跟一个LIKE模式匹配可以限制显示的表。&lt;/span&gt; &lt;/p&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;在一个 C/C++ 程序中（或者脚本语言使用 Tcl/Ruby/Perl/Python 等） 你可以在一个特殊的名叫 SQLITE_MASTER 上执行一个SELECT查询以获得所有 表的索引。每一个 SQLite  数据库都有一个叫 SQLITE_MASTER 的表， 它定义数据库的模式。 SQLITE_MASTER 表看起来如下：&lt;/span&gt; &lt;/p&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;CREATE TABLE sqlite_master (&lt;br /&gt; type TEXT,&lt;br /&gt; name TEXT,&lt;br /&gt; tbl_name TEXT,&lt;br /&gt; rootpage INTEGER,&lt;br /&gt; sql TEXT&lt;br /&gt; );&lt;br /&gt; 对于表来说，type 字段永远是 'table'，name 字段永远是表的名字。所以，要获得数据库中所有表的列表， 使用下列SELECT语句：&lt;/span&gt; &lt;/p&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;SELECT name FROM sqlite_master&lt;br /&gt; WHERE type='table'&lt;br /&gt; ORDER BY name;&lt;br /&gt; 对于索引，type 等于 'index', name 则是索引的名字，tbl_name 是该索引所属的表的名字。 不管是表还是索引，sql 字段是原先用 CREATE TABLE 或 CREATE INDEX 语句创建它们时的命令文本。对于自动创建的索引（用来实现 PRIMARY KEY 或 UNIQUE 约束），sql字段为NULL。&lt;/span&gt; &lt;/p&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;SQLITE_MASTER 表是只读的。不能对它使用 UPDATE、INSERT 或 DELETE。 它会被 CREATE TABLE、CREATE INDEX、DROP TABLE 和 DROP INDEX 命令自动更新。&lt;/span&gt; &lt;/p&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;临时表不会出现在 SQLITE_MASTER 表中。临时表及其索引和触发器存放在另外一个叫 SQLITE_TEMP_MASTER 的表中。SQLITE_TEMP_MASTER 跟 SQLITE_MASTER 差不多， 但它只是对于创建那些临时表的应用可见。如果要获得所有表的列表， 不管是永久的还是临时的，可以使用类似下面的命令：&lt;/span&gt; &lt;/p&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;SELECT name FROM &lt;br /&gt; &amp;nbsp;&amp;nbsp; (SELECT * FROM sqlite_master UNION ALL&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; SELECT * FROM sqlite_temp_master)&lt;br /&gt; WHERE type='table'&lt;br /&gt; ORDER BY name&lt;/span&gt; &lt;/p&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;&lt;strong&gt;在SQLite 中，VARCHAR字段最长是多少？&lt;/strong&gt; &lt;/span&gt; &lt;/p&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;SQLite  不强制 VARCHAR 的长度。 你可以在 SQLITE  中声明一个 VARCHAR(10)，SQLite 还是可以很高兴地允许你放入500个字符。 并且这500个字符是原封不动的，它永远不会被截断。&lt;/span&gt; &lt;/p&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;&lt;strong&gt;SQLite 支持二进制大对象吗？&lt;/strong&gt; &lt;/span&gt; &lt;/p&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;SQLite  3.0 及以后版本允许你在任何列中存储 BLOB 数据。 即使该列被声明为其它类型也可以。&lt;/span&gt; &lt;/p&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;&lt;strong&gt;在SQLite 中，如何在一个表上添加或删除一列？&lt;/strong&gt; &lt;/span&gt; &lt;/p&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;SQLite  有有限地 ALTER TABLE 支持。你可以使用它来在表的末尾增加一列，可更改表的名称。 如果需要对表结构做更复杂的改变，则必须重新建表。 重建时可以先将已存在的数据放到一个临时表中，删除原表， 创建新表，然后将数据从临时表中复制回来。&lt;/span&gt; &lt;/p&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;如，假设有一个 t1 表，其中有 "a", "b", "c" 三列， 如果要删除列 c ，以下过程描述如何做:&lt;/span&gt; &lt;/p&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;BEGIN TRANSACTION;&lt;br /&gt; CREATE TEMPORARY TABLE t1_backup(a,b);&lt;br /&gt; INSERT INTO t1_backup SELECT a,b FROM t1;&lt;br /&gt; DROP TABLE t1;&lt;br /&gt; CREATE TABLE t1(a,b);&lt;br /&gt; INSERT INTO t1 SELECT a,b FROM t1_backup;&lt;br /&gt; DROP TABLE t1_backup;&lt;br /&gt; COMMIT;&lt;/span&gt; &lt;/p&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;&lt;strong&gt;在数据库中删除了很多数据，但数据库文件没有变小，是Bug吗？&lt;/strong&gt; &lt;/span&gt; &lt;/p&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;不是。当你从SQLite 数据库中删除数据时， 未用的磁盘空间将会加入一个内部的&amp;#8220;自由列表&amp;#8221;中。 当你下次插入数据时，这部分空间可以重用。磁盘空间不会丢失， 但也不会返还给操作系统。&lt;/span&gt; &lt;/p&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;如果删除了大量数据，而又想缩小数据库文件占用的空间，执行 VACUUM 命令。 VACUUM 将会从头重新组织数据库。这将会使用数据库有一个空的&amp;#8220;自由链表&amp;#8221;， 数据库文件也会最小。但要注意的是，VACUUM 的执行会需要一些时间 （在SQLite 开发时，在Linux上，大约每M字节需要半秒种），并且， 执行过程中需要原数据库文件至多两倍的临时磁盘空间。&lt;/span&gt; &lt;/p&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;对于 SQLite  3.1版本，一个 auto-vacumm 模式可以替代 VACUUM 命令。 可以使用 auto_vacuum pragma 打开。&lt;/span&gt; &lt;/p&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;&lt;strong&gt;SQLITE_SCHEMA error是什么错误？为什么会出现该错误？&lt;/strong&gt; &lt;/span&gt; &lt;/p&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;当一个准备好的（prepared）SQL语句不再有效或者无法执行时， 将返回一个 SQLITE_SCHEMA 错误。发生该错误时，SQL语句必须使用 sqlite3_prepare() API来重新编译. 在 SQLite  3 中, 一个 SQLITE_SCHEMA 错误只会发生在用 sqlite3_prepare()/sqlite3_step()/sqlite3_finalize() API 执行 SQL 时。而不会发生在使用 sqlite3_exec()时。 在版本2中不是这样。&lt;/span&gt; &lt;/p&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;准备好的语句失效的最通常原因是：在语句准备好后， 数据库的模式又被修改了。另外的原因会发生在：&lt;/span&gt; &lt;/p&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;数据库离线：DETACHed. &lt;br /&gt; 数据库被 VACUUMed &lt;br /&gt; 一个用户存储过程定义被删除或改变。 &lt;br /&gt; 一个 collation 序列定义被删除或改变。 &lt;br /&gt; 认证函数被改变。 &lt;br /&gt; 在所有情况下，解决方法是重新编译并执行该SQL语句。 因为一个已准备好的语句可以由于其它进程改变数据库模式而失效， 所有使用 sqlite3_prepare()/sqlite3_step()/sqlite3_finalize() API 的代码都应准备处理 SQLITE_SCHEMA 错误。下面给出一个例子：&lt;/span&gt; &lt;/p&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; int rc;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; sqlite3_stmt *pStmt;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; char zSql[] = "SELECT .....";&lt;/span&gt; &lt;/p&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; do {&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Compile the statement from SQL. Assume success. */&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sqlite3_prepare(pDb, zSql, -1, &amp;amp;pStmt, 0);&lt;/span&gt; &lt;/p&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; while( SQLITE_ROW==sqlite3_step(pStmt) ){&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Do something with the row of available data */&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt; &lt;/p&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Finalize the statement. If an SQLITE_SCHEMA error has&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ** occured, then the above call to sqlite3_step() will have&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ** returned SQLITE_ERROR. sqlite3_finalize() will return&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ** SQLITE_SCHEMA. In this case the loop will execute again.&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rc = sqlite3_finalize(pStmt);&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; } while( rc==SQLITE_SCHEMA );&lt;/span&gt; &lt;/p&gt; &lt;p&gt;&amp;nbsp; &lt;/p&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;&lt;strong&gt;如何在字符串中使用单引号(')？&lt;/strong&gt; &lt;/span&gt; &lt;/p&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;SQL 标准规定，在字符串中，单引号需要使用逃逸字符，即在一行中使用两个单引号。在这方面 SQL 用起来类似 Pascal 语言。 SQLite  尊循标准。如：&lt;/span&gt; &lt;/p&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; INSERT INTO xyz VALUES('5 O''clock');&lt;/span&gt; &lt;/p&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;Sqlite 中如何返回本地化当前时间？&lt;br /&gt; 在做ClinicOS的时候遇到一个问题，在保存病历登记时间时，我使用了&amp;#8220;CURRENT_TIMESTAMP&amp;#8221;，但这有个问题，它返回的是UTC Time，这对我们中国人没啥用，一直希望能想办法将它转为localtime。今天刚好有空，所以去查了查Sqlite 的Mail List，果然也有人遇到了这个问题，我从一篇名为《translate time comparison statement》（http://www.mail-archive.com/sqlite -users@sqlite .org /msg12350.html）中看到这样的回复：&lt;br /&gt;&lt;/span&gt; &lt;/p&gt; &lt;span style="color: #000000;"&gt;Mark Wyszomierski wrote:    &lt;/span&gt;   &lt;blockquote style="border-left: 0.2em solid #5555ee; margin: 0em; padding-left: 0.85em;"&gt; &lt;blockquote style="border-left: 0.2em solid #5555ee; margin: 0em; padding-left: 0.85em;"&gt; &lt;span style="color: #000000;"&gt;You may want    WHERE julianday(date('now')) - julianday(date(arrival_date)) &amp;gt; 7    &lt;/span&gt;   &lt;/blockquote&gt; &lt;/blockquote&gt; &lt;span style="color: #000000;"&gt;Mark,    &lt;/span&gt;   &lt;p&gt;&lt;span style="color: #000000;"&gt;&lt;tt&gt;You should still use the 'localtime' modifier on the 'now' value if your &lt;/tt&gt; &lt;tt&gt;timestamps are local time since 'now' always returns UTC times. &lt;/tt&gt; &lt;/span&gt; &lt;/p&gt; &lt;span style="color: #000000;"&gt;WHERE julianday(date('now', 'localtime')) - julianday(date(arrival_date)) &amp;gt; 7    嘿嘿，看来如果想得到一个符合本机区域设置的当前时间，必须用date函数来转换，  但date只函数只返回当前日期，而我需要的是返回当前日期及时间，所以这里把它换成datetime函数，即：  datetime(CURRENT_TIMESTAMP,'localtime')    以下是sqlite 下测试的输出信息：  sqlite &amp;gt; select CURRENT_TIMESTAMP;  2006-06-18 09:23:36  sqlite &amp;gt; select datetime(CURRENT_TIMESTAMP,'localtime');  2006-06-18 17:23:44  sqlite &amp;gt;  &lt;/span&gt;   &lt;p&gt;&lt;span style="color: #000000;"&gt;&lt;strong style="color: #ff0000;"&gt;SQLITE 分页&lt;/strong&gt; &lt;br /&gt;&lt;br /&gt;&lt;span style="color: #000000;"&gt;&lt;strong&gt;刚开始的时候没注意语法&lt;br /&gt; 后来才发现，原来用SQLite 分页是世界上最简单的。&lt;br /&gt; 如果我要去11-20的Account表的数据&lt;br /&gt; Select * From Account Limit&amp;nbsp;9 Offset 10;&lt;br /&gt; 以上语句表示从Account表获取数据，跳过10行，取9行&lt;br /&gt;&lt;br /&gt; 嗯，我觉得这个特性足够让很多的web中型网站使用这个了。&lt;br /&gt;&lt;br /&gt; 也可以这样写 select * from account limit10,9和上面的的效果一样。&lt;br /&gt; 这种写法MySQL也支持。 &lt;/strong&gt; &lt;/span&gt; &lt;br /&gt;&lt;/span&gt;  &lt;/p&gt; &lt;div&gt; &lt;span style="color: #000000;"&gt;&lt;a href="http://www.cnblogs.com/shinings/archive/2009/02/11/1388090.html" style="color: #ff0000;"&gt;&lt;strong&gt;SQLite 适用的范围&lt;/strong&gt;  &lt;/a&gt; &lt;/span&gt; &lt;/div&gt; &lt;p&gt;&amp;nbsp; &lt;/p&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;&lt;strong&gt;&lt;span&gt;SQLite 不同于其他大部分的SQL数据库引擎,因为它的首要设计目标就是简单化:&lt;/span&gt;&lt;/strong&gt;  &lt;/span&gt;  &lt;/p&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;&lt;span&gt;易于管理 &lt;br /&gt; 易于使用 &lt;br /&gt; 易于嵌入其他大型程序 &lt;br /&gt; 易于维护和配置 &lt;br /&gt; 许多人喜欢SQLite 因为它的小巧和快速. 但是这些特性只是它的部分优点, 使用者还会发现SQLite 是非常稳定的. 出色的稳定性源于它的简单, 越简单就越不容易出错. 除了上述的简单、小巧和稳定性外, 最重要的在于SQLite 力争做到简单化. &lt;/span&gt; &lt;/span&gt; &lt;/p&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;&lt;span&gt;简单化在一个数据库引擎中可以说是一个优点, 但也可能是个缺点, 主要决定于你想要做什么. 为了达到简单化, SQLite 省略了一些人们认为比较有用的特性, 例如高并发性、 严格的存取控制、 丰富的内置功能、 存储过程、复杂的SQL语言特性、 XML以及Java的扩展, 超大的万亿级别的数据测量等等. 如果你需要使用上述的这些特性并且不介意它们的复杂性, 那么SQLite 也许就不适合你了. SQLite 没有打算作为一个企业级的数据库引擎, 也并不打算和Oracle或者PostgreSQL竞争. &lt;/span&gt; &lt;/span&gt; &lt;/p&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;仅凭经验来说&lt;span&gt;SQLite 适用于以下场合: 当你更看中简单的管理、使用和维护数据库, 而不是那些企业级数据库提供的不计其数的复杂功能的时候，使用SQLite 是一个比较明智的选择. 事实也证明, 人们在许多情况下已经清楚的认识到简单就是最好的选择. &lt;/span&gt; &lt;/span&gt; &lt;/p&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;&lt;strong style="color: #ff0000;"&gt;&lt;span&gt;SQLite 最佳试用场合&lt;/span&gt;&lt;/strong&gt; &lt;br /&gt; 网站&lt;/span&gt;  &lt;/p&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;作为数据库引擎&lt;span&gt;SQLite 适用于中小规模流量的网站(也 就是说, 99.9%的网站). SQLite 可以处理多少网站流量在于网站的数据库有多大的压力. 通常来说, 如果一个网站的点击率少于100000次/天的话, SQLite 是可以正常运行的. 100000次/天是一个保守的估计, 不是一个准确的上限. 事实证明, 即使是10倍的上述流量的情况下SQLite 依然可以正常运行.&lt;/span&gt; &lt;/span&gt; &lt;/p&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;&lt;span&gt;&lt;strong style="color: #ff0000;"&gt;嵌入式设备和应用软件&lt;/strong&gt; &lt;/span&gt; &lt;/span&gt; &lt;/p&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;因为&lt;span&gt;SQLite 数据库几乎不需要管理, 因此对于那些无人值守运行或无人工技术支持的设备或服务, SQLite 是一个很好的选择. SQLite 能很好的适用于手机, PDA, 机顶盒, 以及其他仪器. 作为一个嵌入式数据库它也能够很好的应用于客户端程序. &lt;/span&gt; &lt;/span&gt; &lt;/p&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;&lt;span&gt;&lt;strong style="color: #ff0000;"&gt;应用程序文件格式&lt;/strong&gt; &lt;/span&gt; &lt;/span&gt; &lt;/p&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;&lt;span&gt;SQLite 作为桌面应用程序的本地磁盘文件格式取得了巨 大成功.例如金融分析工具、CAD 包、档案管理程序等等. 一般的数据库打开操作需要调用sqlite3_open()函数，并且标记一个显式本地事务的起始点（BEGIN TRANSACTION）来保证以独占的方式得到文件的内容. 文件保存将执行一个提交（COMMIT）同时标记另一个显式本地事务起始点. 这种事务处理的作用就是保证对于应用程序数据文件的更新是原子的、持久的、独立的和一致的. &lt;/span&gt; &lt;/span&gt; &lt;/p&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;数据库里可以加入一些临时的触发器,用来把所有的改变记录在一张临时的取消/重做日志表中. 当用户按下取消/重做按钮的时候这些改变将可以被回滚. 应用这项技术实现一个无限级的取消/重做功能只需要编写很少的代码.  &lt;/span&gt; &lt;/p&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;替代某些特别的文件格式 &lt;/span&gt; &lt;/p&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;许多程序使用fopen(), fread(), 或 fwrite()函数创建和管理一些自定义的文件用来保存数据. 使用&lt;span&gt;SQLite 替代这些自定义的文件格式将是一种很好的选择.&lt;/span&gt; &lt;/span&gt; &lt;/p&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;&lt;span&gt;&lt;strong style="color: #ff0000;"&gt;内部的或临时的数据库&lt;/strong&gt; &lt;/span&gt; &lt;/span&gt; &lt;/p&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;&lt;span&gt;对于那些有大量的数据需要用不同的方式筛选分类的程序, 相对于编写同样功能的代码, 如果你把数据读入一个内存中的SQLite 数据库, 然后使用连接查询和ORDER BY子句按一定的顺序和排列提取需要的数据, 通常会更简单和快速. 按照上述的方法使用内嵌的SQLite 数据库将会使程序更富有灵活性, 因为添加新的列或索引不用重写任何查询语句. &lt;/span&gt; &lt;/span&gt; &lt;/p&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;&lt;span&gt;&lt;strong style="color: #ff0000;"&gt;命令行数据集分析工具&lt;/strong&gt; &lt;/span&gt; &lt;/span&gt; &lt;/p&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;有经验的SQL用户可以使用&lt;span&gt;SQLite 命令行程序去分析各种混杂的数据集. 原是数据可以从CSV（逗号分隔值文件）文件中导入, 然后被切分产生无数的综合数据报告. 可能得用法包括网站日志分析, 运动统计分析, 编辑规划标准, 分析试验结果. &lt;/span&gt; &lt;/span&gt; &lt;/p&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;当然你也可以用企业级的客户端/服务器数据库来做同样的事情. 在这种情况下使用&lt;span&gt;SQLite 的好处是: SQLite 的部署更为简单并且结果数据库是一个单独的文件, 你可以把它存储在软盘或者优盘或者直接通过email发给同事. &lt;/span&gt; &lt;/span&gt; &lt;/p&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;在Demo或测试版的时候作为企业级数据库的替代品 &lt;/span&gt; &lt;/p&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;&lt;span&gt;如果你正在编写一个使用企业级数据库引擎的客户端程序, 使用一个允许你连接不同SQL数据库引擎的通用型数据库后台将是很有意义的. 其更大的意义在于将SQLite 数据库引擎静态的连接到客户端程序当中，从而内嵌SQLite 作为混合的数据库支持. 这样客户端程序就可以使用SQLite 数据库文件做独立的测试或者验证.&lt;/span&gt; &lt;/span&gt; &lt;/p&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;本文来自: (www.91linux.com) 详细出处参考：http://www.91linux.com/html/article/database/&lt;span&gt;sqlite /200812/12-14611.html&lt;/span&gt; &lt;/span&gt; &lt;/p&gt; &lt;p&gt;&amp;nbsp; &lt;/p&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;&lt;strong style="color: #ff0000;"&gt;数据库教学&lt;/strong&gt; &lt;/span&gt; &lt;/p&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;因为SQLite 的安装和使用非常的简单(安装过程几乎忽略不计, 只需要拷贝SQLite 源代码或sqlite .exe可执行文件到目标主机, 然后直接运行就可以) 所以它非常适合用来讲解SQL语句. 同学们可以非常简单的创建他们喜欢的数据库, 然后通过电子邮件发给老师批注或打分. 对于那些感兴趣怎样实现一个关系型数据库管理系统（RDBMS）的高层次的学生, 按照模块化设计且拥有很好的注释和文档的SQLite 源代码, 将为他们打下良好的基础. 这并不是说SQLite 就是如何实现其他数据库引擎的精确模型, 但是很适合学生们了解SQLite 是如何快速工作的, 从而掌握其他数据库系统的设计实现原则. &lt;/span&gt; &lt;/p&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;&lt;strong style="color: #ff0000;"&gt;试验SQL语言的扩展&lt;/strong&gt; &lt;/span&gt; &lt;/p&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;SQLite 简单且模块化的设计使得它可以成为一个用来测试数据库语言特性或新想法的优秀的原型平台. &lt;/span&gt; &lt;/p&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;哪些场合适合使用其他的关系型数据库管理系统（RDBMS）&lt;br /&gt;&lt;strong&gt;&lt;span style="color: #ff0000;"&gt;&lt;strong&gt;客户端/服务器程序&lt;/strong&gt;  &lt;/span&gt; &lt;/strong&gt; &lt;/span&gt; &lt;/p&gt; &lt;p&gt;&amp;nbsp; &lt;/p&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;如果你有许多的客户端程序要通过网络访问一个共享的数据库, 你应当考虑用一个客户端/服务器数据库来替代SQLite . SQLite 可以通过网络文件系统工作, 但是因为和大多数网络文件系统都存在延时, 因此执行效率不会很高. 此外大多数网络文件系统在实现文件逻辑锁的方面都存在着bug(包括Unix 和windows). 如果文件锁没有正常的工作, 就可能出现在同一时间两个或更多的客户端程序更改同一个数据库的同一部分, 从而导致数据库出错. 因为这些问题是文件系统执行的时候本质上存在的bug, 因此SQLite 没有办法避免它们.&lt;/span&gt; &lt;/p&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;好的经验告诉我们, 应该避免在许多计算机需要通过一个网络文件系统同时访问同一个数据库的情况下使用SQLite .&lt;/span&gt; &lt;/p&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;&lt;strong style="color: #ff0000;"&gt;高流量网站&lt;/strong&gt; &lt;/span&gt; &lt;/p&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;SQLite 通常情况下用作一个网站的后台数据库可以很好的工作. 但是如果你的网站的访问量大到你开始考虑采取分布式的数据库部署, 那么你应当毫不犹豫的考虑用一个企业级的客户端/服务器数据库来替代SQLite .&lt;/span&gt; &lt;/p&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;&lt;strong style="color: #ff0000;"&gt;超大的数据集&lt;/strong&gt; &lt;/span&gt; &lt;/p&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;当你在SQLite 中开始一个事务处理的时候(事务处理会在任何写操作发生之前产生, 而不是必须要显示的调用BEGIN...COMMIT), 数据库引擎将不得不分配一小块脏页(文件缓冲页面)来帮助它自己管理回滚操作. 每1MB的数据库文件SQLite 需要256字节. 对于小型的数据库这些空间不算什么, 但是当数据库增长到数十亿字节的时候, 缓冲页面的尺寸就会相当的大了. 如果你需要存储或修改几十GB的数据, 你应该考虑用其他的数据库引擎. &lt;/span&gt; &lt;/p&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;&lt;strong style="color: #ff0000;"&gt;高并发访问&lt;/strong&gt; &lt;/span&gt; &lt;/p&gt; &lt;p&gt;&lt;span style="color: #000000;"&gt;SQLite 对于整个数据库文件进行读取/写入锁定. 这意味着如果任何进程读取了数据库中的某一部分, 其他所有进程都不能再对该数据库的任何部分进行写入操作. 同样的, 如果任何一个进程在对数据库进行写入操作, 其他所有进程都不能再读取该数据库的任何部分. 对于大多数情况这不算是什么问题. 在这些情况下每个程序使用数据库的时间都很短暂, 并且不会独占, 这样锁定至多会存在十几毫秒. 但是如果有些程序需要高并发, 那么这些程序就需要寻找其他的解决方案了&lt;/span&gt; &lt;/p&gt;  &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;常见问题：&lt;/p&gt;&lt;p&gt;&lt;div&gt;1. 怎么创建一个自增字段&lt;br /&gt;把字段声明成 interger primary key 就可以了&lt;br /&gt;例子 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; create table t1 ( a integer primary key , b integer);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; insert into t1 values (NULL, 10);&lt;br /&gt;&lt;br /&gt;sqlite3_last_insert_rowid() 这个函数获得最后插入的记录的id&lt;br /&gt;&lt;br /&gt;2. sqlite支持哪些数据类型&lt;br /&gt;integer, real, text, blob, null &lt;br /&gt;&lt;br /&gt;3. sqlite为什么能让我插入一个字符串到一个整形字段&lt;br /&gt;这个特性不是bug. SQLite uses dynamic typing.&lt;br /&gt;不做数据类型的强制转换，任何数据都能被插入到任何列。&lt;br /&gt;除了primary key限定的字段做整形检查，其他字段都不检查插入数据类型.&lt;br /&gt;insert into t1 values(NULL, 'lskdf');&lt;br /&gt;&lt;br /&gt;4. 为什么不让我使用'0'和'0.0'在一张表中同时做主键&lt;br /&gt;你肯定是用的integer做的主键类型，换成text类型做主键就行了&lt;br /&gt;&lt;br /&gt;5. 多个应用程序或同一个应用程序的多个线程能同时访问一个数据库文件吗&lt;br /&gt;可以。但是只能同时访问只能做select，只能有1个进程去修改数据&lt;br /&gt;sqlite使用读写锁控制数据库的访问权限.&lt;br /&gt;注意: nfs文件系统支持有问题&lt;br /&gt;&lt;br /&gt;6. sqlite线程安全吗&lt;br /&gt;是安全的.&lt;br /&gt;编译的时候SQLITE_THREADSAFE的参数设置成1，就支持线程安全&lt;br /&gt;如果不确定是否支持可以调用sqlite3_threadsafe() 函数来检测，返回0就是支持&lt;br /&gt;&lt;br /&gt;7. 怎样列出数据库中所有的表和索引&lt;br /&gt;在命令行模式使用 ".tables"列出所有的表和索引&lt;br /&gt;也可以使用 ".shema" 列出所有的表的概要 类似于mysql中的(show create table xxx)&lt;br /&gt;".schema tablename/LIKE patern" 可以直接跟表名字，也可以跟一个LIKE的匹配&lt;br /&gt;例子".schema tab%"&lt;br /&gt;&lt;br /&gt;在c或c++中，我们可以通过一个select语句来获取数据库中的所有的表&lt;br /&gt;sqlite默认有一个sqlite_master表，里面存了所有的已经创建的表，这个表的定义如下:&lt;br /&gt;sqlite&amp;gt; .schema sqlite_master&lt;br /&gt;CREATE TABLE sqlite_master (&lt;br /&gt;&amp;nbsp; type text,&lt;br /&gt;&amp;nbsp; name text,&lt;br /&gt;&amp;nbsp; tbl_name text,&lt;br /&gt;&amp;nbsp; rootpage integer,&lt;br /&gt;&amp;nbsp; sql text&lt;br /&gt;);&lt;br /&gt;索引的类型是"index"&lt;br /&gt;当type是索引的时， name字段是索引名, tbl_name是表名, sql字段是创建表/索引的语句&lt;br /&gt;&lt;br /&gt;sqlite&amp;gt; select name from sqlite_master where type='table';&lt;br /&gt;sqlite_sequence&lt;br /&gt;t1&lt;br /&gt;t2&lt;br /&gt;&lt;br /&gt;8. sqlite数据库的大小限制&lt;br /&gt;好长，看了下，反正肯定我用不完&lt;br /&gt;&lt;br /&gt;9. VARCHAR类型的大小限制&lt;br /&gt;就算你声明的是varchar(10), 你也可以存500个字符进去. 最多允许5000个字符.&lt;br /&gt;&lt;br /&gt;10. 是否支持BLOB类型&lt;br /&gt;3.0以及以上版本都支持, 不管你的列定义的是什么类型都能插入BLOB类型&lt;br /&gt;&lt;br /&gt;11. 我怎么删除或添加表中的列&lt;br /&gt;sqlite只能添加字段在表的最后或rename这个字段名&lt;br /&gt;如果你要更多的修改,建议你建个新表 例子如下&lt;br /&gt;&lt;br /&gt;如果你有一个表 "t1", 有"a", "b", "c" 3列, 然后你想删除列"c",就可以做这个操作&lt;br /&gt;BEGIN TRANSACTION;&lt;br /&gt;CREATE TEMPORARY TABLE t1_backup(a,b);&lt;br /&gt;INSERT INTO t1_backup SELECT a,b FROM t1;&lt;br /&gt;DROP TABLE t1;&lt;br /&gt;CREATE TABLE t1(a,b);&lt;br /&gt;INSERT INTO t1 SELECT a,b FROM t1_backup;&lt;br /&gt;DROP TABLE t1_backup;&lt;br /&gt;COMMIT;&lt;br /&gt;&lt;br /&gt;12. 我删除了大量的数据， 但是数据库大小没有变小，这是bug吗？&lt;br /&gt;这不是bug.&amp;nbsp; 删除完后的空闲磁盘都被添加到内部的"free_list"中, 用来存储下次插入的数据.&lt;br /&gt;如果你想释放空间可以用 "vacuum" 命令.&lt;br /&gt;在3.1版本，有一个auto-vaccum模式&lt;br /&gt;查看这个模式 "PRAGMA auto_vacuum" &lt;br /&gt;0 none&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (default) &lt;br /&gt;1 full&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 每次删除都清空数据库的空间(必须在表被创建的之前打开这个选项才有效)&lt;br /&gt;2 incremental&amp;nbsp; 附加信息需要被存储到数据库中, 但是每次任务完成后是不会像 设置成 1那样自动执行. 需要单独的执行"PRAGMA incremental_vacuum" 这个命令来产生事件(不懂什么意思)&lt;br /&gt;&lt;br /&gt;13. 是否可以免费商业化&lt;br /&gt;可以.&lt;br /&gt;&lt;br /&gt;14. 怎样逃逸单引号&lt;br /&gt;2个单引号就可以转义一个单引号 例子&lt;br /&gt;INSERT INTO xyz VALUES('5 O''clock');&lt;br /&gt;&amp;nbsp;&lt;br /&gt;15. SQLITE_SCHEMA错误是什么&lt;br /&gt;当一个预备好的sql语句不再有效或不能执行就会返回这个错误. &lt;br /&gt;出现这个错误必须重新编译一下sql语句&lt;br /&gt;这个错误只可能在调用sqlite3_prepare(), and sqlite3_step() 出现, 不可能从sqlite3_exec()函数中返回这个错误&lt;br /&gt;如果你用sqlite3_prepare_v2()替换sqlite3_prepare(), 你也不会收到这个错误&lt;br /&gt;&lt;br /&gt;(16) Why does ROUND(9.95,1) return 9.9 instead of 10.0? Shouldn't 9.95 round up?&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;  SQLite uses binary arithmetic and in binary, there is no way to write  9.95 in a finite number of bits. The closest to you can get to 9.95 in a  64-bit IEEE float (which is what SQLite uses) is  9.949999999999999289457264239899814128875732421875. So when you type  "9.95", SQLite really understands the number to be the much longer value  shown above. And that value rounds down.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; This kind of  problem comes up all the time when dealing with floating point binary  numbers. The general rule to remember is that most fractional numbers  that have a finite representation in decimal (a.k.a "base-10") do not  have a finite representation in binary (a.k.a "base-2"). And so they are  approximated using the closest binary number available. That  approximation is usually very close, but it will be slightly off and in  some cases can cause your results to be a little different from what you  might expect.&lt;br /&gt;&lt;br /&gt;(17) I get hundreds of compiler warnings when I compile SQLite. Isn't this a problem? Doesn't it indicate poor code quality?&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;  Quality assurance in SQLite is done using full-coverage testing, not by  compiler warnings or other static code analysis tools. In other words,  we verify that SQLite actually gets the correct answer, not that it  merely satisfies stylistic constraints. Most of the SQLite code base is  devoted purely to testing. The SQLite test suite runs tens of thousands  of separate test cases and many of those test cases are parameterized so  that hundreds of millions of tests involving billions of SQL statements  are run and evaluated for correctness prior to every release. The  developers use code coverage tools to verify that all paths through the  code are tested. Whenever a bug is found in SQLite, new test cases are  written to exhibit the bug so that the bug cannot recur undetected in  the future.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; During testing, the SQLite library is compiled  with special instrumentation that allows the test scripts to simulate a  wide variety of failures in order to verify that SQLite recovers  correctly. Memory allocation is carefully tracked and no memory leaks  occur, even following memory allocation failures. A custom VFS layer is  used to simulate operating system crashes and power failures in order to  ensure that transactions are atomic across these events. A mechanism  for deliberately injecting I/O errors shows that SQLite is resilient to  such malfunctions. (As an experiment, try inducing these kinds of errors  on other SQL database engines and see what happens!)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; We also run SQLite using Valgrind on Linux and verify that it detects no problems.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;  Some people say that we should eliminate all warnings because benign  warnings mask real warnings that might arise in future changes. This is  true enough. But in reply, the developers observe that all warnings have  already been fixed in the compilers used for SQLite development  (various versions of GCC). Compiler warnings only arise from compilers  that the developers do not have access to.&lt;br /&gt;&lt;br /&gt;18. 不能匹配unicode字符&lt;br /&gt;&lt;br /&gt;19. 插入十分慢 - I can only do few dozen INSERTs per second( dozen == 累计到一定量再插入吗？)&lt;br /&gt;实际上sqlite能够在普通的电脑上很容易的每秒插入50,000或更多的数据&lt;br /&gt;But it will only do a few dozen transactions per second.&lt;br /&gt;&lt;br /&gt;20. 如果我删除了很重要的数据，我怎么恢复？&lt;br /&gt;如果你有有备份 可以从备份中恢复. &lt;br /&gt;如果你没有备份 恢复数据将非常困难. 你可以能从裸数据库文件中的dump中找到一些数据 云云 &lt;br /&gt;&lt;br /&gt;(21) What is an SQLITE_CORRUPT error? What does it mean for the database to be "malformed"? Why am I getting this error?&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;  An SQLITE_CORRUPT error is returned when SQLite detects an error in the  structure, format, or other control elements of the database file.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;  SQLite does not corrupt database files, except in the case of very rare  bugs (see DatabaseCorruption) and even then the bugs are normally  difficult to reproduce. Even if your application crashes in the middle  of an update, your database is safe. The database is safe even if your  OS crashes or takes a power loss. The crash-resistance of SQLite has  been extensively studied and tested and is attested by years of  real-world experience by millions of users."&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; That said, there  are a number of things that external programs or bugs in your hardware  or OS can do to corrupt a database file. Details can be found in the  discussions on the atomic commit and locking support in SQLite as well  as in the mailing list archives.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Your can use PRAGMA integrity_check to do a thorough but time intensive test of the database integrity.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Your can use PRAGMA quick_check to do a faster but less thorough test of the database integrity.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;  Depending how badly your database is corrupted, you may be able to  recover some of the data by using the CLI to dump the schema and  contents to a file and then recreate. Unfortunately, once humpty-dumpty  falls off the wall, it is generally not possible to put him back  together again.&lt;br /&gt;&lt;br /&gt;22. 外键支持&lt;br /&gt;在3.6.19 就支持外键&lt;br /&gt;&lt;br /&gt;(23) I get a compiler error if I use the SQLITE_OMIT_... compile-time options when building SQLite.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;  The SQLITE_OMIT_... compile-time options only work when building from  canonically source files. They do not work when you build from the  SQLite amalgamation or from the pre-processed source files.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;  It is possible to build a special amalgamation that will work with a  predetermined set of SQLITE_OMIT_... options. Instructions for doing so  can be found with the SQLITE_OMIT_... documentation. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;24. 我的where表达式 column1="column1" 不工作, 会返回表中的所有行&lt;br /&gt;把双引号换成单引号, &lt;br /&gt;&lt;br /&gt;(25) How are the syntax diagrams (a.k.a. "railroad" diagrams) for SQLite generated?&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; The process is explained at http://wiki.tcl.tk/21708.&lt;br /&gt;&lt;br /&gt;26没看明白, 反正sqlite能够在unique字段可以为NULL的时候插入多个NULL，mysql也可以&lt;br /&gt;(26)  The SQL standard requires that a UNIQUE constraint be enforced even of  one or more of the columns in the constraint are NULL, but SQLite does  not do this. Isn't that a bug?&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Perhaps you are referring to the following statement from SQL92:&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  A unique constraint is satisfied if and only if no two rows in a table  have the same non-null values in the unique columns. &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; That statement is ambiguous, having at least two possible interpretations:&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  1. A unique constraint is satisfied if and only if no two rows in a  table have the same values and have non-null values in the unique  columns.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2. A unique constraint is satisfied if and only if no  two rows in a table have the same values in the subset of unique  columns that are not null. &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SQLite follows interpretation  (1), as does PostgreSQL, MySQL, Oracle, and Firebird. It is true that  Informix and Microsoft SQL Server use interpretation (2), however we the  SQLite developers hold that interpretation (1) is the most natural  reading of the requirement and we also want to maximize compatibility  with other SQL database engines, and most other database engines also go  with (1), so that is what SQLite does. &lt;/div&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/answer/aggbug/2520401.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/answer/archive/2012/05/27/2520401.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/answer/archive/2012/03/20/2407912.html</id><title type="text">[转]WM手机,关于如何让手机一直运行下去,而不进入待机</title><summary type="text">最近在WM手机上做一个水尺识别的项目,就是用手机不间断监测水库水位信息,把代码调差不多的时候,发现了一个问题,就是手机在拔掉USB线后运行程序,过一段时间手机会自动进入待机状态,导致CPU休眠,最后程序也就停止运行了. 首先看看MSDN的介绍吧: http://msdn.microsoft.com/en-us/library/aa932196.aspx 这涉及到电源的管理方案. 刚开始我在注册表里找到 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Power\Timeouts 具体值如下: 从上面可以看出,在有AC电源的情况下,...</summary><published>2012-03-20T06:37:00Z</published><updated>2012-03-20T06:37:00Z</updated><author><name>answer</name><uri>http://www.cnblogs.com/answer/</uri></author><link rel="alternate" href="http://www.cnblogs.com/answer/archive/2012/03/20/2407912.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/answer/archive/2012/03/20/2407912.html"/><content type="html">&lt;div&gt;  最近在WM手机上做一个水尺识别的项目,就是用手机不间断监测水库水位信息,把代码调差不多的时候,发现了一个问题,就是手机在拔掉USB线后运行程序,过一段时间手机会自动进入待机状态,导致CPU休眠,最后程序也就停止运行了. &lt;p&gt;首先看看MSDN的介绍吧:&amp;nbsp;&amp;nbsp;  &lt;a href="http://msdn.microsoft.com/en-us/library/aa932196.aspx"&gt;http://msdn.microsoft.com/en-us/library/aa932196.aspx&lt;/a&gt;&lt;/p&gt; &lt;p&gt;这涉及到电源的管理方案.&lt;/p&gt; &lt;p&gt;刚开始我在注册表里找到&lt;/p&gt; &lt;p&gt;&lt;strong&gt;HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Power\Timeouts&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;具体值如下:&lt;/p&gt; &lt;p&gt;&lt;img src="http://hiphotos.baidu.com/wangwenfang521/pic/item/d8c80bad2f54fd374a36d653.jpg" border="0"  alt="" /&gt;&lt;/p&gt; &lt;p&gt;从上面可以看出,在有AC电源的情况下, 60秒后会自动待机,在有电源的情况下也是60秒,这两个值都可以通过手机的电源管理上设置,也可以直接修改注册表.&lt;/p&gt; &lt;p&gt;我通过修改注册表的方法,把ACSuspendTimeOut 和BattSuspendTimerout值都设成零后，发现结果还是一样，程序还是会进入休眠状态。&lt;/p&gt; &lt;p&gt;最后通过调用下面的函数解决问题：&lt;/p&gt; &lt;p&gt;&lt;span&gt;void KeepAlive()&lt;br /&gt; {&lt;br /&gt; SystemIdleTimerReset();&lt;br /&gt; SHIdleTimerReset();&lt;br /&gt; }&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span&gt;具体方法是通过一个定时器，定时的调用这个函数，就可以让程序保持非待机状态，最后完美的解决问题！&lt;img src="http://img.baidu.com/hi/jx2/j_0026.gif"  alt="" /&gt;&lt;br /&gt; &lt;/span&gt;&lt;/p&gt; &lt;p&gt;看看这两个函数在MSDN中的介绍吧:&lt;/p&gt; &lt;div style="padding-right: 10px; padding-left: 22px; padding-bottom: 0px; padding-top: 0px"&gt; &lt;p&gt;&lt;strong&gt;&lt;a name="wce50lrfsystemidletimerreset"&gt;&lt;/a&gt;SystemIdleTimerReset&lt;/strong&gt;&lt;/p&gt; &lt;/div&gt; &lt;div style="visibility: hidden"&gt; &lt;p&gt;&lt;strong&gt;Requirements&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;OS Versions:&lt;/strong&gt; Windows CE 2.0 and later.&lt;br /&gt; &lt;strong&gt;Header:&lt;/strong&gt; Winuser.h.&lt;/p&gt; &lt;/div&gt; &lt;div style="padding-right: 20px; overflow: auto; width: 1173px; top: 0px; height: 511px" valign="bottom"&gt; &lt;p&gt;This function resets a system timer that controls whether or not the device will automatically go into a suspended state.&lt;/p&gt; &lt;strong&gt;void WINAPI SystemIdleTimerReset(void); &lt;/strong&gt; &lt;p&gt;&lt;strong&gt;Parameters&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;None.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Return Values&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;None.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Remarks&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;The default behavior is to go into a suspended state after a  specified period of time expires. This time interval is specified in the  registry. Calling &lt;strong&gt;SystemIdleTimerReset&lt;/strong&gt; overrides the registry setting by resetting the timer.&lt;/p&gt; &lt;p&gt;If the Power Manager is managing timeouts, calls to &lt;strong&gt;SystemIdleTimerReset&lt;/strong&gt; will still reset the GWES timeout and cause the screen saver to stop showing.&lt;/p&gt; &lt;p&gt;This function must be use appropriately. On battery powered devices, a  program that never suspends (or sleeps) by continually calling &lt;strong&gt;SystemIdleTimerReset&lt;/strong&gt; can quickly drain the batteries.&lt;/p&gt; &lt;p&gt;The frequency in which to call &lt;strong&gt;SystemIdleTimerReset&lt;/strong&gt; in order to keep a device awake can be determined retrieving the following registry key:&lt;/p&gt; &lt;p&gt;&lt;strong&gt;HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Power&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Requirements&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;OS Versions:&lt;/strong&gt; Windows CE 2.0 and later.&lt;br /&gt; &lt;strong&gt;Header:&lt;/strong&gt; Winuser.h.&lt;/p&gt; &lt;/div&gt; &lt;p&gt; &lt;/p&gt; &lt;div style="padding-right: 10px; padding-left: 22px; padding-bottom: 0px; padding-top: 0px"&gt; &lt;p&gt;&lt;strong&gt;&lt;a name="sp_tpcshell_vigo"&gt;&lt;/a&gt;SHIdleTimerReset&lt;/strong&gt;&lt;/p&gt; &lt;/div&gt; &lt;div style="visibility: hidden"&gt; &lt;p&gt;&lt;strong&gt;See Also&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="ms-help://MS.MSDNQTR.v90.chs/apisp/html/sp_tpcshell_bovr.htm"&gt;SHSendBackToFocusWindow&lt;/a&gt;&lt;/p&gt; &lt;/div&gt; &lt;div style="visibility: hidden"&gt; &lt;p&gt;&lt;strong&gt;Requirements&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Smartphone:&lt;/strong&gt; Windows Mobile 2002 and later&lt;br /&gt; &lt;strong&gt;OS Versions:&lt;/strong&gt; Windows CE 3.0 and later&lt;br /&gt; &lt;strong&gt;Header:&lt;/strong&gt; tpcshell.h&lt;br /&gt; &lt;strong&gt;Library:&lt;/strong&gt; aygshell.lib&lt;/p&gt; &lt;/div&gt; &lt;div style="padding-right: 20px; overflow: auto; width: 1173px; top: 0px; height: 511px" valign="bottom"&gt; &lt;p&gt;This function prevents the shell from reverting to the Home screen and locking the device, when it is called periodically.&lt;/p&gt; &lt;strong&gt;void WINAPI SHIdleTimerReset();&lt;/strong&gt; &lt;p&gt;&lt;strong&gt;Parameters&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;None.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Return Values&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;None.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Remarks&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;To prevent the shell from reverting to the Home screen and locking  the device, an application should call this function periodically. The  minimum time-out that a user can specify in Settings is 10 seconds.  Therefore, an application must call this function at least every 10  seconds to prevent the shell from reverting to the Home or Device lock.  However, to conserve battery power, an application should call this  function, on a timer, only while the user is performing operations.  Otherwise, the application should allow the device to revert to Home or  Device lock.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Requirements&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Smartphone:&lt;/strong&gt; Windows Mobile 2002 and later&lt;br /&gt; &lt;strong&gt;OS Versions:&lt;/strong&gt; Windows CE 3.0 and later&lt;br /&gt; &lt;strong&gt;Header:&lt;/strong&gt; tpcshell.h&lt;br /&gt; &lt;strong&gt;Library:&lt;/strong&gt; aygshell.lib&lt;/p&gt; &lt;/div&gt; &lt;p&gt;下面是在一个老外的网站看到的：&lt;/p&gt; &lt;p&gt;If you want your program to not be put to sleep while it's running,  the best way is to create a KeepAlive type function that calls  SystemIdleTimerReset, SHIdleTimerReset and simulates a key touch. Then  you need to call it a lot, basically everywhere.&lt;/p&gt; &lt;code&gt;#include &amp;lt;windows.h&amp;gt; #include &amp;lt;commctrl.h&amp;gt; extern "C" { void WINAPI SHIdleTimerReset(); }; void KeepAlive() { static DWORD LastCallTime = 0;&lt;span&gt;      DWORD &lt;/span&gt;TickCount = GetTickCount(); if ((TickCount - LastCallTime) &amp;gt; 1000 || TickCount &amp;lt; LastCallTime) // watch for wraparound { SystemIdleTimerReset(); SHIdleTimerReset();&lt;span&gt;          keybd_event&lt;/span&gt;(VK_LBUTTON, 0, KEYEVENTF_SILENT, 0);&lt;span&gt;          keybd_event&lt;/span&gt;(VK_LBUTTON, 0, KEYEVENTF_KEYUP | KEYEVENTF_SILENT, 0); LastCallTime = TickCount; } } &lt;/code&gt; &lt;p&gt;This method only works when the user starts the application manually.&lt;/p&gt; &lt;p&gt;If your application is started by a notification (i.e. while the  device is suspended), then you need to do more or else your application  will be suspended after a very short period of time until the user  powers the device out of suspended mode. To handle this you need to put  the device into unattended power mode.&lt;/p&gt; &lt;code&gt;if(!::PowerPolicyNotify (PPN_UNATTENDEDMODE, TRUE)) { // handle error } // do long running process if(!::PowerPolicyNotify (PPN_UNATTENDEDMODE, FALSE)) { // handle error } &lt;/code&gt; &lt;p&gt;During unattended mode use, you still need to call the KeepAlive a  lot, you can use a separate thread that sleeps for x milliseconds and  calls the keep alive funcation.&lt;/p&gt; &lt;p&gt;Please note that unattended mode does not bring it out of sleep mode, it puts the device in a weird half-awake state.&lt;/p&gt; &lt;p&gt;So if you start a unattended mode while the device in suspended mode,  it will not wake up the screen or anything. All unattended mode does is  stop WM from suspending your application. Also the other problem is  that it does not work on all devices, some devices power management is  not very good and it will suspend you anyway no matter what you do.&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;转自：&lt;div&gt;http://hi.baidu.com/wangwenfang521/blog/item/a63236f3314c2cc60a46e0b5.html&lt;/div&gt; &lt;br /&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/answer/aggbug/2407912.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/answer/archive/2012/03/20/2407912.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/answer/archive/2012/03/17/2403093.html</id><title type="text">[转]string表达式运算</title><summary type="text">方法一：引用using Microsoft.JScript.dll然后使用Eval.JScriptEvaluate方法具体如下：string result = string.Format("({0}-{1})/100",500,100);Console.WriteLine(Microsoft.JScript.Eval.JScriptEvaluate(result, Microsoft.JScript.Vsa.VsaEngine.CreateEngine()).ToString()); 方法二：str_value = new DataTable().Compute(strin</summary><published>2012-03-17T05:04:00Z</published><updated>2012-03-17T05:04:00Z</updated><author><name>answer</name><uri>http://www.cnblogs.com/answer/</uri></author><link rel="alternate" href="http://www.cnblogs.com/answer/archive/2012/03/17/2403093.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/answer/archive/2012/03/17/2403093.html"/><content type="html">&lt;div&gt;&lt;div id="cnblogs_post_body"&gt;&lt;p&gt;方法一：&lt;br /&gt;引用using Microsoft.JScript.dll&lt;br /&gt;然后使用Eval.JScriptEvaluate方法&lt;br /&gt;具体如下：&lt;br /&gt;string result = string.Format("({0}-{1})/100",500,100);&lt;br /&gt;Console.WriteLine(Microsoft.JScript.Eval.JScriptEvaluate(result, Microsoft.JScript.Vsa.VsaEngine.CreateEngine()).ToString());&lt;/p&gt;  &lt;p&gt;方法二：&lt;br /&gt;str_value = new DataTable().Compute(string.Format(tbCount_Rules.Text.Trim(), ListToObject(percount)), "").ToString();&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;来自：&lt;/p&gt;&lt;p&gt;&lt;div&gt;http://www.cnblogs.com/flish/archive/2011/06/29/2093662.html&lt;/div&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/answer/aggbug/2403093.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/answer/archive/2012/03/17/2403093.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/answer/archive/2012/01/31/2334000.html</id><title type="text">[转]HTC G11 ROOT获取权限教程</title><summary type="text">HTC G11因为外观时尚、硬件配置强大而被许多年轻用户青睐，特别是机身轻薄等特征，购机用户也是逐日渐增。但美中不足的是，和很多HTC其它机型一样HTC G11原生的安卓系统中，自带了非常多的程序软件，要删除它们，就必须先ROOT HTC G11。今天就告诉大家怎么ROOT HTC G11。 HTC G11 Root须知： 1、Root后的设备，即有被修改系统文件的风险。能力越大，责任越大。 2、如果是行货Root的话，很多设备是不再享受保修服务的。 3、Root后，你可以任意对系统文件进行修改替换，即可以增删内置软件，系统字体，界面等等，同时也要承担因操作不当导致系统崩溃的风险。 ...</summary><published>2012-01-31T13:39:00Z</published><updated>2012-01-31T13:39:00Z</updated><author><name>answer</name><uri>http://www.cnblogs.com/answer/</uri></author><link rel="alternate" href="http://www.cnblogs.com/answer/archive/2012/01/31/2334000.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/answer/archive/2012/01/31/2334000.html"/><content type="html">&lt;div&gt;HTC G11因为外观时尚、硬件配置强大而被许多年轻用户青睐，特别是机身轻薄等特征，购机用户也是逐日渐增。但美中不足的是，和很多HTC其它机型一样HTC G11原生的安卓系统中，自带了非常多的程序软件，要删除它们，就必须先ROOT HTC G11。今天就告诉大家怎么ROOT HTC G11。&lt;br /&gt; &lt;br /&gt; &lt;strong&gt;HTC G11 Root须知：&lt;br /&gt; &lt;/strong&gt;&lt;br /&gt; 1、Root后的设备，即有被修改系统文件的风险。能力越大，责任越大。&lt;br /&gt; &lt;br /&gt; 2、如果是行货Root的话，很多设备是不再享受保修服务的。&lt;br /&gt; &lt;br /&gt; 3、Root后，你可以任意对系统文件进行修改替换，即可以增删内置软件，系统字体，界面等等，同时也要承担因操作不当导致系统崩溃的风险。&lt;br /&gt; &lt;br /&gt; &lt;br /&gt; &lt;strong&gt;HTC G11 获取 ROOT权限：&lt;br /&gt; &lt;/strong&gt;&lt;br /&gt; 本教程是通过第三方Recovery刷入Root文件。&lt;br /&gt; &lt;br /&gt; 1、将保你的手机已经S-OFF，将第三方Reocovery文件PG32IMG.zip(点击下载&lt;a href="http://115.com/file/be8i4ork"&gt;http://115.com/file/be8i4ork&lt;/a&gt;#)拷贝至内存卡中。&lt;br /&gt; &lt;br /&gt; 2、将手机完全关闭，然后按&amp;#8220;音量下+电源&amp;#8221;进入BootLoader，设备会自动检查更新，检测到升级文件后，你只需按音量上键确认升级即可。&lt;br /&gt; &lt;br /&gt; 3、升级完毕后会提示你重启，不用理它，直接拔了电池即可，再将Root文件 is root.zip(点击下载&lt;a href="http://115.com/file/be8i4viz"&gt;http://115.com/file/be8i4viz&lt;/a&gt;#)拷贝至内存卡，并删除刚才的Recovery升级文件（否则再次进入又会提示升级）。&lt;br /&gt; &lt;br /&gt; 4、再按&amp;#8220;音量下键+电源&amp;#8221;进入Bootloader，选择Reocovery并进入。（音量键选择，电源键确认）。&lt;br /&gt; &lt;br /&gt; 5、选择第四项。Install zip from sdcard(从SD卡中选择zip升级包)。然后选择内存卡中的is root.zip文件，然后选择yes即可。&lt;br /&gt; &lt;br /&gt; 6、几十秒左右就可以刷完。重启后菜单中将会有Superuser的骷髅头应用。即表示授权成功。你可以安装RE文件浏览器或其它需要授权的软件测试。&lt;/div&gt;&lt;img src="http://www.cnblogs.com/answer/aggbug/2334000.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/answer/archive/2012/01/31/2334000.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/answer/archive/2011/12/19/2293277.html</id><title type="text">[转]WebForm 与 winform 路径获取</title><summary type="text">对于Windows程序 和Web 应用程序来说,他们运行的路径是不一样的,所以关键是判断当前运行的程序是哪种程序.于是我们可以使用如下的代码 string path = "";if (System.Environment.CurrentDirectory == AppDomain.CurrentDomain.BaseDirectory)//Windows应用程序则相等{ path = AppDomain.CurrentDomain.BaseDirectory; }else{ path = AppDomain.CurrentDomain.BaseDirectory + &amp;qu</summary><published>2011-12-19T05:36:00Z</published><updated>2011-12-19T05:36:00Z</updated><author><name>answer</name><uri>http://www.cnblogs.com/answer/</uri></author><link rel="alternate" href="http://www.cnblogs.com/answer/archive/2011/12/19/2293277.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/answer/archive/2011/12/19/2293277.html"/><content type="html">&lt;div&gt;&lt;p&gt;对于Windows程序 和Web 应用程序来说,他们运行的路径是不一样的,所以关键是判断当前运行的程序是哪种程序.于是我们可以使用如下的代码 &lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; path &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt; &lt;span style="color: #000000;"&gt;""&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" alt="" align="top" /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (System.Environment.CurrentDirectory &lt;/span&gt;&lt;span style="color: #000000;"&gt;==&lt;/span&gt;&lt;span style="color: #000000;"&gt; AppDomain.CurrentDomain.BaseDirectory)&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;Windows应用程序则相等&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif" alt="" align="top" /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;{&lt;br /&gt;&lt;img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" alt="" align="top" /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; path &lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; AppDomain.CurrentDomain.BaseDirectory;&lt;br /&gt;&lt;img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif" alt="" align="top" /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" alt="" align="top" /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif" alt="" align="top" /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;{&lt;br /&gt;&lt;img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" alt="" align="top" /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; path &lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; AppDomain.CurrentDomain.BaseDirectory &lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt; &lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;Bin/&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif" alt="" align="top" /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;这样如果我们写了一个类库,类库中用到了Assembly.LoadFrom,由于是通用类库,所以可能用到Windows程序中也可能用到Web中,那么用上面的代码就很方便了.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;做法2：&lt;/p&gt; &lt;p&gt;string MyPath = System.IO.Path.GetDirectoryName(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Reflection.Assembly.GetExecutingAssembly().GetModules()[0].FullyQualifiedName);&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;a href="http://blog.csdn.net/tarmee/archive/2008/04/01/2234872.aspx"&gt;&lt;span style="color: #336699;"&gt;C#获取项目程序及运行路径的方法&lt;/span&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;1.asp.net webform用&amp;#8220;Request.PhysicalApplicationPath获取站点所在虚拟目录的物理路径，最后包含&amp;#8220;/&amp;#8221;；&lt;/p&gt; &lt;p&gt;2.c# winform用&lt;br /&gt;A：&amp;#8220;Application.StartupPath&amp;#8221;:获取当前应用程序所在目录的路径，最后不包含&amp;#8220;/&amp;#8221;；&lt;br /&gt;B：&amp;#8220;Application.ExecutablePath &amp;#8221;:获取当前应用程序文件的路径，包含文件的名称；&lt;br /&gt;C：&amp;#8220;AppDomain.CurrentDomain.BaseDirectory&amp;#8221;:获取当前应用程序所在目录的路径，最后包含&amp;#8220;/&amp;#8221;；&lt;br /&gt;D：&amp;#8220;System.Threading.Thread.GetDomain().BaseDirectory&amp;#8221;:获取当前应用程序所在目录的路径，最后包含&amp;#8220;/&amp;#8221;；&lt;br /&gt;E：&amp;#8220;Environment.CurrentDirectory&amp;#8221;:获取当前应用程序的路径，最后不包含&amp;#8220;/&amp;#8221;；&lt;br /&gt;F：&amp;#8220;System.IO.Directory.GetCurrentDirectory&amp;#8221;:获取当前应用程序的路径，最后不包含&amp;#8220;/&amp;#8221;；&lt;/p&gt; &lt;p&gt;3.c# windows service服务中用&amp;#8220;AppDomain.CurrentDomain.BaseDirectory&amp;#8221;或&amp;#8220;System.Threading.Thread.GetDomain().BaseDirectory&amp;#8221;；&lt;br /&gt;用&amp;#8220;Environment.CurrentDirectory&amp;#8221;和&amp;#8220;System.IO.Directory.GetCurrentDirectory&amp;#8221;将得到&amp;#8220; system32&amp;#8221;目录的路径；&lt;br /&gt;如 果要使用&amp;#8220;Application.StartupPath&amp;#8221;或&amp;#8220;Application.ExecutablePath  &amp;#8221;，需要手动添加对&amp;#8220;System.Windows.Forms.dll &amp;#8221;的引用，并在程序开头用&amp;#8220;using&amp;nbsp;&amp;nbsp;  System.Windows.Forms&amp;#8221;声明该引用；&lt;/p&gt; &lt;p&gt;4.在卸载程序获取系统安装的目录：&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Reflection.Assembly curPath = System.Reflection.Assembly.GetExecutingAssembly();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; string path=curPath.Location;//得到安装程序类SetupLibrary文件的路径，获取这个文件路径所在的目录即得到安装程序的目录;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;来自：&lt;div&gt;http://blog.csdn.net/xiaogaolin/article/details/5964000&lt;/div&gt; &lt;br /&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/answer/aggbug/2293277.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/answer/archive/2011/12/19/2293277.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/answer/archive/2011/11/25/2263880.html</id><title type="text">[转]win7 系统装SQLServer2000 成功。</title><summary type="text">昨天在win7上装SQLServer数据库，写一下体会。首先，如果以前安装的话，要删除干净。我也找了半天的网络资料。1.把原来 SQLServer的安装目录 C:\Program Files\Microsoft SQL Server 删除2.所有SQLServer相关的注册表全部删除，保证系统是没有装过SQLServer的状态注册表打开方式：开始--&amp;amp;gt; 运行--&amp;amp;gt;regedit然后找下面目录删除 1).hkey_current_user\software\miocrosoft\MICROSOFT SQL SERVER 文件夹删除 2).hkey_cu</summary><published>2011-11-25T14:49:00Z</published><updated>2011-11-25T14:49:00Z</updated><author><name>answer</name><uri>http://www.cnblogs.com/answer/</uri></author><link rel="alternate" href="http://www.cnblogs.com/answer/archive/2011/11/25/2263880.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/answer/archive/2011/11/25/2263880.html"/><content type="html">&lt;div&gt;&lt;p&gt;&amp;nbsp;昨天在win7上装SQLServer数据库，写一下体会。首先，如果以前安装的话，要删除干净。我也找了半天的网络资料。1.把原来 SQLServer的安装目录 C:\Program Files\Microsoft SQL Server  &amp;nbsp;删除2.所有SQLServer相关的注册表全部删除，保证系统是没有装过SQLServer的状态注册表打开方式：开始--&amp;amp;amp;gt; 运行--&amp;amp;amp;gt;regedit然后找下面目录删除  &amp;nbsp;1).hkey_current_user\software\miocrosoft\MICROSOFT &amp;nbsp; SQL &amp;nbsp; SERVER 文件夹删除  &amp;nbsp;2).hkey_current_user\software\miocrosoft\mssqlserver &amp;nbsp;文件夹删除  &amp;nbsp;3).HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server  &amp;nbsp;文件夹删除总之一句话，把所有SqlServer相关的删除。然后重启机器开始装。&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;通过截图进行显示了&lt;/p&gt; &lt;p&gt;&lt;br /&gt;&lt;img title="点击查看原始大小图片" src="http://dl.iteye.com/upload/attachment/430972/13581800-b93f-363e-855a-2fe9d30610fa.png" alt="" height="621" width="700" /&gt;&lt;/p&gt; &lt;p&gt;&lt;br /&gt;&lt;img src="http://dl.iteye.com/upload/attachment/430974/d7ffc822-8505-3c65-936d-82a9a8a3fd5a.png" alt="" /&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;img title="点击查看原始大小图片" src="http://dl.iteye.com/upload/attachment/430978/fc04f566-bcd0-3b12-87b5-350d1e99bb08.png" alt="" height="560" width="700" /&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;img title="点击查看原始大小图片" src="http://dl.iteye.com/upload/attachment/430976/ac2b4b70-1ba5-32a2-91fb-d2ea19aef141.png" alt="" height="581" width="700" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img title="点击查看原始大小图片" src="http://dl.iteye.com/upload/attachment/430980/9d46bc22-465e-337e-95c0-38d1c42c36c7.png" alt="" height="407" width="700" /&gt;&lt;/p&gt; &lt;p&gt;&lt;br /&gt;&lt;img title="点击查看原始大小图片" src="http://dl.iteye.com/upload/attachment/430982/fa59062d-eefd-3571-aa13-75d7e51f4320.png" alt="" height="415" width="700" /&gt;&lt;/p&gt; &lt;p&gt;&lt;br /&gt;&lt;img src="http://dl.iteye.com/upload/attachment/430984/0b38d55f-b209-3501-80e6-957fb13d6b55.png" alt="" /&gt;&lt;br /&gt;&lt;/p&gt; &lt;p&gt;&lt;br /&gt;&lt;img src="http://dl.iteye.com/upload/attachment/430988/fd40e96b-cc11-3f05-9db3-7054cf96e5b7.png" alt="" /&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;img src="http://dl.iteye.com/upload/attachment/430986/221a8419-8b11-34c8-b51e-328fc498925a.png" alt="" /&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;img src="http://dl.iteye.com/upload/attachment/430990/0f5d7ada-4855-3b1c-ac8e-bbca576e3b2d.png" alt="" /&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;br /&gt;&lt;img src="http://dl.iteye.com/upload/attachment/430994/5f1de252-11b6-3713-a741-2b5561ea3539.png" alt="" /&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;img src="http://dl.iteye.com/upload/attachment/430992/0efb1b5c-5fa0-3d64-a3b0-f5b403e23552.png" alt="" /&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;img src="http://dl.iteye.com/upload/attachment/430996/50e32b34-f8f5-30ae-83a5-6c68703a3281.png" alt="" /&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;img title="点击查看原始大小图片" src="http://dl.iteye.com/upload/attachment/430998/79eb3b6b-d28b-3e5a-8acb-da55cf44c1b6.png" alt="" height="499" width="700" /&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://dl.iteye.com/upload/attachment/431000/3d095d7b-2b71-36bb-b45b-7d83154fd71f.png" alt="" /&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;img src="http://dl.iteye.com/upload/attachment/431002/62128e1b-ad7a-3728-933f-5477e413843f.png" alt="" /&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;img src="http://dl.iteye.com/upload/attachment/431006/440d4ef8-0bc9-3eb4-afc4-0cc1bd46d090.png" alt="" /&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;img src="http://dl.iteye.com/upload/attachment/431004/bf53d92b-588e-3250-b034-d90df3fee3c8.png" alt="" /&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;img src="http://dl.iteye.com/upload/attachment/431008/ca25040c-4bfa-30f2-ac90-0495db0de6d0.png" alt="" /&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;img src="http://dl.iteye.com/upload/attachment/431010/69a24616-82ca-37fd-863a-44ff7a4d91d7.png" alt="" /&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;img src="http://dl.iteye.com/upload/attachment/431012/5cdd9d50-1872-3b8d-b4de-2af6813c55f6.png" alt="" /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;img src="http://dl.iteye.com/upload/attachment/431014/7a5d2e20-4004-3b3f-a41e-12c1ba3aba6a.png" alt="" /&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://dl.iteye.com/upload/attachment/431016/08f8c3cf-9b15-38f3-85b3-4c03b6cab5fa.png" alt="" /&gt;&lt;br /&gt;&lt;/p&gt; &lt;p&gt;&lt;br /&gt;&lt;img src="http://dl.iteye.com/upload/attachment/431018/580d8eda-ad23-35ff-b75e-e42e42925052.png" alt="" /&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img title="点击查看原始大小图片" src="http://dl.iteye.com/upload/attachment/431044/959bd884-ec05-30b0-8a4c-85571216ac54.png" alt="" height="316" width="700" /&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;img src="http://dl.iteye.com/upload/attachment/431020/fa9d99ea-0274-3a5a-b1fd-446ccd716145.png" alt="" /&gt;&lt;br /&gt;&amp;nbsp;29.跳出一个提示，选是。 &amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;img src="http://dl.iteye.com/upload/attachment/431022/78aa29fd-46a5-3f3d-a461-a412056206a8.png" alt="" /&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;img title="点击查看原始大小图片" src="http://dl.iteye.com/upload/attachment/431024/62d09f3a-ec98-3dab-9752-9cafa232fc3f.png" alt="" height="521" width="700" /&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;img title="点击查看原始大小图片" src="http://dl.iteye.com/upload/attachment/431026/289e86ce-f326-339e-b29f-3ff864d591c0.png" alt="" height="500" width="700" /&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;img src="http://dl.iteye.com/upload/attachment/431028/8cba2eca-78de-3e49-83b9-1906ba38354d.png" alt="" /&gt;&lt;br /&gt;&lt;/p&gt; &lt;p&gt;&lt;br /&gt;&lt;img src="http://dl.iteye.com/upload/attachment/431055/4022bb1d-f046-31ee-8f82-840e39bf93d5.png" alt="" /&gt;&lt;/p&gt; &lt;p&gt;&lt;img src="http://dl.iteye.com/upload/attachment/431030/097f3647-1afb-3539-b374-a645965569bb.png" alt="" /&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;img title="点击查看原始大小图片" src="http://dl.iteye.com/upload/attachment/431032/14da8130-d482-3995-9667-d42cecf7a7a8.png" alt="" height="385" width="700" /&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;img title="点击查看原始大小图片" src="http://dl.iteye.com/upload/attachment/431034/96106dd6-c92f-3d56-a70e-fb4818846e5a.png" alt="" height="732" width="700" /&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;img src="http://dl.iteye.com/upload/attachment/431036/1037a3dc-bb70-3a03-ad45-302a8eacd30a.png" alt="" /&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;img src="http://dl.iteye.com/upload/attachment/431038/411f623a-ee5f-3bd9-99e8-1a0070196ac3.png" alt="" /&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;img src="http://dl.iteye.com/upload/attachment/431040/76e21c94-6b06-3a29-80a9-292ee92e64b4.png" alt="" /&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;img src="http://dl.iteye.com/upload/attachment/431042/c3a53a47-2a15-3c12-82d5-884de98c7f70.png" alt="" /&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;安装步骤摘抄自网络资料：http://wenku.baidu.com/view/2f13181614791711cc791704.html&lt;/p&gt; &lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/answer/aggbug/2263880.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/answer/archive/2011/11/25/2263880.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/answer/archive/2011/11/18/2253924.html</id><title type="text">Mobile Development: Disable Windows Mobile 6.5 Start and Close Button</title><summary type="text">来自：http://www.hjgode.de/wp/2010/11/18/mobile-development-disable-windows-mobile-6-5-start-and-close-button/Hello here is one other way to write a kios mode .NET application using a technique called SubClassing. The idea was born by a comment of redwolf2222 on this blog about how to Hide Start and...</summary><published>2011-11-18T04:24:00Z</published><updated>2011-11-18T04:24:00Z</updated><author><name>answer</name><uri>http://www.cnblogs.com/answer/</uri></author><link rel="alternate" href="http://www.cnblogs.com/answer/archive/2011/11/18/2253924.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/answer/archive/2011/11/18/2253924.html"/><content type="html">&lt;p&gt; 来自：http://www.hjgode.de/wp/2010/11/18/mobile-development-disable-windows-mobile-6-5-start-and-close-button/&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;div&gt;&lt;p&gt;Hello&lt;/p&gt; &lt;p&gt;here is one other way to write a kios mode .NET application using a  technique called SubClassing. The idea was born by a comment of  redwolf2222 on this blog about how to &lt;a href="http://www.hjgode.de/wp/2010/10/11/windows-mobile-hide-startbutton-in-winmo-6-5-x/"&gt;Hide Start and Close buttons on Windows Mobile 6.5 devices&lt;/a&gt;. Redwolf2222 also provided a code snippet. Unfortunately it was incomplete and so I wrote my own class.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Disable clicks on Start and Close button&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;The demo project shows one dialog with two check boxes and you can  easily test the function. If &amp;#8220;StartButton Disabled&amp;#8221; or &amp;#8220;Close Button  disabled&amp;#8221; is checked, you cannot &amp;#8216;click&amp;#8217; the corresponding button any  more:&lt;/p&gt; &lt;p&gt;&lt;a rel="attachment wp-att-889" href="http://www.hjgode.de/wp/2010/11/18/mobile-development-disable-windows-mobile-6-5-start-and-close-button/startbuttoncontrolwm65_2/"&gt;&lt;img size-medium=""  wp-image-889"="" title="StartButtonControlWM65" src="http://www.hjgode.de/wp/wp-content/uploads/2010/11/StartButtonControlWM65_2-225x300.gif" alt="" height="300" width="225" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;You still &amp;#8216;click&amp;#8217; the buttons but the subclassed window will not  &amp;#8216;execute&amp;#8217; your click. The buttons are part of the toolbar32 window which  is a child of the menu_worker window. So first we have to follow the  window tree.&lt;/p&gt;&lt;p&gt;&amp;nbsp; &lt;br /&gt;&lt;div&gt;&lt;p&gt;&lt;strong&gt;Downloads&lt;/strong&gt;&lt;br /&gt;  Visual Studion 2008 solution with demo project targeting Windows Mobile 6 SDK: &lt;strong&gt;DOWNLOAD:&lt;/strong&gt;&lt;a href="http://www.hjgode.de/wp/wp-content/plugins/download-monitor/download.php?id=128" title="Downloaded 702 times"&gt;StartButtonHookWM65 VS2008 source code and demo project&lt;/a&gt; -  (Hits: 702, size: 18.53 kB)&lt;/p&gt; &lt;p&gt;Thanks to redwolf2222 for the great idea.&lt;/p&gt;&lt;/div&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/div&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/answer/aggbug/2253924.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/answer/archive/2011/11/18/2253924.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/answer/archive/2011/11/18/2253922.html</id><title type="text">[转]Windows Mobile: Hide StartButton in WinMo 6.5.x</title><summary type="text">来自：http://www.hjgode.de/wp/2010/10/11/windows-mobile-hide-startbutton-in-winmo-6-5-x/ Here is a very short tip based on a finding at xda-developers.com For kiosk mode applications you dont want the user access the device settings or the start menu and all the programs and games accessible from the..</summary><published>2011-11-18T04:21:00Z</published><updated>2011-11-18T04:21:00Z</updated><author><name>answer</name><uri>http://www.cnblogs.com/answer/</uri></author><link rel="alternate" href="http://www.cnblogs.com/answer/archive/2011/11/18/2253922.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/answer/archive/2011/11/18/2253922.html"/><content type="html">&lt;div&gt;&lt;p&gt;来自：http://www.hjgode.de/wp/2010/10/11/windows-mobile-hide-startbutton-in-winmo-6-5-x/ &lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Here is a very short tip based on a finding at xda-developers.com&lt;/p&gt; &lt;p&gt;For kiosk mode applications you dont want the user access the device  settings or the start menu and all the programs and games accessible  from there. One step to this kiosk mode is disabling the Start Button,  the button that opens a menu to access programs and settings.&lt;/p&gt; &lt;p&gt;In versions of windows mobile before 6.5.3, you could disable access  to the start button by subclassing HHTaskbar and discard clicks in the  Start button area or simply disable the whole HHTaskbar window.&lt;/p&gt; &lt;p&gt;Now, with windows mobile 6.5.3 the start button is part of the menu  bar and no longer part of the taskbar (which is now called MenuBar). To  hide the start button on a windows Mobile 6.5.x device you can use  following registry change:&lt;/p&gt; [HKEY_LOCAL_MACHINE\Software\Microsoft\Shell\BubbleTiles] "TextModeEnabled"=dword:00000001 "HardwareStartKeyEnabled"=dword:00000001 "HardwareDoneKeyEnabled"=dword:00000001  &lt;p&gt;With this change the &amp;#8220;MenuBar&amp;#8221; will no longer show the Start Button  graphic nor the Done button, Windows Mobile will no longer decorate the  menu texts . Only two menu entries will now show on bottom of the today  screen.&lt;/p&gt; &lt;p&gt;TextModeEnabled switches the display of soft menu entries from the  default graphic tiles display to a text only display as it was and is in  windows mobile 6.1.&lt;/p&gt; &lt;p&gt;HardwareStartKeyEnabled controls the display of the Start button (the  big windows start symbol on the left of the soft menu). If you change  to enabled (0&amp;#215;01) you dont get a start button and have to use a key on  your keypad to launch the start screen!&lt;/p&gt; &lt;p&gt;HardwareDoneButton controls the display of the Done button at the  right of the menu bar (the big (X)). When enabled, you have no chance to  close apps that do not have an exit option in there menu, except you  have a key on on your keyboard assigned to the Done function! Done now  not only hides an app, with winmo 6.5 the app is closed and removed from  memory now.&lt;/p&gt; &lt;p&gt;&lt;a rel="attachment wp-att-830" href="http://www.hjgode.de/wp/2010/10/11/windows-mobile-hide-startbutton-in-winmo-6-5-x/winmo653textmodeenabled/"&gt;&lt;img size-full=""  wp-image-830"="" title="winmo653textmodeenabled" src="http://www.hjgode.de/wp/wp-content/uploads/2010/10/winmo653textmodeenabled.jpg" alt="" height="267" width="208" /&gt;&lt;/a&gt; The Start entry at top left corner remains there but is only an indicator.&lt;/p&gt; &lt;p&gt;&lt;a rel="attachment wp-att-834" href="http://www.hjgode.de/wp/2010/10/11/windows-mobile-hide-startbutton-in-winmo-6-5-x/textmodeenabled_2/"&gt;&lt;img size-thumbnail=""  wp-image-834"="" title="TextModeEnabled_2" src="http://www.hjgode.de/wp/wp-content/uploads/2010/10/TextModeEnabled_2-112x150.gif" alt="" height="195" width="146" /&gt;&lt;/a&gt; &lt;a rel="attachment wp-att-833" href="http://www.hjgode.de/wp/2010/10/11/windows-mobile-hide-startbutton-in-winmo-6-5-x/textmodeenabled_3today-home/"&gt;&lt;img size-thumbnail=""  wp-image-833"="" title="TextModeEnabled_3today-home" src="http://www.hjgode.de/wp/wp-content/uploads/2010/10/TextModeEnabled_3today-home-112x150.gif" alt="" height="194" width="144" /&gt;&lt;/a&gt; &lt;a rel="attachment wp-att-835" href="http://www.hjgode.de/wp/2010/10/11/windows-mobile-hide-startbutton-in-winmo-6-5-x/textmodeenabled_1/"&gt;&lt;img size-thumbnail=""  wp-image-835"="" title="TextModeEnabled_1" src="http://www.hjgode.de/wp/wp-content/uploads/2010/10/TextModeEnabled_1-112x150.gif" alt="" height="192" width="143" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;NO more Start Button, No more Done (X) Button&lt;/p&gt; &lt;p&gt;When you reboot the device, the change  will be applied and you will see the Today screen with two menu  shortcuts in the menubar at the bottom. On a prof. device this may be  (Phone) and (Contacts). These buttons are also called SoftKeys and you  can change there behaviour using the registry:&lt;/p&gt; [HKLM\Software\Microsoft\CHome\SK1URL]                 "Open"= &amp;lt;handling app&amp;gt; [HKEY_CURRENT_USER\SOFTWARE\Microsoft\Today\Keys\112]                 @="&amp;lt;SK label&amp;gt;"                 "Open"= &amp;lt;handling app&amp;gt;  &lt;p&gt;(use SK2 for the second softkey)&lt;/p&gt; &lt;p&gt;So you may use these SoftKeys to enable the user to start your Kios application.&lt;/p&gt; &lt;p&gt;You should be aware of that if you dont have a key assigned to  VK_LWIN (the Win key), you will never be able to switch to the Start  Menu or now called Home Screen!&lt;/p&gt; &lt;p&gt;If an application is started and does not have a Exit menu, you will  not be able to get back to the today screen. If you disable the TitleBar  (HHTaskbar) you will also not be able to open any of the settings and  informations available thru the TitleBar (ie battery status, clock  settings, volume settings).&lt;/p&gt; &lt;p&gt;The TitleBar normally will get a &amp;#8220;Start Menu&amp;#8221; entry to the left. But  with TextmodeEnabled=1 this will not be the case! So no way back to  Today Screen and no way to get to the Start Menu with all the programs  or the Home Screen.&lt;/p&gt; &lt;p&gt;Happy kiosk mode coding.&lt;/p&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/answer/aggbug/2253922.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/answer/archive/2011/11/18/2253922.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/answer/archive/2011/05/24/2055457.html</id><title type="text">Windows CE 电源管理(转贴)</title><summary type="text">电源管理 Windows CE是典型的使用电池供电的系统。这使得正确操作系统十分关键，应用程序大多数时间都不需要关注Windows CE 设备的电源损耗，但是在某些时候，你可能要注意这些损耗。 当用户关闭了一个使用电池的Windows CE 设备，电源系统不会关闭PC电源，事实上，只是系统被挂起（译者注：这里就像有些PocketPC把关闭电源放在拔SIM卡的位置，拔出SIM卡才真正关 闭电源。但是，目前包括Smartphone在内，因为硬件设备，比如CPU无法进入低功耗，所以为了省电，需要做到关闭应用处理器及大部分设备供电，然 后需要唤醒时，再通过定时器或无线模块唤醒。所以不关闭电源的情况不是</summary><published>2011-05-24T06:20:00Z</published><updated>2011-05-24T06:20:00Z</updated><author><name>answer</name><uri>http://www.cnblogs.com/answer/</uri></author><link rel="alternate" href="http://www.cnblogs.com/answer/archive/2011/05/24/2055457.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/answer/archive/2011/05/24/2055457.html"/><content type="html">&lt;div&gt;&lt;div id="cnblogs_post_body"&gt;&lt;div style="margin: 17pt 0cm 16.5pt"&gt;&lt;strong&gt;电源管理&lt;/strong&gt;&lt;/div&gt; &lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Windows CE是典型的使用电池供电的系统。这使得正确操作系统十分关键，应用程序大多数时间都不需要关注Windows CE 设备的电源损耗，但是在某些时候，你可能要注意这些损耗。&lt;/div&gt; &lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 当用户关闭了一个使用电池的&lt;span&gt;Windows CE  设备，电源系统不会关闭PC电源，事实上，只是系统被挂起（译者注：这里就像有些PocketPC把关闭电源放在拔SIM卡的位置，拔出SIM卡才真正关 闭电源。但是，目前包括Smartphone在内，因为硬件设备，比如CPU无法进入低功耗，所以为了省电，需要做到关闭应用处理器及大部分设备供电，然 后需要唤醒时，再通过定时器或无线模块唤醒。所以不关闭电源的情况不是绝对的。）当用户打开设备电源，设备不会像PC一样重新启动，而是被唤醒，返回到与 系统挂起前一样的状态。这样导致一个应用程序在唤醒后会像挂起前一样运行。事实上，应用程序根本不知道它被挂起，除非它明确地请求当系统挂起时通知它。从 应用程序的角度看，电源管理有三种方式，查询电源状态，改变电源状态，和防止电源状态改变。&lt;/span&gt;&lt;/div&gt; &lt;div style="margin: 13pt 0cm"&gt;&lt;strong&gt;查询电源状态&lt;/strong&gt;&lt;/div&gt; &lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 要查询系统当前的电源状态，你必须调用&lt;/div&gt; &lt;div&gt;&amp;nbsp;&lt;/div&gt; &lt;div style="text-align: left; text-indent: -162.75pt; margin: 0cm 0cm 0pt 183.75pt" align="left"&gt;DWORD&amp;nbsp;GetSystemPowerStatusEx2&amp;nbsp;(PSYSTEM_POWER_STATUS_EX2&amp;nbsp;pSystemPowerStatusEx2, DWORD&amp;nbsp;dwLen,&amp;nbsp;BOOL&amp;nbsp;fUpdate);&lt;/div&gt; &lt;div style="text-align: left; margin: 0cm 0cm 0pt 21pt" align="left"&gt;&amp;nbsp;&lt;/div&gt; &lt;div&gt;函数带了三个参数：一个指向SYSTEM_POWER_ STATUS_EX2结构的指针，结构的长度，和一个布尔值，表示告诉操作系统是否应该查询电池驱动来得到最后的信息或者直接返回电池缓存中的信息。系统大约每&lt;span&gt;5秒查询一次电池状态，因此，如果第三个差数是FALSE，得到的数据不会太旧。结构SYSTEM_POWER_STATUS_EX2被定义为&lt;/span&gt;&lt;/div&gt; &lt;div style="text-align: left; margin: 0cm 0cm 0pt 21pt" align="left"&gt;typedef&amp;nbsp;struct&amp;nbsp;_SYSTEM_POWER_STATUS_EX2&amp;nbsp;{&lt;/div&gt; &lt;div style="text-align: left; margin: 0cm 0cm 0pt 21pt" align="left"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;BYTE&amp;nbsp;ACLineStatus;&lt;/div&gt; &lt;div style="text-align: left; margin: 0cm 0cm 0pt 21pt" align="left"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;BYTE&amp;nbsp;BatteryFlag;&lt;/div&gt; &lt;div style="text-align: left; margin: 0cm 0cm 0pt 21pt" align="left"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;BYTE&amp;nbsp;BatteryLifePercent;&lt;/div&gt; &lt;div style="text-align: left; margin: 0cm 0cm 0pt 21pt" align="left"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;BYTE&amp;nbsp;Reserved1;&lt;/div&gt; &lt;div style="text-align: left; margin: 0cm 0cm 0pt 21pt" align="left"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DWORD&amp;nbsp;BatteryLifeTime;&lt;/div&gt; &lt;div style="text-align: left; margin: 0cm 0cm 0pt 21pt" align="left"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DWORD&amp;nbsp;BatteryFullLifeTime;&lt;/div&gt; &lt;div style="text-align: left; margin: 0cm 0cm 0pt 21pt" align="left"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;BYTE&amp;nbsp;Reserved2;&lt;/div&gt; &lt;div style="text-align: left; margin: 0cm 0cm 0pt 21pt" align="left"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;BYTE&amp;nbsp;BackupBatteryFlag;&lt;/div&gt; &lt;div style="text-align: left; margin: 0cm 0cm 0pt 21pt" align="left"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;BYTE&amp;nbsp;BackupBatteryLifePercent;&lt;/div&gt; &lt;div style="text-align: left; margin: 0cm 0cm 0pt 21pt" align="left"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;BYTE&amp;nbsp;Reserved3;&lt;/div&gt; &lt;div style="text-align: left; margin: 0cm 0cm 0pt 21pt" align="left"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DWORD&amp;nbsp;BackupBatteryLifeTime;&lt;/div&gt; &lt;div style="text-align: left; margin: 0cm 0cm 0pt 21pt" align="left"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DWORD&amp;nbsp;BackupBatteryFullLifeTime;&lt;/div&gt; &lt;div style="text-align: left; margin: 0cm 0cm 0pt 21pt" align="left"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;WORD&amp;nbsp;BatteryVoltage;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/div&gt; &lt;div style="text-align: left; margin: 0cm 0cm 0pt 21pt" align="left"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DWORD&amp;nbsp;BatteryCurrent;&lt;/div&gt; &lt;div style="text-align: left; margin: 0cm 0cm 0pt 21pt" align="left"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DWORD&amp;nbsp;BatteryAverageCurrent;&lt;/div&gt; &lt;div style="text-align: left; margin: 0cm 0cm 0pt 21pt" align="left"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DWORD&amp;nbsp;BatteryAverageInterval;&lt;/div&gt; &lt;div style="text-align: left; margin: 0cm 0cm 0pt 21pt" align="left"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DWORD&amp;nbsp;BatterymAHourConsumed;&lt;/div&gt; &lt;div style="text-align: left; margin: 0cm 0cm 0pt 21pt" align="left"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DWORD&amp;nbsp;BatteryTemperature;&lt;/div&gt; &lt;div style="text-align: left; margin: 0cm 0cm 0pt 21pt" align="left"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DWORD&amp;nbsp;BackupBatteryVoltage;&lt;/div&gt; &lt;div style="text-align: left; margin: 0cm 0cm 0pt 21pt" align="left"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;BYTE&amp;nbsp;&amp;nbsp;BatteryChemistry;&lt;/div&gt; &lt;div style="margin: 0cm 0cm 0pt 42pt"&gt;}&amp;nbsp;SYSTEM_POWER_STATUS_EX2;&lt;/div&gt; &lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 在我描述的这个巨大的结构之前，我必须告诫你，这个结构返回的数据精确程度和电池驱动一样。同样的结构被传给电池驱动来查询它的状态。Windows CE不验证电池驱动返回的数据。这个函数返回来的数据依赖于电池驱动，因此不同的系统有不同的变化。举个例子，许多系统在使用AC电源时不报告精确的电源级数；另一些系统则相反。应用程序使用GetSystemPowerStatusEx2来自动预防和检测系统是否可能运行应用程序。&lt;/div&gt; &lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;第一个区域，&lt;span&gt;ACLineStatus，包含一个标志，表示系统是否连接到AC  电源。如果值是AC_LINE_OFFLINE，表示系统没有使用AC 电源；AC_LINE_ONLINE，表示系统使用了AC  电源；AC_LINE_BACKUP_POWER和AC_LINE_UNKNOWN，表示备用电源和未知电源。BatteryFlag区域，提供了一个总 的标识，表示当前系统的电池状态，可以有以下值：&lt;/span&gt;&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&lt;strong&gt;BATTERY_FLAG_HIGH&lt;/strong&gt;&lt;/div&gt; &lt;div&gt;电池被充满或接近充满。&lt;/div&gt; &lt;div&gt;&lt;strong&gt;BATTERY_FLAG_LOW&lt;/strong&gt;&lt;/div&gt; &lt;div&gt;电池还有一点剩余。&lt;/div&gt; &lt;div&gt;&lt;strong&gt;BATTERY_FLAG_CRITICAL&lt;/strong&gt;&lt;/div&gt; &lt;div&gt;电池电量处在一个临界状态。&lt;/div&gt; &lt;div&gt;&lt;strong&gt;BATTERY_FLAG_CHARGING&lt;/strong&gt;&lt;/div&gt; &lt;div&gt;电池当前正在充电。&lt;/div&gt; &lt;div&gt;&lt;strong&gt;BATTERY_FLAG_NO_BATTERY&lt;/strong&gt;&lt;/div&gt; &lt;div&gt;系统无电池&lt;/div&gt; &lt;div&gt;&lt;strong&gt;BATTERY_FLAG_UNKNOWN&lt;/strong&gt;&lt;/div&gt; &lt;div&gt;电池状态未知&lt;/div&gt; &lt;div style="text-indent: 21pt"&gt;BatteryLifePercent&lt;span&gt;区域包含估计的电池电量能够维持的百分比。数值可能是&lt;span&gt;0 到100之间的一个，或用255表示百分比未知。BatteryLifeTime区域表示电池耗尽之前可以维持的秒数。如果该值不能估计，区域填入 BATTERY_LIFE_UNKNOWN。BatteryFullLifeTime区域包含完全充满电池需要的时间。如果该值不能估计，填入 BATTERY_LIFE_UNKNOWN。注意，在许多系统中，这些值可能难以测量。大多数OEM  厂商简单地在每个区域内填入BATTERY_LIFE_UNKNOWN。&lt;/span&gt;&lt;/span&gt;&lt;/div&gt; &lt;div style="text-indent: 21pt"&gt;接下来的第四个区域（不计算保留区域）重复了前面的表述，只不过是对系统备份电池来说。因为这些值大多数难以测量，许多系统简单地返回&amp;#8220;unknown&amp;#8221;给这些区域。&lt;/div&gt; &lt;div style="text-indent: 21pt"&gt;剩下的区域描述了电池和备用电池的电力状态，因为许多系统缺少测量这些值的能力，这些区域也被简单地默认为&amp;#8220;unknown&amp;#8221;。最后一个区域，&lt;span&gt;BatteryChemistry，包含一个标志，表示系统中电池的类型。当前已定义的值包括&lt;/span&gt;&lt;/div&gt; &lt;div style="text-indent: -18pt; margin: auto 0cm auto 36pt"&gt;&lt;span style="font-size: 10pt"&gt;&amp;#183;&lt;span style="font: 7pt 'Times New Roman'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10.5pt"&gt;BATTERY_CHEMISTRY_ALKALINE&lt;/span&gt;&lt;/div&gt; &lt;div style="text-indent: -18pt; margin: auto 0cm auto 36pt"&gt;&lt;span style="font-size: 10pt"&gt;&amp;#183;&lt;span style="font: 7pt 'Times New Roman'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10.5pt"&gt;BATTERY_CHEMISTRY_NICD&lt;/span&gt;&lt;/div&gt; &lt;div style="text-indent: -18pt; margin: auto 0cm auto 36pt"&gt;&lt;span style="font-size: 10pt"&gt;&amp;#183;&lt;span style="font: 7pt 'Times New Roman'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10.5pt"&gt;BATTERY_CHEMISTRY_NIMH&lt;/span&gt;&lt;/div&gt; &lt;div style="text-indent: -18pt; margin: auto 0cm auto 36pt"&gt;&lt;span style="font-size: 10pt"&gt;&amp;#183;&lt;span style="font: 7pt 'Times New Roman'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10.5pt"&gt;BATTERY_CHEMISTRY_LION&lt;/span&gt;&lt;/div&gt; &lt;div style="text-indent: -18pt; margin: auto 0cm auto 36pt"&gt;&lt;span style="font-size: 10pt"&gt;&amp;#183;&lt;span style="font: 7pt 'Times New Roman'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10.5pt"&gt;BATTERY_CHEMISTRY_LIPOLY&lt;/span&gt;&lt;/div&gt; &lt;div style="text-indent: -18pt; margin: auto 0cm auto 36pt"&gt;&lt;span style="font-size: 10pt"&gt;&amp;#183;&lt;span style="font: 7pt 'Times New Roman'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10.5pt"&gt;BATTERY_CHEMISTRY_UNKNOWN&lt;/span&gt;&lt;/div&gt; &lt;div style="margin: 13pt 0cm"&gt;&lt;strong&gt;改变电源状态&lt;/strong&gt;&lt;/div&gt; &lt;div style="text-indent: 21pt"&gt;应用程序能通过一系列的方式改变系统的电源状态。在基于Windows CE.NET系统的较新系统中，首选的方式是使用电源管理程序，在之后的章节将会讨论。可是无论如何，还有大量的基于早期Windows CE版本的系统以及Windows CE.NET不包含电源管理程序版本。对这些系统来说，下面的技术会很方便。&lt;/div&gt; &lt;div style="margin: 13pt 0cm"&gt;&lt;strong&gt;关闭电源&lt;/strong&gt;&lt;/div&gt; &lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 应用程序可以通过调用一个少有资料的GwesPowerOffSystem函数挂起系统。这个函数可以在大多数版本Windows CE中使用，但是最近才被公开。事实上，大多数SDK没有包含这个函数的原型，你可能要提供原型。这个函数定义为&lt;/div&gt; &lt;div&gt;&amp;nbsp;&lt;/div&gt; &lt;div style="text-indent: 21pt"&gt;void&amp;nbsp;GwesPowerOffSystem(void);&lt;/div&gt; &lt;div style="text-indent: 21pt"&gt;&amp;nbsp;&lt;/div&gt; &lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; GwesPowerOffSystem的使用很简单：简单调用，系统就会挂起。&lt;/div&gt; &lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 如果你想避免使用很少资料的函数，你可以通过简单地模拟用户按关闭按钮来关闭系统。你可以通过使用&lt;span&gt;keybd_event函数很容易地允许你的应用程序挂起系统，如下：&lt;/span&gt;&lt;/div&gt; &lt;div style="text-align: left; margin: 0cm 0cm 0pt 21pt" align="left"&gt;keybd_event&amp;nbsp;(VK_OFF,&amp;nbsp;0,&amp;nbsp;KEYEVENTF_SILENT,&amp;nbsp;0);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/div&gt; &lt;div style="margin: 0cm 0cm 0pt 21pt"&gt;keybd_event&amp;nbsp;(VK_OFF,&amp;nbsp;0,&amp;nbsp;KEYEVENTF_SILENT&amp;nbsp;&amp;#9474;&amp;nbsp;KEYEVENTF_KEYUP,&amp;nbsp;0);&lt;/div&gt; &lt;div&gt;这两个keybd_event调用模拟了按和释放电源按钮，电源按钮的虚拟键值是VK_OFF。执行前面的两行代码将挂起系统。因为虚拟键代码在执行时会由&lt;span&gt;GWES表现，两个函数可能在系统挂起前有一些状态的表现（译者注：屏幕上会有关闭对话框之类的图像，和真实按下按钮的画面一样）。如果你的程序无法在keybd_event函数之前停止工作，添加一个Sleep调用来使应用程序暂停一些毫秒来让GWES真实地挂起系统。&lt;/span&gt;&lt;/div&gt; &lt;div style="margin: 13pt 0cm"&gt;&lt;strong&gt;关闭屏幕&lt;/strong&gt;&lt;/div&gt; &lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 如果系统有有色背光显示，主要的电源消耗不是CPU而是背光。在一些环境下，一个应用程序需要运行却不需要显示在屏幕上。一个例子是音乐播放器应用程序，当用户听音乐的时候，不关注屏幕。在这些情形下，有能力关闭背光将意味着提高电池寿命。&lt;/div&gt; &lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 当然，当用户想看屏幕时，任何关闭背光应用程序的需要一个简单的用户友好的方式来重新打开屏幕。同样，记得 用户典型的想法是屏幕变黑时会认为被关闭了，因此要考虑这点。举个例子，一个用户可能在系统已经运行时试图打开系统电源，并且这样做了，却很意外地发现， 设备电源被关闭了。同样，当系统在这种情况下关闭显示，它同时也关闭了触摸屏。这意味着你不能告诉用户敲击屏幕来打开。而是，你需要使用一些其他的事件， 比如设置时间，任务完成，或用户按了一个按钮。最后，这里讨论的方式对大多数基于Windows CE 3.0或更新的版本比较有用，并且被Windows CE .NET 4.0中的电源管理程序所替代。对于较新的系统，先看看是否电源管理程序可用，然后通过它来控制屏幕。如果失败了，&lt;span&gt;ExtEscape方式也许能行。&lt;/span&gt;&lt;/div&gt; &lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 在&lt;span&gt;Windows CE中，显示的控制是通过Ext&amp;#173;Escape函数。这是一个显示和打印机驱动的后门。Windows CE显示驱动支持许多设备转义代码（&lt;/span&gt;escape codes），这些被公布在Platform Builder中。对于我们的目的来说，只有两个转义代码被用到：SETPOWERMANAGEMENT来设置显示的电源状态和QUERYESCSUPPORT来查询是否SETPOWERMANAGEMENT被驱动支持。下面的例子打开或关闭系统显示通过显示驱动，并且支持完全的转义代码：&lt;/div&gt;&lt;span style="font-size: 10.5pt"&gt;//&lt;/span&gt;&lt;span style="font-size: 10.5pt"&gt;//&amp;nbsp;Defines&amp;nbsp;and&amp;nbsp;structures&amp;nbsp;taken&amp;nbsp;from&amp;nbsp;pwingdi.h&amp;nbsp;in&amp;nbsp;the&amp;nbsp;Platform&amp;nbsp;Builder&lt;/span&gt;&lt;span style="font-size: 10.5pt"&gt;//&lt;/span&gt;&lt;span style="font-size: 10.5pt"&gt;#define&amp;nbsp;QUERYESCSUPPORT&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;8&lt;/span&gt;&lt;span style="font-size: 10.5pt"&gt;#define&amp;nbsp;SETPOWERMANAGEMENT&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;6147&lt;/span&gt;&lt;span style="font-size: 10.5pt"&gt;#define&amp;nbsp;GETPOWERMANAGEMENT&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;6148&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 10.5pt"&gt;typedef&amp;nbsp;enum&amp;nbsp;_VIDEO_POWER_STATE&amp;nbsp;{&lt;/span&gt;&lt;span style="font-size: 10.5pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;VideoPowerOn&amp;nbsp;=&amp;nbsp;1,&lt;/span&gt;&lt;span style="font-size: 10.5pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;VideoPowerStandBy,&lt;/span&gt;&lt;span style="font-size: 10.5pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;VideoPowerSuspend,&lt;/span&gt;&lt;span style="font-size: 10.5pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;VideoPowerOff&lt;/span&gt;&lt;span style="font-size: 10.5pt"&gt;}&amp;nbsp;VIDEO_POWER_STATE,&amp;nbsp;*PVIDEO_POWER_STATE;&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 10.5pt"&gt;typedef&amp;nbsp;struct&amp;nbsp;_VIDEO_POWER_MANAGEMENT&amp;nbsp;{&lt;/span&gt;&lt;span style="font-size: 10.5pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ULONG&amp;nbsp;Length;&lt;/span&gt;&lt;span style="font-size: 10.5pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ULONG&amp;nbsp;DPMSVersion;&lt;/span&gt;&lt;span style="font-size: 10.5pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ULONG&amp;nbsp;PowerState;&lt;/span&gt;&lt;span style="font-size: 10.5pt"&gt;}&amp;nbsp;VIDEO_POWER_MANAGEMENT,&amp;nbsp;*PVIDEO_POWER_MANAGEMENT;&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 10.5pt"&gt;//----------------------------------------------------------------------&lt;/span&gt;&lt;span style="font-size: 10.5pt"&gt;//&amp;nbsp;SetVideoPower&amp;nbsp;-&amp;nbsp;Turns&amp;nbsp;on&amp;nbsp;or&amp;nbsp;off&amp;nbsp;the&amp;nbsp;display&lt;/span&gt;&lt;span style="font-size: 10.5pt"&gt;//&lt;/span&gt;&lt;span style="font-size: 10.5pt"&gt;int&amp;nbsp;SetVideoPower&amp;nbsp;(BOOL&amp;nbsp;fOn)&amp;nbsp;{&lt;/span&gt;&lt;span style="font-size: 10.5pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;VIDEO_POWER_MANAGEMENT&amp;nbsp;vpm;&lt;/span&gt;&lt;span style="font-size: 10.5pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int&amp;nbsp;rc,&amp;nbsp;fQueryEsc;&lt;/span&gt;&lt;span style="font-size: 10.5pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;HDC&amp;nbsp;hdc;&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 10.5pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;Get&amp;nbsp;the&amp;nbsp;display&amp;nbsp;dc.&lt;/span&gt;&lt;span style="font-size: 10.5pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;hdc&amp;nbsp;=&amp;nbsp;GetDC&amp;nbsp;(NULL);&lt;/span&gt;&lt;span style="font-size: 10.5pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;See&amp;nbsp;if&amp;nbsp;supported.&lt;/span&gt;&lt;span style="font-size: 10.5pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fQueryEsc&amp;nbsp;=&amp;nbsp;SETPOWERMANAGEMENT;&lt;/span&gt;&lt;span style="font-size: 10.5pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;rc&amp;nbsp;=&amp;nbsp;ExtEscape&amp;nbsp;(hdc,&amp;nbsp;QUERYESCSUPPORT,&amp;nbsp;sizeof&amp;nbsp;(fQueryEsc),&amp;nbsp;&lt;/span&gt;&lt;span style="font-size: 10.5pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(LPSTR)&amp;amp;fQueryEsc,&amp;nbsp;0,&amp;nbsp;0);&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-size: 10.5pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(rc&amp;nbsp;==&amp;nbsp;0)&amp;nbsp;{&lt;/span&gt;&lt;span style="font-size: 10.5pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;No&amp;nbsp;support,&amp;nbsp;fail.&lt;/span&gt;&lt;span style="font-size: 10.5pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ReleaseDC&amp;nbsp;(NULL,&amp;nbsp;hdc);&lt;/span&gt;&lt;span style="font-size: 10.5pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;-1;&lt;/span&gt;&lt;span style="font-size: 10.5pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;span style="font-size: 10.5pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;Fill&amp;nbsp;in&amp;nbsp;the&amp;nbsp;power&amp;nbsp;management&amp;nbsp;structure.&lt;/span&gt;&lt;span style="font-size: 10.5pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;vpm.Length&amp;nbsp;=&amp;nbsp;sizeof&amp;nbsp;(vpm);&lt;/span&gt;&lt;span style="font-size: 10.5pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;vpm.DPMSVersion&amp;nbsp;=&amp;nbsp;1;&lt;/span&gt;&lt;span style="font-size: 10.5pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(fOn)&amp;nbsp;&lt;/span&gt;&lt;span style="font-size: 10.5pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;vpm.PowerState&amp;nbsp;=&amp;nbsp;VideoPowerOn;&lt;/span&gt;&lt;span style="font-size: 10.5pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else&lt;/span&gt;&lt;span style="font-size: 10.5pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;vpm.PowerState&amp;nbsp;=&amp;nbsp;VideoPowerOff;&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 10.5pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;Tell&amp;nbsp;the&amp;nbsp;driver&amp;nbsp;to&amp;nbsp;turn&amp;nbsp;on&amp;nbsp;or&amp;nbsp;off&amp;nbsp;the&amp;nbsp;display.&lt;/span&gt;&lt;span style="font-size: 10.5pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;rc&amp;nbsp;=&amp;nbsp;ExtEscape&amp;nbsp;(hdc,&amp;nbsp;SETPOWERMANAGEMENT,&amp;nbsp;sizeof&amp;nbsp;(vpm),&amp;nbsp;&lt;/span&gt;&lt;span style="font-size: 10.5pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(LPSTR)&amp;amp;vpm,&amp;nbsp;0,&amp;nbsp;0);&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 10.5pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;Always&amp;nbsp;release&amp;nbsp;what&amp;nbsp;you&amp;nbsp;get.&lt;/span&gt;&lt;span style="font-size: 10.5pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ReleaseDC&amp;nbsp;(NULL,&amp;nbsp;hdc);&lt;/span&gt;&lt;span style="font-size: 10.5pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;0;&lt;/span&gt;&lt;span style="font-size: 10.5pt"&gt;}&lt;/span&gt; &lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 前面的代码通过调用ExtEscape和QUERYESCSUPPORT命令来查询是否支持转移代码。被查询的命令首先交给输入缓冲，如果SETPOWERMANAGEMENT命令被支持，程序就填充VIDEO_POWER_MANAGEMENT结构并再次调用ExtEscape设置电源状态。&lt;/div&gt; &lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 虽然这些转义代码允许应用程序打开或关闭显示，&lt;span&gt;Windows CE没有一个统一的方式来控制背光的亮度。每个系统都有它自己的OEM特有方式来控制背光亮度。如果将来有一种标准的背光亮度控制方式，它将很可能放在ExtEscape函数中。&lt;/span&gt;&lt;/div&gt; &lt;div style="margin: 13pt 0cm"&gt;&lt;strong&gt;打开系统电源&lt;/strong&gt;&lt;/div&gt; &lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 当系统被挂起，应用程序将不再运行，因此当系统唤醒时，应用程序看起来没有被控制。然而，有一些方式来唤醒一个挂起的设备。首先，一个应用程序通过给定一个时间，并使用11章提到的消息API（Notification API）做系统被唤醒的计划。在一般情况下，OEM厂商会分配一些中断条件，以便管理系统电源打开，或唤醒。这种方式的一个例子是一个系统当防止了一个同步架（synchronization cradle）时被唤醒。&lt;/div&gt; &lt;div style="margin: 13pt 0cm"&gt;&lt;strong&gt;防止系统关闭电源&lt;/strong&gt;&lt;/div&gt; &lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 相反的情况，防止系统挂起也是一个问题。Windows CE系统通常被设置为当一段时间没有用户输入就自动挂起。要防止自动挂起，一个应用程序可以周期性地调用一下函数：&lt;/div&gt; &lt;div style="text-indent: 21pt"&gt;void&amp;nbsp;WINAPI&amp;nbsp;SystemIdleTimerReset&amp;nbsp;(void);&lt;/div&gt; &lt;div style="text-indent: 21pt"&gt;这个函数重设Windows CE用来监视用户输入的定时器。如果定时器到达预先的没有用户输入的间隔，系统会自动挂起。因为挂起超时值可以被改变，一个应用程序需要知道超时值，这样就要多一点调用&lt;span&gt;SystemIdleTimerReset。系统维护三个超时值，这些都能够使用SystemParametersInfo来查询。传递给SystemParametersInfo的常量的不同表现，显示如下：&lt;/span&gt;&lt;/div&gt; &lt;div style="text-indent: 21pt"&gt;&lt;strong&gt;SPI_GETBATTERYIDLETIMEOUT&lt;/strong&gt;&lt;/div&gt; &lt;div style="text-indent: 21pt"&gt;当系统运行在电池电源状态下，离用户最后输入的时间&lt;/div&gt; &lt;div style="text-indent: 21pt"&gt;&lt;strong&gt;SPI_GETEXTERNALIDLETIMEOUT&lt;/strong&gt;&lt;/div&gt; &lt;div style="text-indent: 21pt"&gt;当系统运行在&lt;span&gt;AC电源状态下，离用户最后输入的时间&lt;/span&gt;&lt;/div&gt; &lt;div style="text-indent: 21pt"&gt;&lt;strong&gt;SPI_GETWAKEUPIDLETIMEOUT&lt;/strong&gt;&lt;/div&gt; &lt;div style="text-indent: 21pt"&gt;在系统再次挂起时离系统被自动唤醒的时间&lt;/div&gt; &lt;div style="text-indent: 21pt"&gt;要防止电源被自动挂起，你需要查询这三个值，并在最短时间内返回之前调用&lt;span&gt;SystemIdleTimerReset。如果超时值被设置为0，表示超时值被禁止。&lt;/span&gt;&lt;/div&gt; &lt;div style="margin: 13pt 0cm"&gt;&lt;strong&gt;电源管理程序&lt;/strong&gt;&lt;/div&gt; &lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 一个新的，独立的电源管理组件在Windows CE .NET 4.0中被引入了。这个电源管理程序替代了许多GWES以前完成的函数。电源管理程序定义了一系列的电源状态，如D0，D1，D2，和D3。这些看起来神秘的名字被对应于一些友好的系统级别名称。&lt;/div&gt; &lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 对嵌入式系统来说，OEM厂商定义了系统的电源状态。例如，电源状态可能是打开（On），空闲（Idle）和挂起（Suspend）。其他电源状态也被定义了，像ScreenOff, InCradle, 和 OnBattery。&lt;/div&gt; &lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 从应用程序的观点看，新的电源管理程序提供了通知电源状态改变的能力以及通过一系列的函数统一改变电源状态的能力。&lt;/div&gt; &lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 系统的电源状态被定义在注册表中，SDK定义了&lt;span&gt;PWRMGR_REG_KEY，以致你不得不知道注册表的字符串，但是当常量没定义的时间，电源管理程序注册数据被保留在HKEY_LOCAL_MACHINESystemCurrentControlSetControlPower。电源状态被定义作为子键，位于Key State。&lt;/span&gt;&lt;/div&gt; &lt;div style="margin: 13pt 0cm"&gt;&lt;strong&gt;电源通知&lt;/strong&gt;&lt;/div&gt; &lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 电源管理程序一个十分受欢迎的特点是，可以在系统电源状态改变时通知应用程序。这可以让应用程序从手动检测电源状态中解脱出来。一个应用程序可以通过调用RequestPowerNotifications请求电源管理程序当电源状态改变的时候发送一个通知给应用程序。电源管理程序会通过一个由应用程序前面建立的消息队列发送通知。&lt;/div&gt; &lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; RequestPowerNotifications原型如下。&lt;/div&gt; &lt;div&gt;&amp;nbsp;&lt;/div&gt; &lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; HANDLE&amp;nbsp;RequestPowerNotifications&amp;nbsp;(HANDLE&amp;nbsp;hMsgQ,&amp;nbsp;DWORD&amp;nbsp;Flags);&lt;/div&gt; &lt;div&gt;&amp;nbsp;&lt;/div&gt; &lt;div&gt;第一个参数是一个应用程序在之前建立的消息队列的句柄。第二个参数是一系列参数，表示应用程序想接收的通知。&lt;/div&gt; &lt;div&gt;&amp;nbsp;&lt;/div&gt; &lt;div style="text-indent: 21pt"&gt;&lt;strong&gt;PBT_TRANSITION&lt;/strong&gt;&lt;/div&gt; &lt;div style="text-indent: 21pt"&gt;接受系统电源状态改变的通知。例如，当系统从&lt;span&gt;On到Suspend。&lt;/span&gt;&lt;/div&gt; &lt;div style="text-indent: 21pt"&gt;&lt;strong&gt;PBT_RESUME&lt;/strong&gt;&lt;/div&gt; &lt;div style="text-indent: 21pt"&gt;当系统&lt;span&gt;resume的时候接收通知。&lt;/span&gt;&lt;/div&gt; &lt;div style="text-indent: 21pt"&gt;&lt;strong&gt;PBT_POWERSTATUSCHANGE &lt;/strong&gt;&lt;/div&gt; &lt;div style="text-indent: 21pt"&gt;当系统在&lt;span&gt;AC和电池之间切换的时候接收通知。&lt;/span&gt;&lt;/div&gt; &lt;div style="text-indent: 21pt"&gt;&lt;strong&gt;PBT_POWERINFOCHANGE&lt;/strong&gt;&lt;/div&gt; &lt;div style="text-indent: 21pt"&gt;当系统电池级数变化时接收通知。&lt;/div&gt; &lt;div style="text-indent: 21pt"&gt;&lt;strong&gt;POWER_NOTIFY_ALL&lt;/strong&gt;&lt;/div&gt; &lt;div style="text-indent: 21pt"&gt;接收所有的通知。&lt;/div&gt; &lt;div style="text-indent: 21pt"&gt;&amp;nbsp;&lt;/div&gt; &lt;div style="text-indent: 21pt"&gt;RequestPowerNotifications函数返回一个电源通知的句柄，失败返回&lt;span&gt;NULL。消息队列建立的时候必须使应用程序有读权限，因为应用程序将从消息队列中读取电源通知。&lt;/span&gt;&lt;/div&gt; &lt;div style="text-indent: 21pt"&gt;要接收通知，应用程序必须使用&lt;span&gt;WaitForSingleObject来阻塞消息句柄。像第10章所讨论的，当通知被放在队列中时，句柄将被signaled。实际的通知将由结构POWER_BROADCAST表中被接收到。&lt;/span&gt;&lt;/div&gt; &lt;div align="left"&gt;typedef&amp;nbsp;struct&amp;nbsp;_POWER_BROADCAST&amp;nbsp;{&lt;/div&gt; &lt;div align="left"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DWORD&amp;nbsp;Message;&lt;/div&gt; &lt;div align="left"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DWORD&amp;nbsp;Flags;&lt;/div&gt; &lt;div align="left"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DWORD&amp;nbsp;Length;&lt;/div&gt; &lt;div align="left"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;WCHAR&amp;nbsp;SystemPowerState[1];&lt;/div&gt; &lt;div style="text-indent: 21pt"&gt;}&amp;nbsp;POWER_BROADCAST,&amp;nbsp;*PPOWER_BROADCAST;&lt;/div&gt; &lt;div style="text-indent: 21pt"&gt;&amp;nbsp;&lt;/div&gt; &lt;div style="text-indent: 21pt"&gt;第一个要注意的是，这个结构长度是可变的。最后一个字段，SystemPowerState，是被定义为&lt;span&gt;WCHAR&lt;/span&gt;s类型，但是可以填上非字符串数据。第一个字段是通知自己的标识，这个字段可以填前面PBT_标志列表之一。Flags区可以包括以下标志，依赖于被接收的通知：&lt;/div&gt; &lt;div style="text-indent: 21pt"&gt;POWER_STATE_ON&lt;/div&gt; &lt;div style="text-indent: 21pt"&gt;系统处于on状态。&lt;/div&gt; &lt;div style="text-indent: 21pt"&gt;POWER_STATE_OFF&lt;/div&gt; &lt;div style="text-indent: 21pt"&gt;系统处于&lt;span&gt;off状态。&lt;/span&gt;&lt;/div&gt; &lt;div style="text-indent: 21pt"&gt;POWER_STATE_CRITICAL&lt;/div&gt; &lt;div style="text-indent: 21pt"&gt;系统进入了一个临界&lt;span&gt;off状态。&lt;/span&gt;&lt;/div&gt; &lt;div style="text-indent: 21pt"&gt;POWER_STATE_BOOT&lt;/div&gt; &lt;div style="text-indent: 21pt"&gt;系统正在启动。&lt;/div&gt; &lt;div style="text-indent: 21pt"&gt;POWER_STATE_IDLE&lt;/div&gt; &lt;div style="text-indent: 21pt"&gt;系统进入&lt;span&gt;idle状态。&lt;/span&gt;&lt;/div&gt; &lt;div style="text-indent: 21pt"&gt;POWER_STATE_SUSPEND&lt;/div&gt; &lt;div style="text-indent: 21pt"&gt;系统被挂起。&lt;/div&gt; &lt;div style="text-indent: 21pt"&gt;POWER_STATE_RESET&lt;/div&gt; &lt;div style="text-indent: 21pt"&gt;系统被复位。&lt;/div&gt; &lt;div style="text-indent: 21pt"&gt;&lt;span&gt;最后两个字段是相互关联的。&lt;span&gt;Length字段是 SystemPowerState字段数据的长度。SystemPowerState中包含的数据依赖于被发送的通知。对于PBT_TRANSITION 通知来说，SystemPowerState字段包含一个新电源状态的标识字符串。这个字符串是以非0结尾的。为了结束字符串，使用Length字段来指 出字符串的长度。注意，Length字段是以字节为单位的，当字符是双字节的Uncode字符时，需要获得字符串字符的长度，就需要用Length字段去 除TCHAR的size。&lt;/span&gt;&lt;/span&gt;&lt;/div&gt; &lt;div style="text-indent: 21pt"&gt;对于&lt;span&gt;PBT_POWERINFOCHANGE通知来说，SystemPowerState字段包含一个PPOWER_BROADCAST_POWER_INFO结构：&lt;/span&gt;&lt;/div&gt; &lt;div align="left"&gt;typedef&amp;nbsp;struct&amp;nbsp;_POWER_BROADCAST_POWER_INFO&amp;nbsp;{&lt;/div&gt; &lt;div align="left"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DWORD&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dwNumLevels;&lt;/div&gt; &lt;div align="left"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DWORD&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dwBatteryLifeTime;&lt;/div&gt; &lt;div align="left"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DWORD&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dwBatteryFullLifeTime;&lt;/div&gt; &lt;div align="left"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DWORD&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dwBackupBatteryLifeTime;&lt;/div&gt; &lt;div align="left"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DWORD&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dwBackupBatteryFullLifeTime;&lt;/div&gt; &lt;div align="left"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;BYTE&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bACLineStatus;&lt;/div&gt; &lt;div align="left"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;BYTE&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bBatteryFlag;&lt;/div&gt; &lt;div align="left"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;BYTE&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bBatteryLifePercent;&lt;/div&gt; &lt;div align="left"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;BYTE&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bBackupBatteryFlag;&lt;/div&gt; &lt;div align="left"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;BYTE&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bBackupBatteryLifePercent;&lt;/div&gt; &lt;div style="text-indent: 21pt"&gt;}&amp;nbsp;POWER_BROADCAST_POWER_INFO,&amp;nbsp;*PPOWER_BROADCAST_POWER_INFO;&lt;/div&gt; &lt;div style="text-indent: 21pt"&gt;&amp;nbsp;&lt;/div&gt; &lt;div style="text-indent: 21pt"&gt;注意，这里有一些字段的名字和函数十分相似于前面讨论的SYSTEM_POWER_STATUS_EX2结构。&lt;/div&gt; &lt;div style="text-indent: 21pt"&gt;&amp;nbsp;&lt;/div&gt; &lt;div style="margin: 13pt 0cm"&gt;&lt;strong&gt;设置电源状态&lt;/strong&gt;&lt;/div&gt; &lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 电源管理程序提供的函数也允许应用程序来控制电源状态。有两个方式来控制电源。第一个方式是应用程序给定一个电源设定。第二个方式是应用程序请求电源状态不要低于给定的级别。&lt;/div&gt; &lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 一个应用程序通过调用函数SetSystemPowerState可以请求特定的电源状态。这个函数原型如下。&lt;/div&gt; &lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;span style="font-size: 10.5pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DWORD&amp;nbsp;SetSystemPowerState&amp;nbsp;(LPCWSTR&amp;nbsp;psState,&amp;nbsp;DWORD&amp;nbsp;StateFlags,&lt;/span&gt; &lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DWORD&amp;nbsp;Options);&lt;/div&gt; &lt;div&gt;&amp;nbsp;&lt;/div&gt; &lt;div style="text-indent: 21pt"&gt;电源状态可以被请求通过指定前两个参数。如果第一个参数是非零值，它指向一个字符串标识被请求的状态。这个字符串必须和注册表中列出的电源状态之一相匹配。&lt;/div&gt; &lt;div style="text-indent: 21pt"&gt;如果psState 为 NULL，第二个参数&lt;span&gt;StateFlags，定义了请求的电源状态。这个参数是从POWER_STATE_ON直到POWER_STATE_RESET状态其中之一，这些在前面提到的POWER_BROADCAST结构有描述。&lt;/span&gt;&lt;/div&gt; &lt;div style="text-indent: 21pt"&gt;&lt;span&gt;比较特别的是&lt;span&gt;POWER_STATE_RESET标志。这个标 志请求系统重起，使用SetSystemPowerState的方法重起比通过直接使用IOCTL_HAL_REBOOT命令来调用 KernelIoControl的方法更好。调用 SetSystemPowerState  会让系统在重起设备之前任何还在缓冲中的数据保存到文件系统。&lt;/span&gt;&lt;/span&gt;&lt;/div&gt; &lt;div style="text-indent: 21pt"&gt;&lt;span&gt;调用&lt;span&gt;SetSystemPowerState是一个直接改变电 源状态的方法。更巧妙的方法是通过调用SetPowerRequirement来请求系统维持应用程序所需最低限度的电源状态。 SetSystemPowerState是假定应用程序知道所需状态，而调用SetPowerRequirement是允许系统对电源设定做优化以满足应 用程序的需要。一个使用SetPowerRequirement会比较方便的例子是，一个使用串口的应用程序需要串口在进行通信时保持住电源状态。 SetPowerRequirement被定义如下。&lt;/span&gt;&lt;/span&gt;&lt;/div&gt; &lt;div style="text-indent: 21pt"&gt;&amp;nbsp;&lt;/div&gt; &lt;div align="left"&gt;HANDLE&amp;nbsp;SetPowerRequirement&amp;nbsp;(PVOID&amp;nbsp;pvDevice,&lt;/div&gt; &lt;div align="left"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CEDEVICE_POWER_STATE&amp;nbsp;DeviceState,&lt;/div&gt; &lt;div align="left"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ULONG&amp;nbsp;DeviceFlags,&amp;nbsp;PVOID&amp;nbsp;pvSystemState,&lt;/div&gt; &lt;div style="text-indent: 21pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ULONG&amp;nbsp;StateFlags);&lt;/div&gt; &lt;div style="text-indent: 21pt"&gt;&amp;nbsp;&lt;/div&gt; &lt;div style="text-indent: 21pt"&gt;第一个参数指定了应用程序需要维护电源状态的设备。DeviceState参数定义了设备的电源状态。CEDEVICE_POWER_STATE&lt;span&gt;指定了状态范围是从&lt;span&gt;D0（意 味着设备是处于最大功耗状态）到D4（表示设备被关闭）（译者注：其实D0到D4的状态的具体表现，完全是由OEM厂商可自定义的，对应用程序开发者来 说，比如是在D1关LCD背光还是在D2，都是不确定的，微软只给出标准定义，而不是实际定义）。DeviceFlags参数由两个标志合并而 成：POWER_NAME，表示设备名有效；POWER_FORCE，表示设备应当维持当前状态甚至当系统挂起时。如果pvSystemState不为 NULL，它表示只有对于在pvSystemState中已命名的电源请求才是有效的。设备可能无法更改请求的状态。&lt;/span&gt;&lt;/span&gt;&lt;/div&gt; &lt;div style="text-indent: 21pt"&gt;应用程序应当注销通过调用&lt;span&gt;ReleasePowerRequirement来注销请求，原型如下。&lt;/span&gt;&lt;/div&gt; &lt;div style="text-indent: 21pt"&gt;&amp;nbsp;&lt;/div&gt; &lt;div style="text-indent: 21pt"&gt;DWORD&amp;nbsp;ReleasePowerRequirement&amp;nbsp;(HANDLE&amp;nbsp;hPowerReq);&lt;/div&gt; &lt;div style="text-indent: 21pt"&gt;&amp;nbsp;&lt;/div&gt; &lt;div style="text-indent: 21pt"&gt;这里唯一的参数是从SetPowerRequirement里返回的句柄。&lt;/div&gt; &lt;div style="text-indent: 21pt"&gt;&amp;nbsp;&lt;/div&gt; &lt;div style="text-indent: 21pt"&gt;转自（&lt;a href="http://www.builder.com.cn/2007/1126/655117.shtml" target="_blank"&gt;http://www.builder.com.cn/2007/1126/655117.shtml&lt;/a&gt;）&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/answer/aggbug/2055457.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/answer/archive/2011/05/24/2055457.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/answer/archive/2011/04/19/2020825.html</id><title type="text">[转]分享8个超棒的免费高质量图标搜索引擎</title><summary type="text">在工作中，我们经常需要用到图标素材。你也许能搜到很多的图标资源网站，但要找到免费的高质量图标却很难，这就是为什么我今天要与大家分享这些优秀的免费质量图标搜索引擎，相信在这些网站你能找到你要的东西。如果你知道更多更好的网站，欢迎与我们分享！ FindIcons FindIcons 是我最喜欢的图标搜索引擎，目前已拥有超过 300,000 个图标资源。 IconFinder Iconfinder 能帮助你快速找到需要的高质量图标，目前已拥有超过 150,000 个图标资源。 MrIcons MrIcons 也是非常不错的图标搜索引擎，拥有 125,174 个图标资源。 Iconlet Iconle</summary><published>2011-04-19T05:44:00Z</published><updated>2011-04-19T05:44:00Z</updated><author><name>answer</name><uri>http://www.cnblogs.com/answer/</uri></author><link rel="alternate" href="http://www.cnblogs.com/answer/archive/2011/04/19/2020825.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/answer/archive/2011/04/19/2020825.html"/><content type="html">&lt;div&gt;在工作中，我们经常需要用到图标素材。你也许能搜到很多的图标资源网站，但要找到免费的高质量图标却很难，这就是为什么我今天要与大家分享这些优秀的免费质量图标搜索引擎，相信在这些网站你能找到你要的东西。如果你知道更多更好的网站，欢迎与我们分享！ &lt;p&gt;&lt;strong&gt;&lt;a href="http://findicons.com/" target="_blank"&gt;&lt;strong&gt;FindIcons&lt;/strong&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;FindIcons 是我最喜欢的图标搜索引擎，目前已拥有超过 300,000 个图标资源。&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.findicons.com/" target="_blank"&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/36987/2011040823303098.jpg"  alt="" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;a href="http://www.iconfinder.com/" target="_blank"&gt;&lt;strong&gt;IconFinder&lt;/strong&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Iconfinder 能帮助你快速找到需要的高质量图标，目前已拥有超过 150,000 个图标资源。&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.iconfinder.com/" target="_blank"&gt;&lt;img title="IconFinder" alt="IconFinder" src="http://smashinghub.com/wp-content/uploads/2011/03/IconFinder_thumb.jpg" width="544" border="0" height="249" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;a href="http://www.mricons.com/" target="_blank"&gt;&lt;strong&gt;MrIcons&lt;/strong&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;MrIcons 也是非常不错的图标搜索引擎，拥有 125,174 个图标资源。&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.mricons.com/" target="_blank"&gt;&lt;img title="MrIcons" alt="MrIcons" src="http://smashinghub.com/wp-content/uploads/2011/03/MrIcons_thumb.jpg" width="544" border="0" height="341" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;a href="http://www.iconlet.com/" target="_blank"&gt;&lt;strong&gt;Iconlet&lt;/strong&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Iconlet 是一个查找图标等图片资源的搜索引擎。&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.iconlet.com/" target="_blank"&gt;&lt;img title="Iconlet" alt="Iconlet" src="http://smashinghub.com/wp-content/uploads/2011/03/Iconlet_thumb.jpg" width="544" border="0" height="249" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;a href="http://www.iconscan.com/" target="_blank"&gt;&lt;strong&gt;IconScan&lt;/strong&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;这是一个用于查找 ICO 格式图标的搜索引擎，拥有超过 80,000 个图标文件。&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.iconscan.com/" target="_blank"&gt;&lt;img title="IconScan" alt="IconScan" src="http://smashinghub.com/wp-content/uploads/2011/03/IconScan_thumb.jpg" width="504" border="0" height="168" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;a href="http://www.iconseeker.com/" target="_blank"&gt;&lt;strong&gt;IconSeeker&lt;/strong&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;IconSeeker 是最好的图标搜索引擎，拥有超过 50,000 张图标资源，下载格式有 PNG, ICO&amp;nbsp; 和 ICNS 三种。&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.iconseeker.com/" target="_blank"&gt;&lt;img title="Icon-Seeker" alt="Icon-Seeker" src="http://smashinghub.com/wp-content/uploads/2011/03/Icon-Seeker_thumb.jpg" width="504" border="0" height="191" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;a href="http://icons-search.com/" target="_blank"&gt;&lt;strong&gt;Icons Search&lt;/strong&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Icons-Search 是一个帮助你查找高质量图标的在线搜索工具。&lt;/p&gt; &lt;p&gt;&lt;a href="http://icons-search.com/" target="_blank"&gt;&lt;img title="Icons-Search" alt="Icons-Search" src="http://smashinghub.com/wp-content/uploads/2011/03/Icons-Search_thumb.jpg" width="544" border="0" height="249" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;a href="http://www.veryicon.com/" target="_blank"&gt;&lt;strong&gt;VeryIcon&lt;/strong&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;VeryIcom 是另外一个帮助你搜索高质量图标的网站，拥有超过 20,000 的高质量图标。&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.veryicon.com/" target="_blank"&gt;&lt;img title="VeryIcon" alt="VeryIcon" src="http://smashinghub.com/wp-content/uploads/2011/03/VeryIcon_thumb.jpg" width="537" border="0" height="316" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;（编译来源：&lt;a href="http://www.cnblogs.com/lhb25/" target="_blank"&gt;梦想天空&lt;/a&gt;&amp;nbsp; 改编自：&lt;a href="http://smashinghub.com/find-high-quality-icons.htm" target="_blank"&gt;8 Best Search Engines You Should Visit To Find&lt;/a&gt;）&lt;/p&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/answer/aggbug/2020825.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/answer/archive/2011/04/19/2020825.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
