<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-2117270136732158310</id><updated>2012-01-10T21:00:25.527+08:00</updated><category term='Python'/><category term='WindowsCE'/><category term='Complain'/><category term='XPEmbedded'/><category term='Microsoft'/><category term='webapplication'/><category term='MEMO'/><category term='Others'/><category term='ARM'/><category term='ffmpeg'/><category term='Thanks'/><category term='Windows'/><category term='GNU'/><category term='Sorry'/><category term='Web'/><category term='Workrecord'/><category term='USB'/><category term='Embedded'/><category term='test'/><category term='MSDN'/><category term='WTL'/><category term='Linux'/><category term='bookmark'/><category term='Notes'/><category term='GPS'/><category term='Software'/><category term='PC'/><category term='Hardware'/><category term='sitememo'/><category term='Book'/><category term='MPEGSTREAM'/><category term='Android'/><category term='FUN'/><category term='Vender'/><category term='TODO'/><category term='OpenGL'/><category term='WDM'/><category term='tcpmp'/><title type='text'>Real Checko's Blog</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://realchecko.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://realchecko.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default?start-index=101&amp;max-results=100'/><author><name>Checko</name><uri>http://www.blogger.com/profile/03239306354367907990</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/blogger/669/302/320/IMGP0803.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>775</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-2117270136732158310.post-5937646613123478323</id><published>2011-08-22T11:52:00.004+08:00</published><updated>2011-08-22T11:56:44.597+08:00</updated><title type='text'></title><content type='html'>原來是為了古老的"Large Array, 32M memory" 問題google 一下。&lt;br&gt;&lt;br /&gt;找到這裡 &lt;a href="http://www.pocketpcjunkies.com/Uwe/Forum.aspx/wince-pb/492/VirtualAlloc-still-has-a-32MB-limit"&gt;http://www.pocketpcjunkies.com/Uwe/Forum.aspx/wince-pb/492/VirtualAlloc-still-has-a-32MB-limit&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;原來是有只個有用的回覆。&lt;br&gt;&lt;br /&gt;後來卻變成 eMVP 對 MS share code license 的討論了..&lt;br&gt;&lt;br /&gt;兩點：&lt;br /&gt;1. share code 的fair use可不可以用來 作support 時使用。值得花這麼多時間討論嗎？用來解決那個 32M , large array limit 不是很好？&lt;br /&gt;2. 原來大部分的問都是因為 "沒有 source code，所以我不知道" ...&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2117270136732158310-5937646613123478323?l=realchecko.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realchecko.blogspot.com/feeds/5937646613123478323/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2117270136732158310&amp;postID=5937646613123478323' title='2 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/5937646613123478323'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/5937646613123478323'/><link rel='alternate' type='text/html' href='http://realchecko.blogspot.com/2011/08/large-array-32m-memory-google-httpwww.html' title=''/><author><name>Checko</name><uri>http://www.blogger.com/profile/03239306354367907990</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/blogger/669/302/320/IMGP0803.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2117270136732158310.post-6987502930671080189</id><published>2011-02-25T20:12:00.002+08:00</published><updated>2011-02-25T20:35:39.386+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WindowsCE'/><title type='text'>Buildrel -- sharing violation</title><content type='html'>奇怪，在某些 workspace 作 buildrel 會出現 sharing violation。&lt;br /&gt;所以去找 buildrel.bat ==&amp;gt; 在 C:\WINCE500\PUBLIC\COMMON\OAK\MISC 找到。&lt;br /&gt;&lt;br /&gt;打開後，在第 20 行加上 echo on，再 run 一次 buildrel，這樣每個動作就都會印出來。&lt;br /&gt;然後找到..&lt;br /&gt;&lt;code&gt;C:\WINCE500\PLATFORM\SMDK2416&gt;xcopy /q /c &lt;br /&gt;C:\WINCE500\PBWorkspaces\Core2416\WINCE500\smdk2416_ARMV4I\oak\Files\nlscpg.txt &lt;br /&gt;C:\WINCE500\PBWorkspaces\Core2416\RelDir\smdk2416_ARMV4I_Release&lt;br /&gt;Sharing violation&lt;br /&gt;0 File(s) copied&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;這個看起來好像是一個 FAQ 了： &lt;a href="http://social.msdn.microsoft.com/Forums/en-US/winembplatdev/thread/49926e06-d048-4b95-827f-ab17e97d8f88/"&gt;http://social.msdn.microsoft.com/Forums/en-US/winembplatdev/thread/49926e06-d048-4b95-827f-ab17e97d8f88/&lt;/a&gt;&lt;br /&gt;而且好像就發生在 nlscpg.txt 這個檔。&lt;br /&gt;&lt;br /&gt;MS 好像沒有要 fix 的意思。&lt;br /&gt;只有在 buildrel 的 document 有一項：&lt;br /&gt;如果發生 sharing violation error，請用 copy 不要用 copylink&lt;br /&gt;&lt;br /&gt;!!! 天那！！ copy 的話要花好久時間 ！！&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2117270136732158310-6987502930671080189?l=realchecko.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realchecko.blogspot.com/feeds/6987502930671080189/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2117270136732158310&amp;postID=6987502930671080189' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/6987502930671080189'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/6987502930671080189'/><link rel='alternate' type='text/html' href='http://realchecko.blogspot.com/2011/02/buildrel-sharing-violation.html' title='Buildrel -- sharing violation'/><author><name>Checko</name><uri>http://www.blogger.com/profile/03239306354367907990</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/blogger/669/302/320/IMGP0803.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2117270136732158310.post-766922812172284514</id><published>2010-10-25T09:30:00.002+08:00</published><updated>2010-10-25T09:36:22.194+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='FUN'/><category scheme='http://www.blogger.com/atom/ns#' term='Others'/><title type='text'>New (?) Blog</title><content type='html'>終於又可以回到 linux 了。&lt;br /&gt;&lt;br /&gt;就跟當初因為 Windows CE 而轉換 blog一樣，這次也要轉換 blog (反正 blogger 新開 blog 不用錢 X)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://r40eubuntu.blogspot.com/"&gt;R40eUbuntu&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;這麼奇怪的名字是因為當初是 R40e 的維護記錄。後來就當做 linux 相關blog 記錄。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;* 希望我以後再也不用更新這個 site 的資料.. (&gt;_&lt;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2117270136732158310-766922812172284514?l=realchecko.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realchecko.blogspot.com/feeds/766922812172284514/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2117270136732158310&amp;postID=766922812172284514' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/766922812172284514'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/766922812172284514'/><link rel='alternate' type='text/html' href='http://realchecko.blogspot.com/2010/10/new-blog.html' title='New (?) Blog'/><author><name>Checko</name><uri>http://www.blogger.com/profile/03239306354367907990</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/blogger/669/302/320/IMGP0803.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2117270136732158310.post-4021119541383761865</id><published>2010-10-22T10:03:00.001+08:00</published><updated>2010-10-22T10:08:54.026+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='FUN'/><title type='text'>倫敦交易所創下最快交易記錄</title><content type='html'>記得這一連串的事件 -- &lt;a href="http://realchecko.blogspot.com/search?q=%E5%80%AB%E6%95%A6"&gt;倫敦交易所&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;今天的新聞：  &lt;a href="http://www.computerworlduk.com/news/networking/3244936/london-stock-exchange-smashes-world-record-trade-speed-with-linux/"&gt;倫敦交易所創下最快交易記錄&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;但是..好像還只是試運轉.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2117270136732158310-4021119541383761865?l=realchecko.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realchecko.blogspot.com/feeds/4021119541383761865/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2117270136732158310&amp;postID=4021119541383761865' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/4021119541383761865'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/4021119541383761865'/><link rel='alternate' type='text/html' href='http://realchecko.blogspot.com/2010/10/blog-post.html' title='倫敦交易所創下最快交易記錄'/><author><name>Checko</name><uri>http://www.blogger.com/profile/03239306354367907990</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/blogger/669/302/320/IMGP0803.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2117270136732158310.post-2715745603089655366</id><published>2010-09-24T16:53:00.001+08:00</published><updated>2010-09-24T16:59:37.415+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ffmpeg'/><category scheme='http://www.blogger.com/atom/ns#' term='MPEGSTREAM'/><title type='text'>latest ffmpeg rev can play logged 1seg TS</title><content type='html'>使用 v0.6 以後 (2010 09 23) 的 ffmpeg &lt;br /&gt;ffplay 可以播放 1seg log stream..&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2117270136732158310-2715745603089655366?l=realchecko.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realchecko.blogspot.com/feeds/2715745603089655366/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2117270136732158310&amp;postID=2715745603089655366' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/2715745603089655366'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/2715745603089655366'/><link rel='alternate' type='text/html' href='http://realchecko.blogspot.com/2010/09/latest-ffmpeg-rev-can-play-logged-1seg.html' title='latest ffmpeg rev can play logged 1seg TS'/><author><name>Checko</name><uri>http://www.blogger.com/profile/03239306354367907990</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/blogger/669/302/320/IMGP0803.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2117270136732158310.post-3950799595993216118</id><published>2010-09-17T17:07:00.005+08:00</published><updated>2010-09-17T17:41:34.420+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MPEGSTREAM'/><title type='text'>write code to parse logged 1SEG TS Data.  with ISO/IEC 13818-1</title><content type='html'>所包含的 PID 有：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;0x0010&lt;/li&gt;&lt;li&gt;0x0011&lt;/li&gt;&lt;li&gt;0x0014&lt;/li&gt;&lt;li&gt;0x0024&lt;/li&gt;&lt;li&gt;0x0301&lt;br /&gt;&lt;/li&gt;&lt;li&gt;0x0400&lt;/li&gt;&lt;li&gt;0x0500&lt;/li&gt;&lt;li&gt;0x0600&lt;/li&gt;&lt;li&gt;0x1FC8&lt;/li&gt;&lt;li&gt;0x1FFF&lt;/li&gt;&lt;/ul&gt;下面是兩個同樣 log 10M 的 STREAM。&lt;br /&gt;COLORBAR:&lt;br /&gt;&lt;code&gt;0010:  202&lt;br /&gt;0011:  101&lt;br /&gt;0014:   40&lt;br /&gt;0024:  202&lt;br /&gt;0301: 3486&lt;br /&gt;0400:21145&lt;br /&gt;0500: 9451&lt;br /&gt;1FC8: 1008&lt;br /&gt;1FFF:20144&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;TESTVIDEO&lt;br /&gt;&lt;code&gt;0010:  202&lt;br /&gt;0011:  101&lt;br /&gt;0014:   40&lt;br /&gt;0024:  202&lt;br /&gt;0400:35010&lt;br /&gt;0500: 9450&lt;br /&gt;0600: 3486&lt;br /&gt;1FC8: 1009&lt;br /&gt;1FFF: 6276&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;下面是 log 1M 的 TESTVIDEO&lt;br /&gt;&lt;code&gt;0010:   20&lt;br /&gt;0011:   10&lt;br /&gt;0014:    4&lt;br /&gt;0024:   20&lt;br /&gt;0400: 3499&lt;br /&gt;0500:  946&lt;br /&gt;0600:  349&lt;br /&gt;1FC8:  101&lt;br /&gt;1FFF:  635&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;當 CN 低時，會有 error，這時候 bit : transport_error_indicator 就會是 1. 有時候，該 packet 的 pid 就不在上述範圍內。&lt;br /&gt;&lt;br /&gt;Color Bar TEST STREAM 有很多 priority packet (priority bit = 1)。&lt;br /&gt;一般影片的 TEST STREAM 就沒有 priority packet。&lt;br /&gt;priority packet 的 pid 是 0x0301 和 0x0010。0x0010 同時是 start packet.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2117270136732158310-3950799595993216118?l=realchecko.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realchecko.blogspot.com/feeds/3950799595993216118/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2117270136732158310&amp;postID=3950799595993216118' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/3950799595993216118'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/3950799595993216118'/><link rel='alternate' type='text/html' href='http://realchecko.blogspot.com/2010/09/write-code-to-parse-logged-1seg-ts-data.html' title='write code to parse logged 1SEG TS Data.  with ISO/IEC 13818-1'/><author><name>Checko</name><uri>http://www.blogger.com/profile/03239306354367907990</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/blogger/669/302/320/IMGP0803.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2117270136732158310.post-918911399718356030</id><published>2010-09-16T13:51:00.001+08:00</published><updated>2010-09-16T13:53:58.674+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tcpmp'/><category scheme='http://www.blogger.com/atom/ns#' term='ffmpeg'/><title type='text'>use VLC to play 1SEG TS file</title><content type='html'>用 VLC 1.0.2:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;vlc --ts-extra-pmt=15=0x400:27 log.trp&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;可以撥 save 起來的 1SEG TS file.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2117270136732158310-918911399718356030?l=realchecko.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realchecko.blogspot.com/feeds/918911399718356030/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2117270136732158310&amp;postID=918911399718356030' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/918911399718356030'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/918911399718356030'/><link rel='alternate' type='text/html' href='http://realchecko.blogspot.com/2010/09/use-vlc-to-play-1seg-ts-file.html' title='use VLC to play 1SEG TS file'/><author><name>Checko</name><uri>http://www.blogger.com/profile/03239306354367907990</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/blogger/669/302/320/IMGP0803.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2117270136732158310.post-5946635386593166522</id><published>2010-09-15T15:32:00.003+08:00</published><updated>2010-09-15T15:39:14.464+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Hardware'/><category scheme='http://www.blogger.com/atom/ns#' term='Embedded'/><title type='text'>Serial TS (Transport Stream) bus signal definition</title><content type='html'>Serial Type Transport Stream 的信號 pin 有：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;TSCLK : clock&lt;/li&gt;&lt;li&gt;TSO : Data&lt;/li&gt;&lt;li&gt;TSEN : TS valid (有點類似 chip select)&lt;/li&gt;&lt;li&gt;TSPAC : Syn Byte  (在送出 sync byte 的data 時會有動作)&lt;/li&gt;&lt;li&gt;TSER : TS Packet Error flag (packet 有 error 時會有動作)&lt;/li&gt;&lt;/ul&gt;Transport Stream 分為 3 部份：&lt;br /&gt;&lt;pre&gt;&lt;br /&gt; Sync --- Stream Data -- Pariry&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;其中 Sync + Stream Data == 188 byte&lt;br /&gt;Parity 有 16 byte&lt;br /&gt;&lt;br /&gt;一般的 chip 可以指定 TSEN 要不要把 parity 的data 也算進去。&lt;br /&gt;另外，除了 stream packet 外，在沒有信號，或是有 error 時，會有 NULL packet。&lt;br /&gt;也可以決定在送 null packet 時，clock 要不要動作。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2117270136732158310-5946635386593166522?l=realchecko.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realchecko.blogspot.com/feeds/5946635386593166522/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2117270136732158310&amp;postID=5946635386593166522' title='2 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/5946635386593166522'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/5946635386593166522'/><link rel='alternate' type='text/html' href='http://realchecko.blogspot.com/2010/09/serial-ts-transport-stream-bus-signal.html' title='Serial TS (Transport Stream) bus signal definition'/><author><name>Checko</name><uri>http://www.blogger.com/profile/03239306354367907990</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/blogger/669/302/320/IMGP0803.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2117270136732158310.post-7170332947932149697</id><published>2010-09-14T10:21:00.002+08:00</published><updated>2010-09-14T10:27:08.945+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ARM'/><category scheme='http://www.blogger.com/atom/ns#' term='Hardware'/><category scheme='http://www.blogger.com/atom/ns#' term='Complain'/><category scheme='http://www.blogger.com/atom/ns#' term='Embedded'/><title type='text'>奇怪mcu的I2C奇怪波形</title><content type='html'>&lt;div&gt;悲哀的cheap mcu，送出的 I2C 撥波行徑然是..&lt;/div&gt;&lt;a href="http://www.flickr.com/photos/checkoblog/4988240473/" title="poormcubadi2cwave by Checko's Blog Image, on Flickr"&gt;&lt;img src="http://farm5.static.flickr.com/4146/4988240473_83002b6a04.jpg" width="500" height="428" alt="poormcubadi2cwave" /&gt;&lt;/a&gt;&lt;div&gt;可以看到在 START command 前，會送出一個 CLK, SDA 都是 Low 的 plus，然後 start condition 後， SDA 竟然會有一個 high-puls。&lt;/div&gt;&lt;div&gt;雖然這樣沒有違反 I2C wave form standard(?)&lt;/div&gt;&lt;div&gt;ref : &lt;a href="http://en.wikipedia.org/wiki/I%C2%B2C"&gt;wik&lt;/a&gt;i &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;但是有些 chip 就是不吃這樣的波形呀。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;能偷就偷，不知道這種 chip design house 的品質是怎樣做出來的...&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2117270136732158310-7170332947932149697?l=realchecko.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realchecko.blogspot.com/feeds/7170332947932149697/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2117270136732158310&amp;postID=7170332947932149697' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/7170332947932149697'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/7170332947932149697'/><link rel='alternate' type='text/html' href='http://realchecko.blogspot.com/2010/09/mcui2c.html' title='奇怪mcu的I2C奇怪波形'/><author><name>Checko</name><uri>http://www.blogger.com/profile/03239306354367907990</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/blogger/669/302/320/IMGP0803.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm5.static.flickr.com/4146/4988240473_83002b6a04_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2117270136732158310.post-6820157991002829875</id><published>2010-09-09T15:07:00.002+08:00</published><updated>2010-09-13T14:36:06.556+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Hardware'/><category scheme='http://www.blogger.com/atom/ns#' term='USB'/><category scheme='http://www.blogger.com/atom/ns#' term='Embedded'/><title type='text'>ULPI -- USB interface standard</title><content type='html'>USB Controller  與 PHY 的介面原為 22 pin 以上的 UTMI 介面。&lt;br /&gt;後來為了減少 pin count，重新定義了12 pin 的 ULPI (UTMP+ Low Pin Interface)介面。&lt;br /&gt;&lt;br /&gt;從此，USB controller 與 PHY 只要是標準 ULPI 介面的，都可以互換。&lt;br /&gt;&lt;br /&gt;ULPI 的標準竟然含一個 由 PHY 輸出的 CLKOUT(60MHz)。&lt;br /&gt;也就是說，ULPI 標準，規定了 crystal 要裝在 PHY 那一端。(?)&lt;br /&gt;&lt;br /&gt;ULPI 也規定了內部的 register map，所以才能達到 chip 可以互換的要求。&lt;br /&gt;規定了四類 register:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;ID&lt;/li&gt;&lt;li&gt;Mode&lt;/li&gt;&lt;li&gt;Interrupt&lt;/li&gt;&lt;li&gt;Extra&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2117270136732158310-6820157991002829875?l=realchecko.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realchecko.blogspot.com/feeds/6820157991002829875/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2117270136732158310&amp;postID=6820157991002829875' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/6820157991002829875'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/6820157991002829875'/><link rel='alternate' type='text/html' href='http://realchecko.blogspot.com/2010/09/ulpi-usb-interface-standard.html' title='ULPI -- USB interface standard'/><author><name>Checko</name><uri>http://www.blogger.com/profile/03239306354367907990</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/blogger/669/302/320/IMGP0803.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2117270136732158310.post-8054111798046379363</id><published>2010-09-07T17:22:00.002+08:00</published><updated>2010-09-07T17:30:33.298+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WindowsCE'/><category scheme='http://www.blogger.com/atom/ns#' term='Workrecord'/><title type='text'></title><content type='html'>接上 USB ActiveSync 後，一連線上就中斷，然後反覆。&lt;br /&gt;&lt;br /&gt;這是因為由 KITL image 換成 NOKITL後，沒有重新sysgen 的關係。&lt;br /&gt;&lt;code&gt;&amp;gt;blddemo clean -q&lt;/code&gt;後，就可以了。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2117270136732158310-8054111798046379363?l=realchecko.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realchecko.blogspot.com/feeds/8054111798046379363/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2117270136732158310&amp;postID=8054111798046379363' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/8054111798046379363'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/8054111798046379363'/><link rel='alternate' type='text/html' href='http://realchecko.blogspot.com/2010/09/usb-activesync-kitl-image-nokitlsysgen.html' title=''/><author><name>Checko</name><uri>http://www.blogger.com/profile/03239306354367907990</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/blogger/669/302/320/IMGP0803.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2117270136732158310.post-7727924963252913035</id><published>2010-09-03T12:01:00.003+08:00</published><updated>2010-09-03T19:00:47.949+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OpenGL'/><title type='text'>OpenGL ES 筆記 - III</title><content type='html'>from : http://www.sunsetlakesoftware.com/2008/08/05/lessons-molecules-opengl-es&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;原來的OpenGL 包涵很多none-effecicent api，OpenGL ES 把所有none-effiicienct api 都拿掉了。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Config&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;EGLConfig 是要告訴 OpenGL 目前這個hardware platform surface 的 rendering format。&lt;br /&gt;使用 eglGetConfigs( ) 可以取出目前這個platform  所有 support 的 rendering format。&lt;br /&gt;&lt;br /&gt;要決定 config 有很多複雜的動作：&lt;br /&gt;&lt;br /&gt;詢問目前 platform support 的 config 有哪些。&lt;br /&gt;設定目前要用的config&lt;br /&gt;&lt;br /&gt;config 是由一堆 attrib 組成，EGL 用一維 array 來代表：分別是&lt;br /&gt;&lt;code&gt;{attrib1,value1,attrib2,value2...EGL_NONE};&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Attrib&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;EGL_BUFFER_SIZE&lt;br /&gt;&lt;blockquote&gt;Color buffer depth (bit 數)&lt;br /&gt;= RED_SIZE + GREEN_SIZE + BLUE_SIZE + ALPHA_SIZE&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;輸入Vertex array 與 繪圖&lt;br /&gt;&lt;br /&gt;畫圖的動作分成兩部份：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;將 定義 Vertext Point 的 Array 丟進 OpenGL&lt;/li&gt;&lt;li&gt;要 OpenGL 以 XXX 的順序畫圖&lt;/li&gt;&lt;/ul&gt;所以需要提供兩種資料：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Vertex point array&lt;/li&gt;&lt;li&gt;Vertex Draw Sequence&lt;/li&gt;&lt;/ul&gt;第一個資料用 glVertexPointers( ) function 來送入 OpenGL。&lt;br /&gt;第二個資料用 glDrawElements( ) 時傳入。&lt;br /&gt;&lt;code&gt;void glVertexPointer (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);&lt;/code&gt;其中 size 是每一個 vertex 的 coordinate number -- 就是一個Vertex 需要幾筆資料來表示。因為是3維座標，所以寫 3 (default 是 4).&lt;br /&gt;&lt;br /&gt;&lt;code&gt;void  glDrawElements (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices);&lt;/code&gt;其中 indices 就是繪出的順序。&lt;br /&gt;indices 的內容通常是：&lt;code&gt;{0,4,1,0,9,4,9,5,4}&lt;/code&gt;這是說，先由點 0,4,1 畫出一個三角形，再用點 0,9,4 話一個，然後是點 9,5,4 的三角形。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2117270136732158310-7727924963252913035?l=realchecko.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realchecko.blogspot.com/feeds/7727924963252913035/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2117270136732158310&amp;postID=7727924963252913035' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/7727924963252913035'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/7727924963252913035'/><link rel='alternate' type='text/html' href='http://realchecko.blogspot.com/2010/09/opengl-es-iii.html' title='OpenGL ES 筆記 - III'/><author><name>Checko</name><uri>http://www.blogger.com/profile/03239306354367907990</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/blogger/669/302/320/IMGP0803.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2117270136732158310.post-3861267710614615137</id><published>2010-09-03T11:35:00.002+08:00</published><updated>2010-09-03T12:01:39.065+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OpenGL'/><title type='text'>OpenGL ES 筆記 - II</title><content type='html'>一樣，ref http://blog.jayway.com&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;OpenGL ES 採用 右手直角座標 -- 也就是說&lt;br /&gt;&lt;blockquote&gt;右手方向是 X&lt;br /&gt;上方是Y&lt;br /&gt;背後是 Z&lt;br /&gt;&lt;br /&gt;而初始的 view 位置就是在 0.0.0&lt;br /&gt;&lt;/blockquote&gt;Transformation 就是把要描繪的物體在座標軸上轉換，有以下的轉換動作：&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Translate 平移 &lt;/li&gt;&lt;li&gt;Rotate 旋轉&lt;/li&gt;&lt;li&gt;Scale 放大/縮小&lt;/li&gt;&lt;/ol&gt;以上的動作都有一function 可以作，參數分別是對 x, y ,z 軸的參數，其中 Rotate 的參數單位是 degree。&lt;br /&gt;&lt;br /&gt;&lt;hr /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2117270136732158310-3861267710614615137?l=realchecko.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realchecko.blogspot.com/feeds/3861267710614615137/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2117270136732158310&amp;postID=3861267710614615137' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/3861267710614615137'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/3861267710614615137'/><link rel='alternate' type='text/html' href='http://realchecko.blogspot.com/2010/09/opengl-es-ii.html' title='OpenGL ES 筆記 - II'/><author><name>Checko</name><uri>http://www.blogger.com/profile/03239306354367907990</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/blogger/669/302/320/IMGP0803.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2117270136732158310.post-1180516723209830500</id><published>2010-09-03T09:49:00.004+08:00</published><updated>2010-09-03T11:30:09.068+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OpenGL'/><title type='text'>OpenGL ES 筆記</title><content type='html'>一堆opengl 的筆記。&lt;br /&gt;ref:&lt;br /&gt;http://wiki.forum.nokia.com/&lt;br /&gt;http://blog.jayway.com/&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;OpenGL 的繪圖步驟：&lt;/span&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;取得 &lt;span style="color: rgb(204, 0, 0);"&gt;display&lt;/span&gt;  --- 就是 pc monitor，或是手機的 lcd panel.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;initializ&lt;/span&gt;e EGL&lt;br /&gt;&lt;/li&gt;&lt;li&gt;選一個 &lt;span style="color: rgb(255, 0, 0);"&gt;config&lt;/span&gt;/mode&lt;/li&gt;&lt;li&gt;create一個 &lt;span style="color: rgb(255, 0, 0);"&gt;context&lt;/span&gt;&lt;/li&gt;&lt;li&gt;create一個 用來繪圖的 &lt;span style="color: rgb(255, 0, 0);"&gt;surface&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;enable&lt;/span&gt; 剛剛create的 context&lt;/li&gt;&lt;/ol&gt;&lt;span style="font-weight: bold;"&gt;OpenGL ES 繪圖基本元素(Primitives)&lt;/span&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Vertex ( Vertices) : 最小的基本繪圖單位，就是兩線交會的點。(point)&lt;br /&gt;Vertex 在 OpenGL ES 中被用作描繪3D model 的元素，也被用來指定 camera , light 的位置。&lt;/li&gt;&lt;li&gt;Edge : 連接兩個 Vertex 的直線&lt;/li&gt;&lt;li&gt;Face : 由三個 Vertex 包成的三角形區域。&lt;br /&gt;當要定義一個face 時，他的三個vertex 的順序是很重要的，vertex 順序被用來判定face 的正面和背面(右手定則?)。有時候，可以指定只 render 正面，好節省時間。&lt;/li&gt;&lt;/ol&gt;定義一個多邊形 (Polygon)&lt;br /&gt;&lt;blockquote&gt;多邊型的每個面要被拆解成一個一個的三角型，然後把每個三角形的端點(vertex) 寫出來就可以。&lt;br /&gt;&lt;br /&gt;所以寫出來，會是一個array:&lt;br /&gt;&lt;code&gt;{&lt;br /&gt;-1.0f,    1.0f,  0.0f,   // 0 Top Left&lt;br /&gt;-1.0f, -1.0f, 0.0f, // 1 Bottom Left&lt;br /&gt;1.0f, -1.0f, 0.0f, // 2 Bottom Right&lt;br /&gt;1.0f,  1.0f, 0.0f  // 3. Top Right&lt;br /&gt;}&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;把 vortex 訂出來後，還需要一個資料，告訴OpenGL 哪幾點構成一個 triangle，這個資料叫 indices:&lt;br /&gt;&lt;code&gt;{&lt;br /&gt;0,1,2,  // 第一個triangle 由 vertex 0.1.2 構成&lt;br /&gt;0,2,3&lt;br /&gt;};&lt;br /&gt;&lt;/code&gt;&lt;/blockquote&gt;&lt;span style="font-weight: bold;"&gt;OpenGL ES 描繪的方式 (render primitive)&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;剛剛 OpenGL ES 的 primitives 定義 "描述物體的基本元素"，現在要講得是如何把這些 "描述" 畫出來。&lt;/blockquote&gt;&lt;ol&gt;&lt;li&gt;GL_POINTS : 只描出 定義的點&lt;/li&gt;&lt;li&gt;GL_LINE_STRIP :  依順序描出點之間的線&lt;/li&gt;&lt;li&gt;GL_LINE_LOOP : 和 GL_LINE_STRIP  一樣，但是再加一條 : 最後一點到第一點的線&lt;/li&gt;&lt;li&gt;GL_LINES : 兩兩描出一線&lt;/li&gt;&lt;li&gt;GL_TRIANGLES : 每三點描出一triangle&lt;/li&gt;&lt;li&gt;GL_TRIANGLE_STRIP :有點難，就是每三點描出一triangle外，再包圍起來。&lt;/li&gt;&lt;li&gt;GL_TRIANGLE_FAN : 一樣，有點難，每三點描出一 triangle外，再用扇形圍起來。&lt;/li&gt;&lt;/ol&gt;所以一般常用的rendering primitives 是 GL_TRIANGLES&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2117270136732158310-1180516723209830500?l=realchecko.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realchecko.blogspot.com/feeds/1180516723209830500/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2117270136732158310&amp;postID=1180516723209830500' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/1180516723209830500'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/1180516723209830500'/><link rel='alternate' type='text/html' href='http://realchecko.blogspot.com/2010/09/opengl-es.html' title='OpenGL ES 筆記'/><author><name>Checko</name><uri>http://www.blogger.com/profile/03239306354367907990</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/blogger/669/302/320/IMGP0803.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2117270136732158310.post-9213343556450032361</id><published>2010-08-23T11:14:00.006+08:00</published><updated>2010-08-23T11:32:09.339+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Complain'/><title type='text'>抱怨：PANASONIC DVD 錄放影機 一過保就壞了</title><content type='html'>去年 5 月底買的 PANASONIC DVD 錄放影機 DMR ES15，5200。&lt;br /&gt;結果保固一年一過就壞了，而且是壞在最貴的雷射頭。修理1900。 超過原價的 1/3 。&lt;br /&gt;&lt;br /&gt;這樣的設計功力應該才是最厲害的...剛好過保固就壞。&lt;br /&gt;&lt;hr&gt;&lt;br /&gt;L 提供的： http://se.sunfar.com.tw/promo/9908/05.htm   順發延長保固 -- 就像 apple care, IBM, Dell 一樣，可以加買保固。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2117270136732158310-9213343556450032361?l=realchecko.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realchecko.blogspot.com/feeds/9213343556450032361/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2117270136732158310&amp;postID=9213343556450032361' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/9213343556450032361'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/9213343556450032361'/><link rel='alternate' type='text/html' href='http://realchecko.blogspot.com/2010/08/panasonic-dvd.html' title='抱怨：PANASONIC DVD 錄放影機 一過保就壞了'/><author><name>Checko</name><uri>http://www.blogger.com/profile/03239306354367907990</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/blogger/669/302/320/IMGP0803.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2117270136732158310.post-6495435704664642305</id><published>2010-08-12T15:42:00.003+08:00</published><updated>2010-08-12T17:08:47.873+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WindowsCE'/><category scheme='http://www.blogger.com/atom/ns#' term='Workrecord'/><category scheme='http://www.blogger.com/atom/ns#' term='MSDN'/><category scheme='http://www.blogger.com/atom/ns#' term='Microsoft'/><title type='text'>Modify DDCAPS for CE 6.0</title><content type='html'>DDCAPS 是 platform builder 提供，偵測 platform 支援 directdraw 的程度。&lt;br /&gt;但是 CE 6.0 後，DirectDraw interface 大幅改變，所以這個 code 就不能用了。要修改後才行。&lt;br /&gt;&lt;br /&gt;修改後的 code:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;Index: ddcaps.c&lt;br /&gt;===================================================================&lt;br /&gt;--- ddcaps.c (revision 23142)&lt;br /&gt;+++ ddcaps.c (working copy)&lt;br /&gt;@@ -74,7 +74,7 @@&lt;br /&gt;    LPDWORD caps;&lt;br /&gt;    LPCAPSDEFSTYPE defs;&lt;br /&gt;&lt;br /&gt;-} gCaps[10];&lt;br /&gt;+} gCaps[12];&lt;br /&gt;&lt;br /&gt;struct&lt;br /&gt;{&lt;br /&gt;@@ -102,131 +102,83 @@&lt;br /&gt;LPDIRECTDRAW lpDD;              // DirectDraw object&lt;br /&gt;&lt;br /&gt;// Map caps bits to readable strings&lt;br /&gt;-CAPSDEFSTYPE ddCapsDefs[MAX_BOXES] =&lt;br /&gt;-{&lt;br /&gt;-    {TEXT("3D"), DDCAPS_3D},&lt;br /&gt;-    {TEXT("ALIGNBOUNDARYDEST"), DDCAPS_ALIGNBOUNDARYDEST},&lt;br /&gt;-    {TEXT("ALIGNSIZEDEST"), DDCAPS_ALIGNSIZEDEST},&lt;br /&gt;-    {TEXT("ALIGNBOUNDARYSRC"), DDCAPS_ALIGNBOUNDARYSRC},&lt;br /&gt;-    {TEXT("ALIGNSIZESRC"), DDCAPS_ALIGNSIZESRC},&lt;br /&gt;-    {TEXT("ALIGNSTRIDE"), DDCAPS_ALIGNSTRIDE},&lt;br /&gt;-    {TEXT("BLT"), DDCAPS_BLT},&lt;br /&gt;-    {TEXT("BLTQUEUE"), DDCAPS_BLTQUEUE},&lt;br /&gt;-    {TEXT("BLTFOURCC"), DDCAPS_BLTFOURCC},&lt;br /&gt;-    {TEXT("BLTSTRETCH"), DDCAPS_BLTSTRETCH},&lt;br /&gt;-    {TEXT("GDI"), DDCAPS_GDI},&lt;br /&gt;-    {TEXT("OVERLAY"), DDCAPS_OVERLAY},&lt;br /&gt;-    {TEXT("OVERLAYCANTCLIP"), DDCAPS_OVERLAYCANTCLIP},&lt;br /&gt;-    {TEXT("OVERLAYFOURCC"), DDCAPS_OVERLAYFOURCC},&lt;br /&gt;-    {TEXT("OVERLAYSTRETCH"), DDCAPS_OVERLAYSTRETCH},&lt;br /&gt;-    {TEXT("PALETTE"), DDCAPS_PALETTE},&lt;br /&gt;-    {TEXT("PALETTEVSYNC"), DDCAPS_PALETTEVSYNC},&lt;br /&gt;-    {TEXT("READSCANLINE"), DDCAPS_READSCANLINE},&lt;br /&gt;-    {TEXT("STEREOVIEW"), DDCAPS_STEREOVIEW},&lt;br /&gt;-    {TEXT("VBI"), DDCAPS_VBI},&lt;br /&gt;-    {TEXT("ZBLTS"), DDCAPS_ZBLTS},&lt;br /&gt;-    {TEXT("ZOVERLAYS"), DDCAPS_ZOVERLAYS},&lt;br /&gt;-    {TEXT("COLORKEY"), DDCAPS_COLORKEY},&lt;br /&gt;-    {TEXT("ALPHA"), DDCAPS_ALPHA},&lt;br /&gt;-    {TEXT("CKEYHWASSIST"), DDCAPS_COLORKEYHWASSIST},&lt;br /&gt;-    {TEXT("NOHARDWARE"), DDCAPS_NOHARDWARE},&lt;br /&gt;-    {TEXT("BLTCOLORFILL"), DDCAPS_BLTCOLORFILL},&lt;br /&gt;-    {TEXT("BANKSWITCHED"), DDCAPS_BANKSWITCHED},&lt;br /&gt;-    {TEXT("BLTDEPTHFILL"), DDCAPS_BLTDEPTHFILL},&lt;br /&gt;-    {TEXT("CANCLIP"), DDCAPS_CANCLIP},&lt;br /&gt;-    {TEXT("CANCLIPSTRETCHED"), DDCAPS_CANCLIPSTRETCHED},&lt;br /&gt;-};&lt;br /&gt;&lt;br /&gt;+&lt;br /&gt;CAPSDEFSTYPE CKeyCapsDefs[MAX_BOXES] =&lt;br /&gt;{&lt;br /&gt;-    {TEXT("DESTBLT"), DDCKEYCAPS_DESTBLT},&lt;br /&gt;-    {TEXT("DESTBLTCLRSPACE"), DDCKEYCAPS_DESTBLTCLRSPACE},&lt;br /&gt;+    {TEXT("BOTHBLT"), DDCKEYCAPS_BOTHBLT},&lt;br /&gt;+    {TEXT("DESTBLT"), DDCKEYCAPS_DESTBLT },&lt;br /&gt;+    {TEXT("DESTBLTCLRSPACE"), DDCKEYCAPS_DESTBLTCLRSPACE },&lt;br /&gt;    {TEXT("DESTBLTCLRSPACEYUV"), DDCKEYCAPS_DESTBLTCLRSPACEYUV},&lt;br /&gt;-    {TEXT("DESTBLTYUV"), DDCKEYCAPS_DESTBLTYUV},&lt;br /&gt;-    {TEXT("DESTOVERLAY"), DDCKEYCAPS_DESTOVERLAY},&lt;br /&gt;-    {TEXT("DESTOVERLAYCLRSPACE"), DDCKEYCAPS_DESTOVERLAYCLRSPACE},&lt;br /&gt;-    {TEXT("DESTOVERLAYCLRSPACEYUV"), DDCKEYCAPS_DESTOVERLAYCLRSPACEYUV},&lt;br /&gt;-    {TEXT("DESTOVERLAYONEACTIVE"), DDCKEYCAPS_DESTOVERLAYONEACTIVE},&lt;br /&gt;-    {TEXT("DESTOVERLAYYUV"), DDCKEYCAPS_DESTOVERLAYYUV},&lt;br /&gt;-    {TEXT("SRCBLT"), DDCKEYCAPS_SRCBLT},&lt;br /&gt;+    {TEXT("SRCBLT"), DDCKEYCAPS_SRCBLT },&lt;br /&gt;    {TEXT("SRCBLTCLRSPACE"), DDCKEYCAPS_SRCBLTCLRSPACE},&lt;br /&gt;-    {TEXT("SRCBLTCLRSPACEYUV"), DDCKEYCAPS_SRCBLTCLRSPACEYUV},&lt;br /&gt;-    {TEXT("SRCBLTYUV"), DDCKEYCAPS_SRCBLTYUV},&lt;br /&gt;-    {TEXT("SRCOVERLAY"), DDCKEYCAPS_SRCOVERLAY},&lt;br /&gt;-    {TEXT("SRCOVERLAYCLRSPACE"), DDCKEYCAPS_SRCOVERLAYCLRSPACE},&lt;br /&gt;-    {TEXT("SRCOVERLAYCLRSPACEYUV"), DDCKEYCAPS_SRCOVERLAYCLRSPACEYUV},&lt;br /&gt;-    {TEXT("SRCOVERLAYONEACTIVE"), DDCKEYCAPS_SRCOVERLAYONEACTIVE},&lt;br /&gt;-    {TEXT("SRCOVERLAYYUV"), DDCKEYCAPS_SRCOVERLAYYUV}&lt;br /&gt;+    {TEXT("SRCBLTCLRSPACEYUV"), DDCKEYCAPS_SRCBLTCLRSPACEYUV },&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;-CAPSDEFSTYPE FXCapsDefs[MAX_BOXES] =&lt;br /&gt;-{&lt;br /&gt;-    { TEXT("BLTARITHSTRETCHY"), DDFXCAPS_BLTARITHSTRETCHY },&lt;br /&gt;-    { TEXT("BLTARITHSTRETCHYN"), DDFXCAPS_BLTARITHSTRETCHYN },&lt;br /&gt;-    { TEXT("BLTMIRRORLEFTRIGHT"), DDFXCAPS_BLTMIRRORLEFTRIGHT },&lt;br /&gt;-    { TEXT("BLTMIRRORUPDOWN"), DDFXCAPS_BLTMIRRORUPDOWN },&lt;br /&gt;-    { TEXT("BLTROTATION"), DDFXCAPS_BLTROTATION },&lt;br /&gt;-    { TEXT("BLTROTATION90"), DDFXCAPS_BLTROTATION90 },&lt;br /&gt;-    { TEXT("BLTSHRINKX"), DDFXCAPS_BLTSHRINKX },&lt;br /&gt;-    { TEXT("BLTSHRINKXN"), DDFXCAPS_BLTSHRINKXN },&lt;br /&gt;-    { TEXT("BLTSHRINKY"), DDFXCAPS_BLTSHRINKY },&lt;br /&gt;-    { TEXT("BLTSHRINKYN"), DDFXCAPS_BLTSHRINKYN },&lt;br /&gt;-    { TEXT("BLTSTRETCHX"), DDFXCAPS_BLTSTRETCHX },&lt;br /&gt;-    { TEXT("BLTSTRETCHXN"), DDFXCAPS_BLTSTRETCHXN },&lt;br /&gt;-    { TEXT("BLTSTRETCHY"), DDFXCAPS_BLTSTRETCHY },&lt;br /&gt;-    { TEXT("BLTSTRETCHYN"), DDFXCAPS_BLTSTRETCHYN },&lt;br /&gt;-    { TEXT("OVERLAYARITHSTRETCHY"), DDFXCAPS_OVERLAYARITHSTRETCHY },&lt;br /&gt;-    { TEXT("OVERLAYARITHSTRETCHYN"), DDFXCAPS_OVERLAYARITHSTRETCHYN },&lt;br /&gt;-    { TEXT("OVERLAYSHRINKX"), DDFXCAPS_OVERLAYSHRINKX },&lt;br /&gt;-    { TEXT("OVERLAYSHRINKXN"), DDFXCAPS_OVERLAYSHRINKXN },&lt;br /&gt;-    { TEXT("OVERLAYSHRINKY"), DDFXCAPS_OVERLAYSHRINKY },&lt;br /&gt;-    { TEXT("OVERLAYSHRINKYN"), DDFXCAPS_OVERLAYSHRINKYN },&lt;br /&gt;-    { TEXT("OVERLAYSTRETCHX"), DDFXCAPS_OVERLAYSTRETCHX },&lt;br /&gt;-    { TEXT("OVERLAYSTRETCHXN"), DDFXCAPS_OVERLAYSTRETCHXN },&lt;br /&gt;-    { TEXT("OVERLAYSTRETCHY"), DDFXCAPS_OVERLAYSTRETCHY },&lt;br /&gt;-    { TEXT("OVERLAYSTRETCHYN"), DDFXCAPS_OVERLAYSTRETCHYN },&lt;br /&gt;-    { TEXT("OVERLAYMIRRORLEFTRIGHT"), DDFXCAPS_OVERLAYMIRRORLEFTRIGHT },&lt;br /&gt;-    { TEXT("OVERLAYMIRRORUPDOWN"), DDFXCAPS_OVERLAYMIRRORUPDOWN },&lt;br /&gt;-};&lt;br /&gt;-&lt;br /&gt;CAPSDEFSTYPE PalCapsDefs[MAX_BOXES] =&lt;br /&gt;{&lt;br /&gt;-    {TEXT("1BIT"), DDPCAPS_1BIT},&lt;br /&gt;-    {TEXT("2BIT"), DDPCAPS_2BIT},&lt;br /&gt;-    {TEXT("4BIT"), DDPCAPS_4BIT},&lt;br /&gt;-    {TEXT("8BITENTRIES"), DDPCAPS_8BITENTRIES},&lt;br /&gt;-    {TEXT("8BIT"), DDPCAPS_8BIT},&lt;br /&gt;-    {TEXT("ALLOW256"), DDPCAPS_ALLOW256},&lt;br /&gt;-    {TEXT("INITIALIZE"), DDPCAPS_INITIALIZE},&lt;br /&gt;+    {TEXT("ALPHA"), DDPCAPS_ALPHA},&lt;br /&gt;    {TEXT("PRIMARYSURFACE"), DDPCAPS_PRIMARYSURFACE},&lt;br /&gt;-    {TEXT("PRIMARYSURFACELEFT"), DDPCAPS_PRIMARYSURFACELEFT},&lt;br /&gt;-    {TEXT("VSYNC"), DDPCAPS_VSYNC}&lt;br /&gt;-};&lt;br /&gt;+ };&lt;br /&gt;&lt;br /&gt;-CAPSDEFSTYPE SurfCapsDefs[MAX_BOXES] =&lt;br /&gt;+CAPSDEFSTYPE BltCapsDefs[MAX_BOXES] =&lt;br /&gt;{&lt;br /&gt;-    {TEXT("3DDEVICE"), DDSCAPS_3DDEVICE},&lt;br /&gt;-    {TEXT("ALPHA"), DDSCAPS_ALPHA},&lt;br /&gt;-    {TEXT("BACKBUFFER"), DDSCAPS_BACKBUFFER},&lt;br /&gt;-    {TEXT("COMPLEX"), DDSCAPS_COMPLEX},&lt;br /&gt;-    {TEXT("FLIP"), DDSCAPS_FLIP},&lt;br /&gt;-    {TEXT("FRONTBUFFER"), DDSCAPS_FRONTBUFFER},&lt;br /&gt;-    {TEXT("MIPMAP"), DDSCAPS_MIPMAP},&lt;br /&gt;-    {TEXT("OFFSCREENPLAIN"), DDSCAPS_OFFSCREENPLAIN},&lt;br /&gt;-    {TEXT("OVERLAY"), DDSCAPS_OVERLAY},&lt;br /&gt;-    {TEXT("PALETTE"), DDSCAPS_PALETTE},&lt;br /&gt;-    {TEXT("PRIMARYSURFACE"), DDSCAPS_PRIMARYSURFACE},&lt;br /&gt;-    {TEXT("PRIMARYSURFACELEFT"), DDSCAPS_PRIMARYSURFACELEFT},&lt;br /&gt;-    {TEXT("SYSTEMMEMORY"), DDSCAPS_SYSTEMMEMORY},&lt;br /&gt;-    {TEXT("TEXTURE"), DDSCAPS_TEXTURE},&lt;br /&gt;-    {TEXT("VIDEOMEMORY"), DDSCAPS_VIDEOMEMORY},&lt;br /&gt;-    {TEXT("VISIBLE"), DDSCAPS_VISIBLE},&lt;br /&gt;-    {TEXT("WRITEONLY"), DDSCAPS_WRITEONLY},&lt;br /&gt;-    {TEXT("ZBUFFER"), DDSCAPS_ZBUFFER}&lt;br /&gt;-};&lt;br /&gt;+    { TEXT("READSYSMEM"), DDBLTCAPS_READSYSMEM },&lt;br /&gt;+    { TEXT("WRITESYSMEM"), DDBLTCAPS_WRITESYSMEM },&lt;br /&gt;+    { TEXT("FOURCCTORGB"), DDBLTCAPS_FOURCCTORGB },&lt;br /&gt;+    { TEXT("COPYFOURCC"), DDBLTCAPS_COPYFOURCC },&lt;br /&gt;+    { TEXT("FILLFOURCC"), DDBLTCAPS_FILLFOURCC },&lt;br /&gt;+ };&lt;br /&gt;&lt;br /&gt;+CAPSDEFSTYPE AlphaCapsDefs[MAX_BOXES] =&lt;br /&gt;+{&lt;br /&gt;+    { TEXT("ALPHAPIXELS"), DDALPHACAPS_ALPHAPIXELS },&lt;br /&gt;+    { TEXT("PREMULT"), DDALPHACAPS_PREMULT },&lt;br /&gt;+    { TEXT("NONPREMULT"), DDALPHACAPS_NONPREMULT },&lt;br /&gt;+    { TEXT("ALPHAFILL"), DDALPHACAPS_ALPHAFILL },&lt;br /&gt;+    { TEXT("ALPHANEG"), DDALPHACAPS_ALPHANEG },&lt;br /&gt;+ };&lt;br /&gt;&lt;br /&gt;+CAPSDEFSTYPE OverlayCapsDefs[MAX_BOXES] =&lt;br /&gt;+{&lt;br /&gt;+    {TEXT("FLIP"), DDOVERLAYCAPS_FLIP},&lt;br /&gt;+    {TEXT("FOURCC"), DDOVERLAYCAPS_FOURCC},&lt;br /&gt;+    {TEXT("ZORDER"), DDOVERLAYCAPS_ZORDER},&lt;br /&gt;+    {TEXT("MIRRORLEFTRIGHT"), DDOVERLAYCAPS_MIRRORLEFTRIGHT},&lt;br /&gt;+    {TEXT("MIRRORUPDOWN"), DDOVERLAYCAPS_MIRRORUPDOWN},&lt;br /&gt;+    {TEXT("CKEYSRC"), DDOVERLAYCAPS_CKEYSRC},&lt;br /&gt;+    {TEXT("CKEYSRCCLRSPACE"), DDOVERLAYCAPS_CKEYSRCCLRSPACE},&lt;br /&gt;+    {TEXT("CKEYSRCCLRSPACEYUV"), DDOVERLAYCAPS_CKEYSRCCLRSPACEYUV},&lt;br /&gt;+    {TEXT("CKEYDEST"), DDOVERLAYCAPS_CKEYDEST},&lt;br /&gt;+    {TEXT("CKEYDESTCLRSPACE"), DDOVERLAYCAPS_CKEYDESTCLRSPACE},&lt;br /&gt;+    {TEXT("CKEYDESTCLRSPACEYUV"), DDOVERLAYCAPS_CKEYDESTCLRSPACEYUV},&lt;br /&gt;+    {TEXT("CKEYBOTH"), DDOVERLAYCAPS_CKEYBOTH},&lt;br /&gt;+    {TEXT("ALPHADEST"), DDOVERLAYCAPS_ALPHADEST},&lt;br /&gt;+    {TEXT("ALPHASRC"), DDOVERLAYCAPS_ALPHASRC},&lt;br /&gt;+    {TEXT("ALPHADESTNEG"), DDOVERLAYCAPS_ALPHADESTNEG},&lt;br /&gt;+    {TEXT("ALPHASRCNEG"), DDOVERLAYCAPS_ALPHASRCNEG},&lt;br /&gt;+    {TEXT("ALPHACONSTANT"), DDOVERLAYCAPS_ALPHACONSTANT},&lt;br /&gt;+    {TEXT("ALPHAPREMULT"), DDOVERLAYCAPS_ALPHAPREMULT},&lt;br /&gt;+    {TEXT("ALPHANONPREMULT"), DDOVERLAYCAPS_ALPHANONPREMULT},&lt;br /&gt;+    {TEXT("ALPHAANDKEYDEST"), DDOVERLAYCAPS_ALPHAANDKEYDEST},&lt;br /&gt;+    {TEXT("OVERLAYSUPPORT"), DDOVERLAYCAPS_OVERLAYSUPPORT},&lt;br /&gt;+ };&lt;br /&gt;&lt;br /&gt;+ CAPSDEFSTYPE MiscCapsDefs[MAX_BOXES] =&lt;br /&gt;+{&lt;br /&gt;+    {TEXT("READSCANLINE"), DDMISCCAPS_READSCANLINE},&lt;br /&gt;+    {TEXT("READMONITORFREQ"), DDMISCCAPS_READMONITORFREQ},&lt;br /&gt;+    {TEXT("READVBLANKSTATUS"), DDMISCCAPS_READVBLANKSTATUS},&lt;br /&gt;+    {TEXT("FLIPINTERVAL"), DDMISCCAPS_FLIPINTERVAL},&lt;br /&gt;+    {TEXT("FLIPODDEVEN"), DDMISCCAPS_FLIPODDEVEN},&lt;br /&gt;+    {TEXT("FLIPVSYNCWITHVBI"), DDMISCCAPS_FLIPVSYNCWITHVBI},&lt;br /&gt;+    {TEXT("COLORCONTROLOVERLAY"), DDMISCCAPS_COLORCONTROLOVERLAY},&lt;br /&gt;+    {TEXT("COLORCONTROLPRIMARY"), DDMISCCAPS_COLORCONTROLPRIMARY},&lt;br /&gt;+    {TEXT("GAMMACONTROLOVERLAY"), DDMISCCAPS_GAMMACONTROLOVERLAY},&lt;br /&gt;+    {TEXT("GAMMACONTROLPRIMARY"), DDMISCCAPS_GAMMACONTROLPRIMARY}&lt;br /&gt;+ };&lt;br /&gt;+&lt;br /&gt;+&lt;br /&gt;//*------------------------------------------------------------------------&lt;br /&gt;//| Dlg_OnCommand&lt;br /&gt;//*------------------------------------------------------------------------&lt;br /&gt;@@ -254,14 +206,16 @@&lt;br /&gt;    int i;&lt;br /&gt;    TCHAR szTitle[256];&lt;br /&gt;    static TCHAR *rgszCaps[] = {&lt;br /&gt;-        TEXT("Direct Draw Caps Bits"),&lt;br /&gt;        TEXT("Direct Draw Color Key Caps Bits"),&lt;br /&gt;-        TEXT("Direct Draw FX Caps Bits"),&lt;br /&gt;        TEXT("Direct Draw Palette Caps Bits"),&lt;br /&gt;-        TEXT("Direct Draw Surface Caps Bits")};&lt;br /&gt;+        TEXT("Direct Draw Blt Caps Bits"),&lt;br /&gt;+        TEXT("Direct Draw Alpha Caps Bits"),&lt;br /&gt;+        TEXT("Direct Draw Overlay Caps Bits"),&lt;br /&gt;+        TEXT("Direct Draw Misc Caps Bits")       &lt;br /&gt;+  };&lt;br /&gt;&lt;br /&gt;-    wsprintf(szTitle, TEXT("%s (%s)"), rgszCaps[Which%5],&lt;br /&gt;-            (Which &amp;lt; 5) ? TEXT("HAL") : TEXT("HEL"));&lt;br /&gt;+    wsprintf(szTitle, TEXT("%s (%s)"), rgszCaps[Which%6],&lt;br /&gt;+            (Which &amp;lt; 6) ? TEXT("HAL") : TEXT("HEL"));&lt;br /&gt;    SetWindowText(hwnd, szTitle);&lt;br /&gt;&lt;br /&gt;    ShowWindow(GetDlgItem(hwnd, IDC_RESTORE), SW_HIDE);&lt;br /&gt;@@ -285,11 +239,8 @@&lt;br /&gt;    return TRUE;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;-//*------------------------------------------------------------------------&lt;br /&gt;-//| ddCapsDlg_Proc&lt;br /&gt;-//*------------------------------------------------------------------------&lt;br /&gt;BOOL CALLBACK&lt;br /&gt;-ddCapsDlg_Proc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)&lt;br /&gt;+CKeyCapsDlg_Proc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)&lt;br /&gt;{&lt;br /&gt;    BOOL fProcessed = TRUE;&lt;br /&gt;&lt;br /&gt;@@ -306,11 +257,8 @@&lt;br /&gt;    return (fProcessed);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;-//*------------------------------------------------------------------------&lt;br /&gt;-//| CKeyCapsDlg_Proc&lt;br /&gt;-//*------------------------------------------------------------------------&lt;br /&gt;BOOL CALLBACK&lt;br /&gt;-CKeyCapsDlg_Proc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)&lt;br /&gt;+PalCapsDlg_Proc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)&lt;br /&gt;{&lt;br /&gt;    BOOL fProcessed = TRUE;&lt;br /&gt;&lt;br /&gt;@@ -327,15 +275,12 @@&lt;br /&gt;    return (fProcessed);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;-//*------------------------------------------------------------------------&lt;br /&gt;-//| SurfCapsDlg_Proc&lt;br /&gt;-//*------------------------------------------------------------------------&lt;br /&gt;BOOL CALLBACK&lt;br /&gt;-SurfCapsDlg_Proc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)&lt;br /&gt;+BltCapsDlg_Proc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)&lt;br /&gt;{&lt;br /&gt;    BOOL fProcessed = TRUE;&lt;br /&gt;&lt;br /&gt;-    Which = 4;&lt;br /&gt;+    Which = 2;&lt;br /&gt;    switch (uMsg)&lt;br /&gt;    {&lt;br /&gt;        HANDLE_MSG(hDlg, WM_INITDIALOG, Dlg_OnInitDialog);&lt;br /&gt;@@ -348,15 +293,12 @@&lt;br /&gt;    return (fProcessed);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;-//*------------------------------------------------------------------------&lt;br /&gt;-//| FXCapsDlg_Proc&lt;br /&gt;-//*------------------------------------------------------------------------&lt;br /&gt;BOOL CALLBACK&lt;br /&gt;-FXCapsDlg_Proc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)&lt;br /&gt;+AlphaCapsDlg_Proc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)&lt;br /&gt;{&lt;br /&gt;    BOOL fProcessed = TRUE;&lt;br /&gt;&lt;br /&gt;-    Which = 2;&lt;br /&gt;+    Which = 3;&lt;br /&gt;    switch (uMsg)&lt;br /&gt;    {&lt;br /&gt;        HANDLE_MSG(hDlg, WM_INITDIALOG, Dlg_OnInitDialog);&lt;br /&gt;@@ -370,15 +312,12 @@&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;-//*------------------------------------------------------------------------&lt;br /&gt;-//| PalCapsDlg_Proc&lt;br /&gt;-//*------------------------------------------------------------------------&lt;br /&gt;BOOL CALLBACK&lt;br /&gt;-PalCapsDlg_Proc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)&lt;br /&gt;+OverlayCapsDlg_Proc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)&lt;br /&gt;{&lt;br /&gt;    BOOL fProcessed = TRUE;&lt;br /&gt;&lt;br /&gt;-    Which = 3;&lt;br /&gt;+    Which = 4;&lt;br /&gt;    switch (uMsg)&lt;br /&gt;    {&lt;br /&gt;        HANDLE_MSG(hDlg, WM_INITDIALOG, Dlg_OnInitDialog);&lt;br /&gt;@@ -391,12 +330,8 @@&lt;br /&gt;    return (fProcessed);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;-&lt;br /&gt;-//*------------------------------------------------------------------------&lt;br /&gt;-//| HELddCapsDlg_Proc&lt;br /&gt;-//*------------------------------------------------------------------------&lt;br /&gt;BOOL CALLBACK&lt;br /&gt;-HELddCapsDlg_Proc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)&lt;br /&gt;+MiscCapsDlg_Proc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)&lt;br /&gt;{&lt;br /&gt;    BOOL fProcessed = TRUE;&lt;br /&gt;&lt;br /&gt;@@ -413,9 +348,7 @@&lt;br /&gt;    return (fProcessed);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;-//*------------------------------------------------------------------------&lt;br /&gt;-//| HELCKeyCapsDlg_Proc&lt;br /&gt;-//*------------------------------------------------------------------------&lt;br /&gt;+&lt;br /&gt;BOOL CALLBACK&lt;br /&gt;HELCKeyCapsDlg_Proc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)&lt;br /&gt;{&lt;br /&gt;@@ -434,15 +367,12 @@&lt;br /&gt;    return (fProcessed);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;-//*------------------------------------------------------------------------&lt;br /&gt;-//| HELSurfCapsDlg_Proc&lt;br /&gt;-//*------------------------------------------------------------------------&lt;br /&gt;BOOL CALLBACK&lt;br /&gt;-HELSurfCapsDlg_Proc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)&lt;br /&gt;+HELPalCapsDlg_Proc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)&lt;br /&gt;{&lt;br /&gt;    BOOL fProcessed = TRUE;&lt;br /&gt;&lt;br /&gt;-    Which = 9;&lt;br /&gt;+    Which = 7;&lt;br /&gt;    switch (uMsg)&lt;br /&gt;    {&lt;br /&gt;        HANDLE_MSG(hDlg, WM_INITDIALOG, Dlg_OnInitDialog);&lt;br /&gt;@@ -455,15 +385,12 @@&lt;br /&gt;    return (fProcessed);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;-//*------------------------------------------------------------------------&lt;br /&gt;-//| HELFXCapsDlg_Proc&lt;br /&gt;-//*------------------------------------------------------------------------&lt;br /&gt;BOOL CALLBACK&lt;br /&gt;-HELFXCapsDlg_Proc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)&lt;br /&gt;+HELBltCapsDlg_Proc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)&lt;br /&gt;{&lt;br /&gt;    BOOL fProcessed = TRUE;&lt;br /&gt;&lt;br /&gt;-    Which = 7;&lt;br /&gt;+    Which = 8;&lt;br /&gt;    switch (uMsg)&lt;br /&gt;    {&lt;br /&gt;        HANDLE_MSG(hDlg, WM_INITDIALOG, Dlg_OnInitDialog);&lt;br /&gt;@@ -476,16 +403,31 @@&lt;br /&gt;    return (fProcessed);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;+BOOL CALLBACK&lt;br /&gt;+HELAlphaCapsDlg_Proc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)&lt;br /&gt;+{&lt;br /&gt;+    BOOL fProcessed = TRUE;&lt;br /&gt;&lt;br /&gt;-//*------------------------------------------------------------------------&lt;br /&gt;-//| HELPalCapsDlg_Proc&lt;br /&gt;-//*------------------------------------------------------------------------&lt;br /&gt;+    Which = 9;&lt;br /&gt;+    switch (uMsg)&lt;br /&gt;+    {&lt;br /&gt;+        HANDLE_MSG(hDlg, WM_INITDIALOG, Dlg_OnInitDialog);&lt;br /&gt;+        HANDLE_MSG(hDlg, WM_COMMAND, Dlg_OnCommand);&lt;br /&gt;+&lt;br /&gt;+        default:&lt;br /&gt;+            fProcessed = FALSE;&lt;br /&gt;+            break;&lt;br /&gt;+    }&lt;br /&gt;+    return (fProcessed);&lt;br /&gt;+}&lt;br /&gt;+&lt;br /&gt;+&lt;br /&gt;BOOL CALLBACK&lt;br /&gt;-HELPalCapsDlg_Proc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)&lt;br /&gt;+HELOverlayCapsDlg_Proc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)&lt;br /&gt;{&lt;br /&gt;    BOOL fProcessed = TRUE;&lt;br /&gt;&lt;br /&gt;-    Which = 8;&lt;br /&gt;+    Which = 10;&lt;br /&gt;    switch (uMsg)&lt;br /&gt;    {&lt;br /&gt;        HANDLE_MSG(hDlg, WM_INITDIALOG, Dlg_OnInitDialog);&lt;br /&gt;@@ -498,7 +440,24 @@&lt;br /&gt;    return (fProcessed);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;+BOOL CALLBACK&lt;br /&gt;+HELMiscCapsDlg_Proc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)&lt;br /&gt;+{&lt;br /&gt;+    BOOL fProcessed = TRUE;&lt;br /&gt;&lt;br /&gt;+    Which = 11;&lt;br /&gt;+    switch (uMsg)&lt;br /&gt;+    {&lt;br /&gt;+        HANDLE_MSG(hDlg, WM_INITDIALOG, Dlg_OnInitDialog);&lt;br /&gt;+        HANDLE_MSG(hDlg, WM_COMMAND, Dlg_OnCommand);&lt;br /&gt;+&lt;br /&gt;+        default:&lt;br /&gt;+            fProcessed = FALSE;&lt;br /&gt;+            break;&lt;br /&gt;+    }&lt;br /&gt;+    return (fProcessed);&lt;br /&gt;+}&lt;br /&gt;+&lt;br /&gt;//*------------------------------------------------------------------------&lt;br /&gt;//| DDEnumCallback&lt;br /&gt;//*------------------------------------------------------------------------&lt;br /&gt;@@ -539,7 +498,7 @@&lt;br /&gt;//*------------------------------------------------------------------------&lt;br /&gt;static int  gCurMode = 0;&lt;br /&gt;&lt;br /&gt;-DWORD DDAPI&lt;br /&gt;+DWORD CALLBACK&lt;br /&gt;EnumModesCallback(LPDDSURFACEDESC pddsd, LPVOID context)&lt;br /&gt;{&lt;br /&gt;    Modes[ModeCnt].dwWidth = pddsd-&amp;gt;dwWidth;&lt;br /&gt;@@ -568,6 +527,8 @@&lt;br /&gt;//|         nCmdShow      - Integer value specifying how to start app.,&lt;br /&gt;//|                            (Iconic [7] or Normal [1,5])&lt;br /&gt;//*------------------------------------------------------------------------&lt;br /&gt;+typedef HRESULT (WINAPI * LPDIRECTDRAWENUMERATEEX)(LPDDENUMCALLBACKEX lpCallback, LPVOID lpContext, DWORD dwFlags);&lt;br /&gt;+&lt;br /&gt;int WINAPI&lt;br /&gt;WinMain(HINSTANCE hInstance,&lt;br /&gt;        HINSTANCE hPrevInstance,&lt;br /&gt;@@ -586,22 +547,22 @@&lt;br /&gt;&lt;br /&gt;    // You need to do a GetModuleHandle and GetProcAddress in order to get the&lt;br /&gt;    // DirectDrawEnumerateEx&lt;br /&gt;-    hDDrawDLL = GetModuleHandle(TEXT("DDRAW"));&lt;br /&gt;+    hDDrawDLL = LoadLibrary(TEXT("DDRAW.dll"));&lt;br /&gt;    if (!hDDrawDLL)&lt;br /&gt;    {&lt;br /&gt;        OutputDebugString(TEXT("LoadLibrary() failed - ddcaps: Can't list display modes"));&lt;br /&gt;        return (-1);&lt;br /&gt;    }&lt;br /&gt;    pDirectDrawEnumerateEx = (LPDIRECTDRAWENUMERATEEX )&lt;br /&gt;-        GetProcAddress(hDDrawDLL,TEXT("DirectDrawEnumerateExW"));&lt;br /&gt;+        GetProcAddress(hDDrawDLL,TEXT("DirectDrawEnumerateEx"));&lt;br /&gt;&lt;br /&gt;    if (pDirectDrawEnumerateEx)&lt;br /&gt;        pDirectDrawEnumerateEx( DDEnumCallbackEx, (LPVOID) NULL,&lt;br /&gt;                                DDENUM_ATTACHEDSECONDARYDEVICES |&lt;br /&gt;-                                DDENUM_DETACHEDSECONDARYDEVICES |&lt;br /&gt;-                                DDENUM_NONDISPLAYDEVICES);&lt;br /&gt;+                                DDENUM_DETACHEDSECONDARYDEVICES&lt;br /&gt;+                                );&lt;br /&gt;    else    // Old DirectDraw, so do it the old way&lt;br /&gt;-        DirectDrawEnumerate(DDEnumCallback, NULL);&lt;br /&gt;+     MessageBox(NULL,TEXT("EnumerateEx Call Fail"),TEXT("Error"),MB_OK);&lt;br /&gt;&lt;br /&gt;    ddrval = DirectDrawCreate(gpSelectedDriverGUID, &amp;amp;lpDD, NULL);&lt;br /&gt;    if (ddrval != DD_OK)&lt;br /&gt;@@ -635,35 +596,41 @@&lt;br /&gt;&lt;br /&gt;    lpDD-&amp;gt;lpVtbl-&amp;gt;GetCaps(lpDD, &amp;amp;ddcapsHAL, &amp;amp;ddcapsHEL);&lt;br /&gt;&lt;br /&gt;-    gCaps[0].caps = &amp;amp;(ddcapsHAL.dwCaps);&lt;br /&gt;-    gCaps[0].defs = ddCapsDefs;&lt;br /&gt;+    gCaps[0].caps = &amp;amp;(ddcapsHAL.dwCKeyCaps);&lt;br /&gt;+    gCaps[0].defs = CKeyCapsDefs;&lt;br /&gt;&lt;br /&gt;-    gCaps[1].caps = &amp;amp;(ddcapsHAL.dwCKeyCaps);&lt;br /&gt;-    gCaps[1].defs = CKeyCapsDefs;&lt;br /&gt;+    gCaps[1].caps = &amp;amp;(ddcapsHAL.dwPalCaps);&lt;br /&gt;+    gCaps[1].defs = PalCapsDefs;&lt;br /&gt;&lt;br /&gt;-    gCaps[2].caps = &amp;amp;(ddcapsHAL.dwFXCaps);&lt;br /&gt;-    gCaps[2].defs = FXCapsDefs;&lt;br /&gt;+    gCaps[2].caps = &amp;amp;(ddcapsHAL.dwBltCaps);&lt;br /&gt;+    gCaps[2].defs = BltCapsDefs;&lt;br /&gt;&lt;br /&gt;-    gCaps[3].caps = &amp;amp;(ddcapsHAL.dwPalCaps);&lt;br /&gt;-    gCaps[3].defs = PalCapsDefs;&lt;br /&gt;+    gCaps[3].caps = &amp;amp;(ddcapsHAL.dwAlphaCaps);&lt;br /&gt;+    gCaps[3].defs = AlphaCapsDefs;&lt;br /&gt;&lt;br /&gt;-    gCaps[4].caps = &amp;amp;(ddcapsHAL.ddsCaps.dwCaps);&lt;br /&gt;-    gCaps[4].defs = SurfCapsDefs;&lt;br /&gt;+    gCaps[4].caps = &amp;amp;(ddcapsHAL.dwOverlayCaps);&lt;br /&gt;+    gCaps[4].defs = OverlayCapsDefs;&lt;br /&gt;&lt;br /&gt;-    gCaps[5].caps = &amp;amp;(ddcapsHEL.dwCaps);&lt;br /&gt;-    gCaps[5].defs = ddCapsDefs;&lt;br /&gt;+    gCaps[5].caps = &amp;amp;(ddcapsHAL.dwMiscCaps);&lt;br /&gt;+    gCaps[5].defs = MiscCapsDefs;&lt;br /&gt;&lt;br /&gt;    gCaps[6].caps = &amp;amp;(ddcapsHEL.dwCKeyCaps);&lt;br /&gt;    gCaps[6].defs = CKeyCapsDefs;&lt;br /&gt;&lt;br /&gt;-    gCaps[7].caps = &amp;amp;(ddcapsHEL.dwFXCaps);&lt;br /&gt;-    gCaps[7].defs = FXCapsDefs;&lt;br /&gt;+    gCaps[7].caps = &amp;amp;(ddcapsHEL.dwPalCaps);&lt;br /&gt;+    gCaps[7].defs = PalCapsDefs;&lt;br /&gt;&lt;br /&gt;-    gCaps[8].caps = &amp;amp;(ddcapsHEL.dwPalCaps);&lt;br /&gt;-    gCaps[8].defs = PalCapsDefs;&lt;br /&gt;+    gCaps[8].caps = &amp;amp;(ddcapsHEL.dwBltCaps);&lt;br /&gt;+    gCaps[8].defs = BltCapsDefs;&lt;br /&gt;&lt;br /&gt;-    gCaps[9].caps = &amp;amp;(ddcapsHEL.ddsCaps.dwCaps);&lt;br /&gt;-    gCaps[9].defs = SurfCapsDefs;&lt;br /&gt;+    gCaps[9].caps = &amp;amp;(ddcapsHEL.dwAlphaCaps);&lt;br /&gt;+    gCaps[9].defs = AlphaCapsDefs;&lt;br /&gt;+&lt;br /&gt;+    gCaps[10].caps = &amp;amp;(ddcapsHEL.dwOverlayCaps);&lt;br /&gt;+    gCaps[10].defs = OverlayCapsDefs;&lt;br /&gt;+&lt;br /&gt;+    gCaps[11].caps = &amp;amp;(ddcapsHEL.dwMiscCaps);&lt;br /&gt;+    gCaps[11].defs = MiscCapsDefs;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;@@ -794,56 +761,63 @@&lt;br /&gt;                    DialogBox(ghInstance, TEXT("About"), hWnd, (DLGPROC)AboutDlgProc);&lt;br /&gt;                    break;&lt;br /&gt;&lt;br /&gt;-                case ID_VIEW_DRIVERCAPS:&lt;br /&gt;-                    CreateDialog(ghInstance, MAKEINTRESOURCE(IDD_DIALOG1),&lt;br /&gt;-                                 NULL, ddCapsDlg_Proc);&lt;br /&gt;-                    break;&lt;br /&gt;-&lt;br /&gt;+&lt;br /&gt;                case ID_VIEW_DRIVERCOLORKEYCAPS:&lt;br /&gt;                    CreateDialog(ghInstance, MAKEINTRESOURCE(IDD_DIALOG1),&lt;br /&gt;                                 NULL, CKeyCapsDlg_Proc);&lt;br /&gt;                    break;&lt;br /&gt;&lt;br /&gt;-                case ID_VIEW_DRIVERFXCAPS:&lt;br /&gt;+                case ID_VIEW_DRIVERPALETTECAPS:&lt;br /&gt;                    CreateDialog(ghInstance, MAKEINTRESOURCE(IDD_DIALOG1),&lt;br /&gt;-                                 NULL, FXCapsDlg_Proc);&lt;br /&gt;+                                 NULL, PalCapsDlg_Proc);&lt;br /&gt;                    break;&lt;br /&gt;&lt;br /&gt;-                case ID_VIEW_DRIVERPALETTECAPS:&lt;br /&gt;+                case ID_VIEW_DRIVERBLTCAPS:&lt;br /&gt;                    CreateDialog(ghInstance, MAKEINTRESOURCE(IDD_DIALOG1),&lt;br /&gt;-                                 NULL, PalCapsDlg_Proc);&lt;br /&gt;+                                 NULL, BltCapsDlg_Proc);&lt;br /&gt;                    break;&lt;br /&gt;&lt;br /&gt;-                case ID_VIEW_DRIVERSURFACECAPS:&lt;br /&gt;+                case ID_VIEW_DRIVERALPHACAPS:&lt;br /&gt;                    CreateDialog(ghInstance, MAKEINTRESOURCE(IDD_DIALOG1),&lt;br /&gt;-                                 NULL, SurfCapsDlg_Proc);&lt;br /&gt;+                                 NULL, AlphaCapsDlg_Proc);&lt;br /&gt;                    break;&lt;br /&gt;&lt;br /&gt;-                case ID_VIEW_HELCAPS:&lt;br /&gt;+                case ID_VIEW_DRIVEROVERLAYCAPS:&lt;br /&gt;                    CreateDialog(ghInstance, MAKEINTRESOURCE(IDD_DIALOG1),&lt;br /&gt;-                                 NULL, HELddCapsDlg_Proc);&lt;br /&gt;+                                 NULL, OverlayCapsDlg_Proc);&lt;br /&gt;                    break;&lt;br /&gt;+                   &lt;br /&gt;+                case ID_VIEW_DRIVERMISCCAPS:&lt;br /&gt;+                    CreateDialog(ghInstance, MAKEINTRESOURCE(IDD_DIALOG1),&lt;br /&gt;+                                 NULL, OverlayCapsDlg_Proc);&lt;br /&gt;+                    break;&lt;br /&gt;&lt;br /&gt;+//----------------&lt;br /&gt;                case ID_VIEW_HELCOLORKEYCAPS:&lt;br /&gt;                    CreateDialog(ghInstance, MAKEINTRESOURCE(IDD_DIALOG1),&lt;br /&gt;                                 NULL, HELCKeyCapsDlg_Proc);&lt;br /&gt;                    break;&lt;br /&gt;&lt;br /&gt;-                case ID_VIEW_HELFXCAPS:&lt;br /&gt;-                    CreateDialog(ghInstance, MAKEINTRESOURCE(IDD_DIALOG1),&lt;br /&gt;-                                 NULL, HELFXCapsDlg_Proc);&lt;br /&gt;-                    break;&lt;br /&gt;-&lt;br /&gt;                case ID_VIEW_HELPALETTECAPS:&lt;br /&gt;                    CreateDialog(ghInstance, MAKEINTRESOURCE(IDD_DIALOG1),&lt;br /&gt;                                 NULL, HELPalCapsDlg_Proc);&lt;br /&gt;                    break;&lt;br /&gt;-&lt;br /&gt;-                case ID_VIEW_HELSURFACECAPS:&lt;br /&gt;+                case ID_VIEW_HELBLTCAPS:&lt;br /&gt;                    CreateDialog(ghInstance, MAKEINTRESOURCE(IDD_DIALOG1),&lt;br /&gt;-                                 NULL, HELSurfCapsDlg_Proc);&lt;br /&gt;+                                 NULL, HELBltCapsDlg_Proc);&lt;br /&gt;                    break;&lt;br /&gt;-&lt;br /&gt;+                case ID_VIEW_HELALPHACAPS:&lt;br /&gt;+                    CreateDialog(ghInstance, MAKEINTRESOURCE(IDD_DIALOG1),&lt;br /&gt;+                                 NULL, HELAlphaCapsDlg_Proc);&lt;br /&gt;+                    break;&lt;br /&gt;+                case ID_VIEW_HELOVERLAYCAPS:&lt;br /&gt;+                    CreateDialog(ghInstance, MAKEINTRESOURCE(IDD_DIALOG1),&lt;br /&gt;+                                 NULL, HELOverlayCapsDlg_Proc);&lt;br /&gt;+                    break;&lt;br /&gt;+                case ID_VIEW_HELMISCCAPS:&lt;br /&gt;+                    CreateDialog(ghInstance, MAKEINTRESOURCE(IDD_DIALOG1),&lt;br /&gt;+                                 NULL, HELMiscCapsDlg_Proc);&lt;br /&gt;+                    break;&lt;br /&gt;                case ID_PRINTF_LISTBOX:&lt;br /&gt;                    if (HIWORD(wParam) == LBN_DBLCLK)&lt;br /&gt;                    {&lt;br /&gt;@@ -852,18 +826,18 @@&lt;br /&gt;                        if (sel &amp;lt; (UINT)ModeCnt)&lt;br /&gt;                        {&lt;br /&gt;                            ddrval = lpDD-&amp;gt;lpVtbl-&amp;gt;SetCooperativeLevel(lpDD,&lt;br /&gt;-                                                        hWnd,&lt;br /&gt;-                                                        DDSCL_EXCLUSIVE |&lt;br /&gt;-                                                        DDSCL_NOWINDOWCHANGES |&lt;br /&gt;+              hWnd,&lt;br /&gt;+                                                        DDSCL_NORMAL |&lt;br /&gt;                                                        DDSCL_FULLSCREEN);&lt;br /&gt;                            if (ddrval == DD_OK)&lt;br /&gt;                            {&lt;br /&gt;                                ddrval = lpDD-&amp;gt;lpVtbl-&amp;gt;SetDisplayMode(lpDD,&lt;br /&gt;-                                                        Modes[sel].dwWidth,&lt;br /&gt;-                                                        Modes[sel].dwHeight,&lt;br /&gt;-                                                        Modes[sel].dwBPP);&lt;br /&gt;+              Modes[sel].dwWidth,&lt;br /&gt;+              Modes[sel].dwHeight,&lt;br /&gt;+                                                        Modes[sel].dwBPP,0,0);&lt;br /&gt;                                ddrval = lpDD-&amp;gt;lpVtbl-&amp;gt;SetCooperativeLevel(lpDD,&lt;br /&gt;-                                                        hWnd, DDSCL_NORMAL);&lt;br /&gt;+              hWnd,&lt;br /&gt;+              DDSCL_NORMAL);&lt;br /&gt;                            }&lt;br /&gt;                        }&lt;br /&gt;                    }&lt;br /&gt;Index: ddcaps.rc&lt;br /&gt;===================================================================&lt;br /&gt;--- ddcaps.rc (revision 23142)&lt;br /&gt;+++ ddcaps.rc (working copy)&lt;br /&gt;@@ -66,19 +66,21 @@&lt;br /&gt;    END&lt;br /&gt;    POPUP "&amp;amp;Driver"&lt;br /&gt;    BEGIN&lt;br /&gt;-        MENUITEM "Driver &amp;amp;Caps",                 ID_VIEW_DRIVERCAPS&lt;br /&gt;        MENUITEM "Driver C&amp;amp;olor Key Caps",       ID_VIEW_DRIVERCOLORKEYCAPS&lt;br /&gt;-        MENUITEM "Driver &amp;amp;FX Caps",              ID_VIEW_DRIVERFXCAPS&lt;br /&gt;        MENUITEM "Driver &amp;amp;Palette Caps",         ID_VIEW_DRIVERPALETTECAPS&lt;br /&gt;-        MENUITEM "Driver &amp;amp;Surface Caps",         ID_VIEW_DRIVERSURFACECAPS&lt;br /&gt;+        MENUITEM "Driver &amp;amp;Blt Caps",             ID_VIEW_DRIVERBLTCAPS&lt;br /&gt;+        MENUITEM "Driver &amp;amp;Alpha Caps",           ID_VIEW_DRIVERALPHACAPS&lt;br /&gt;+        MENUITEM "Driver &amp;amp;Overlay Caps",         ID_VIEW_DRIVEROVERLAYCAPS&lt;br /&gt;+        MENUITEM "Driver &amp;amp;Misc Caps",            ID_VIEW_DRIVERMISCCAPS&lt;br /&gt;    END&lt;br /&gt;    POPUP "&amp;amp;HEL"&lt;br /&gt;    BEGIN&lt;br /&gt;-        MENUITEM "HEL &amp;amp;Caps",                    ID_VIEW_HELCAPS&lt;br /&gt;        MENUITEM "HEL C&amp;amp;olor Key Caps",          ID_VIEW_HELCOLORKEYCAPS&lt;br /&gt;-        MENUITEM "HEL &amp;amp;FX Caps",                 ID_VIEW_HELFXCAPS&lt;br /&gt;        MENUITEM "HEL &amp;amp;Palette Caps",            ID_VIEW_HELPALETTECAPS&lt;br /&gt;-        MENUITEM "HEL &amp;amp;Surface Caps",            ID_VIEW_HELSURFACECAPS&lt;br /&gt;+        MENUITEM "HEL &amp;amp;Blt Caps",                ID_VIEW_HELBLTCAPS&lt;br /&gt;+        MENUITEM "HEL &amp;amp;Alpha Caps",              ID_VIEW_HELALPHACAPS&lt;br /&gt;+        MENUITEM "HEL &amp;amp;Overlay Caps",            ID_VIEW_HELOVERLAYCAPS&lt;br /&gt;+        MENUITEM "HEL &amp;amp;Misc Caps",               ID_VIEW_HELMISCCAPS&lt;br /&gt;    END&lt;br /&gt;END&lt;br /&gt;&lt;br /&gt;@@ -228,7 +230,7 @@&lt;br /&gt;BEGIN&lt;br /&gt;    DEFPUSHBUTTON   "&amp;amp;OK",IDOK,132,58,50,14&lt;br /&gt;    LTEXT           "DirectDraw Caps Viewer for Windows CE",-1,15,14,165,8&lt;br /&gt;-    LTEXT           "Copyright ?1995-2003 Microsoft Corporation",-1,15,28,&lt;br /&gt;+    LTEXT           "Copyright ?1995-2003 Microsoft Corporation",-1,15,28,&lt;br /&gt;                    165,8&lt;br /&gt;    LTEXT           "Version",-1,15,42,24,8&lt;br /&gt;    LTEXT           "1.0",-1,40,42,66,8&lt;br /&gt;Index: lbprintf.c&lt;br /&gt;===================================================================&lt;br /&gt;--- lbprintf.c (revision 23142)&lt;br /&gt;+++ lbprintf.c (working copy)&lt;br /&gt;@@ -49,102 +49,8 @@&lt;br /&gt;//&lt;br /&gt;//  Error string table&lt;br /&gt;//&lt;br /&gt;-static ERRLIST elErrors[] =&lt;br /&gt;-{&lt;br /&gt;-    { DD_OK                     ,TEXT("DD_OK") },&lt;br /&gt;-    { DDERR_ALREADYINITIALIZED  ,TEXT("DDERR_ALREADYINITIALIZED")},&lt;br /&gt;-    { DDERR_CANNOTATTACHSURFACE ,TEXT("DDERR_CANNOTATTACHSURFACE")},&lt;br /&gt;-    { DDERR_CANNOTDETACHSURFACE ,TEXT("DDERR_CANNOTDETACHSURFACE")},&lt;br /&gt;-    { DDERR_CURRENTLYNOTAVAIL   ,TEXT("DDERR_CURRENTLYNOTAVAIL")},&lt;br /&gt;-    { DDERR_EXCEPTION           ,TEXT("DDERR_EXCEPTION")},&lt;br /&gt;-    { DDERR_GENERIC             ,TEXT("DDERR_GENERIC")},&lt;br /&gt;-    { DDERR_HEIGHTALIGN         ,TEXT("DDERR_HEIGHTALIGN")},&lt;br /&gt;-    { DDERR_INCOMPATIBLEPRIMARY ,TEXT("DDERR_INCOMPATIBLEPRIMARY")},&lt;br /&gt;-    { DDERR_INVALIDCAPS         ,TEXT("DDERR_INVALIDCAPS")},&lt;br /&gt;-    { DDERR_INVALIDCLIPLIST     ,TEXT("DDERR_INVALIDCLIPLIST")},&lt;br /&gt;-    { DDERR_INVALIDMODE         ,TEXT("DDERR_INVALIDMODE")},&lt;br /&gt;-    { DDERR_INVALIDOBJECT       ,TEXT("DDERR_INVALIDOBJECT")},&lt;br /&gt;-    { DDERR_INVALIDPARAMS       ,TEXT("DDERR_INVALIDPARAMS")},&lt;br /&gt;-    { DDERR_INVALIDPIXELFORMAT  ,TEXT("DDERR_INVALIDPIXELFORMAT")},&lt;br /&gt;-    { DDERR_INVALIDRECT         ,TEXT("DDERR_INVALIDRECT")},&lt;br /&gt;-    { DDERR_LOCKEDSURFACES      ,TEXT("DDERR_LOCKEDSURFACES")},&lt;br /&gt;-    { DDERR_NO3D                ,TEXT("DDERR_NO3D")},&lt;br /&gt;-    { DDERR_NOALPHAHW           ,TEXT("DDERR_NOALPHAHW")},&lt;br /&gt;-    { DDERR_NOCLIPLIST          ,TEXT("DDERR_NOCLIPLIST")},&lt;br /&gt;-    { DDERR_NOCOLORCONVHW       ,TEXT("DDERR_NOCOLORCONVHW")},&lt;br /&gt;-    { DDERR_NOCOOPERATIVELEVELSET   ,TEXT("DDERR_NOCOOPERATIVELEVELSET")},&lt;br /&gt;-    { DDERR_NOCOLORKEY          ,TEXT("DDERR_NOCOLORKEY")},&lt;br /&gt;-    { DDERR_NOCOLORKEYHW        ,TEXT("DDERR_NOCOLORKEYHW")},&lt;br /&gt;-    { DDERR_NOEXCLUSIVEMODE     ,TEXT("DDERR_NOEXCLUSIVEMODE")},&lt;br /&gt;-    { DDERR_NOFLIPHW            ,TEXT("DDERR_NOFLIPHW")},&lt;br /&gt;-    { DDERR_NOGDI               ,TEXT("DDERR_NOGDI")},&lt;br /&gt;-    { DDERR_NOMIRRORHW          ,TEXT("DDERR_NOMIRRORHW")},&lt;br /&gt;-    { DDERR_NOTFOUND            ,TEXT("DDERR_NOTFOUND")},&lt;br /&gt;-    { DDERR_NOOVERLAYHW         ,TEXT("DDERR_NOOVERLAYHW")},&lt;br /&gt;-    { DDERR_NORASTEROPHW        ,TEXT("DDERR_NORASTEROPHW")},&lt;br /&gt;-    { DDERR_NOROTATIONHW        ,TEXT("DDERR_NOROTATIONHW")},&lt;br /&gt;-    { DDERR_NOSTRETCHHW         ,TEXT("DDERR_NOSTRETCHHW")},&lt;br /&gt;-    { DDERR_NOT4BITCOLOR        ,TEXT("DDERR_NOT4BITCOLOR")},&lt;br /&gt;-    { DDERR_NOT4BITCOLORINDEX   ,TEXT("DDERR_NOT4BITCOLORINDEX")},&lt;br /&gt;-    { DDERR_NOT8BITCOLOR        ,TEXT("DDERR_NOT8BITCOLOR")},&lt;br /&gt;-    { DDERR_NOTEXTUREHW         ,TEXT("DDERR_NOTEXTUREHW")},&lt;br /&gt;-    { DDERR_NOVSYNCHW           ,TEXT("DDERR_NOVSYNCHW")},&lt;br /&gt;-    { DDERR_NOZBUFFERHW         ,TEXT("DDERR_NOZBUFFERHW")},&lt;br /&gt;-    { DDERR_NOZOVERLAYHW        ,TEXT("DDERR_NOZOVERLAYHW")},&lt;br /&gt;-    { DDERR_OUTOFCAPS           ,TEXT("DDERR_OUTOFCAPS")},&lt;br /&gt;-    { DDERR_OUTOFMEMORY         ,TEXT("DDERR_OUTOFMEMORY")},&lt;br /&gt;-    { DDERR_OUTOFVIDEOMEMORY    ,TEXT("DDERR_OUTOFVIDEOMEMORY")},&lt;br /&gt;-    { DDERR_OVERLAYCANTCLIP     ,TEXT("DDERR_OVERLAYCANTCLIP")},&lt;br /&gt;-    { DDERR_OVERLAYCOLORKEYONLYONEACTIVE,TEXT("DDERR_OVERLAYCOLORKEYONLYONEACTIVE")},&lt;br /&gt;-    { DDERR_PALETTEBUSY         ,TEXT("DDERR_PALETTEBUSY")},&lt;br /&gt;-    { DDERR_COLORKEYNOTSET      ,TEXT("DDERR_COLORKEYNOTSET")},&lt;br /&gt;-    { DDERR_SURFACEALREADYATTACHED  ,TEXT("DDERR_SURFACEALREADYATTACHED")},&lt;br /&gt;-    { DDERR_SURFACEALREADYDEPENDENT ,TEXT("DDERR_SURFACEALREADYDEPENDENT")},&lt;br /&gt;-    { DDERR_SURFACEBUSY         ,TEXT("DDERR_SURFACEBUSY")},&lt;br /&gt;-    { DDERR_SURFACEISOBSCURED   ,TEXT("DDERR_SURFACEISOBSCURED")},&lt;br /&gt;-    { DDERR_SURFACELOST         ,TEXT("DDERR_SURFACELOST")},&lt;br /&gt;-    { DDERR_SURFACENOTATTACHED  ,TEXT("DDERR_SURFACENOTATTACHED")},&lt;br /&gt;-    { DDERR_TOOBIGHEIGHT        ,TEXT("DDERR_TOOBIGHEIGHT")},&lt;br /&gt;-    { DDERR_TOOBIGSIZE          ,TEXT("DDERR_TOOBIGSIZE")},&lt;br /&gt;-    { DDERR_TOOBIGWIDTH         ,TEXT("DDERR_TOOBIGWIDTH")},&lt;br /&gt;-    { DDERR_UNSUPPORTED         ,TEXT("DDERR_UNSUPPORTED")},&lt;br /&gt;-    { DDERR_UNSUPPORTEDFORMAT   ,TEXT("DDERR_UNSUPPORTEDFORMAT")},&lt;br /&gt;-    { DDERR_UNSUPPORTEDMASK     ,TEXT("DDERR_UNSUPPORTEDMASK")},&lt;br /&gt;-    { DDERR_VERTICALBLANKINPROGRESS ,TEXT("DDERR_VERTICALBLANKINPROGRESS")},&lt;br /&gt;-    { DDERR_WASSTILLDRAWING     ,TEXT("DDERR_WASSTILLDRAWING")},&lt;br /&gt;-    { DDERR_XALIGN              ,TEXT("DDERR_XALIGN")},&lt;br /&gt;-    { DDERR_INVALIDDIRECTDRAWGUID   ,TEXT("DDERR_INVALIDDIRECTDRAWGUID")},&lt;br /&gt;-    { DDERR_DIRECTDRAWALREADYCREATED    ,TEXT("DDERR_DIRECTDRAWALREADYCREATED")},&lt;br /&gt;-    { DDERR_NODIRECTDRAWHW      ,TEXT("DDERR_NODIRECTDRAWHW")},&lt;br /&gt;-    { DDERR_PRIMARYSURFACEALREADYEXISTS ,TEXT("DDERR_PRIMARYSURFACEALREADYEXISTS")},&lt;br /&gt;-    { DDERR_NOEMULATION         ,TEXT("DDERR_NOEMULATION")},&lt;br /&gt;-    { DDERR_REGIONTOOSMALL      ,TEXT("DDERR_REGIONTOOSMALL")},&lt;br /&gt;-    { DDERR_CLIPPERISUSINGHWND  ,TEXT("DDERR_CLIPERISUSINGHWND")},&lt;br /&gt;-    { DDERR_NOCLIPPERATTACHED   ,TEXT("DDERR_NOCLIPPERATTACHED")},&lt;br /&gt;-    { DDERR_NOHWND              ,TEXT("DDERR_NOHWND")},&lt;br /&gt;-    { DDERR_HWNDSUBCLASSED      ,TEXT("DDERR_HWNDSUBCLASSED")},&lt;br /&gt;-    { DDERR_HWNDALREADYSET      ,TEXT("DDERR_HWNDALREADYSET")},&lt;br /&gt;-    { DDERR_NOPALETTEATTACHED   ,TEXT("DDERR_NOPALETTEATTACHED")},&lt;br /&gt;-    { DDERR_NOPALETTEHW         ,TEXT("DDERR_NOPALETTEHW")},&lt;br /&gt;-    { DDERR_BLTFASTCANTCLIP     ,TEXT("DDERR_BLTFASTCANTCLIP")},&lt;br /&gt;-    { DDERR_NOBLTHW             ,TEXT("DDERR_NOBLTHW")},&lt;br /&gt;-    { DDERR_NODDROPSHW          ,TEXT("DDERR_NODDROPSHW")},&lt;br /&gt;-    { DDERR_OVERLAYNOTVISIBLE   ,TEXT("DDERR_OVERLAYNOTVISIBLE")},&lt;br /&gt;-    { DDERR_NOOVERLAYDEST       ,TEXT("DDERR_NOOVERLAYDEST")},&lt;br /&gt;-    { DDERR_INVALIDPOSITION     ,TEXT("DDERR_INVALIDPOSITION")},&lt;br /&gt;-    { DDERR_NOTAOVERLAYSURFACE      ,TEXT("DDERR_NOTAOVERLAYSURFACE")},&lt;br /&gt;-    { DDERR_EXCLUSIVEMODEALREADYSET ,TEXT("DDERR_EXCLUSIVEMODEALREADYSET")},&lt;br /&gt;-    { DDERR_NOTFLIPPABLE        ,TEXT("DDERR_NOTFLIPPABLE")},&lt;br /&gt;-    { DDERR_CANTDUPLICATE       ,TEXT("DDERR_CANTDUPLICATE")},&lt;br /&gt;-    { DDERR_NOTLOCKED           ,TEXT("DDERR_NOTLOCKED")},&lt;br /&gt;-    { DDERR_CANTCREATEDC        ,TEXT("DDERR_CANTCREATEDC")},&lt;br /&gt;-    { DDERR_NODC                ,TEXT("DDERR_NODC")},&lt;br /&gt;-    { DDERR_WRONGMODE           ,TEXT("DDERR_WRONGMODE")},&lt;br /&gt;-    { DDERR_IMPLICITLYCREATED   ,TEXT("DDERR_IMPLICITLYCREATED")},&lt;br /&gt;-};&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;-&lt;br /&gt;HWND LBCreate( HWND hWnd, HINSTANCE hInst, DWORD pos, BOOL debug )&lt;br /&gt;{&lt;br /&gt;    hWndListBox = CreateWindow(&lt;br /&gt;@@ -198,28 +104,3 @@&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;-static LPTSTR getErrorString( HRESULT ddrval )&lt;br /&gt;-{&lt;br /&gt;-    int i;&lt;br /&gt;-&lt;br /&gt;-    for( i=0;i&amp;lt;sizeof( elErrors )/sizeof( elErrors[0] );i++ )&lt;br /&gt;-    {&lt;br /&gt;-        if( ddrval == elErrors[i].rval )&lt;br /&gt;-        {&lt;br /&gt;-            return elErrors[i].str;&lt;br /&gt;-        }&lt;br /&gt;-    }&lt;br /&gt;-&lt;br /&gt;-    return TEXT("Unknown Error Code");&lt;br /&gt;-}&lt;br /&gt;-&lt;br /&gt;-&lt;br /&gt;-void __cdecl LBPrintfRC( HRESULT ddrval, LPTSTR fmt, ... )&lt;br /&gt;-{&lt;br /&gt;-    TCHAR buff[512];&lt;br /&gt;-&lt;br /&gt;-    wvsprintf( buff, fmt, (LPVOID)(&amp;amp;fmt+1) );&lt;br /&gt;-&lt;br /&gt;-    LBPrintf( TEXT("%s, rc=%ld (0x%08lx:%s)"), buff, LOWORD( ddrval ),&lt;br /&gt;-              ddrval, getErrorString( ddrval ) );&lt;br /&gt;-}&lt;br /&gt;Index: resource.h&lt;br /&gt;===================================================================&lt;br /&gt;--- resource.h (revision 23142)&lt;br /&gt;+++ resource.h (working copy)&lt;br /&gt;@@ -70,16 +70,19 @@&lt;br /&gt;#define IDC_COMBO_DRIVERS               1035&lt;br /&gt;#define ID_FILE_RESTORE                 40001&lt;br /&gt;#define ID_FILE_EXIT                    40002&lt;br /&gt;-#define ID_VIEW_DRIVERCAPS              40003&lt;br /&gt;-#define ID_VIEW_DRIVERCOLORKEYCAPS      40004&lt;br /&gt;-#define ID_VIEW_DRIVERFXCAPS            40005&lt;br /&gt;-#define ID_VIEW_DRIVERPALETTECAPS       40006&lt;br /&gt;-#define ID_VIEW_DRIVERSURFACECAPS       40007&lt;br /&gt;-#define ID_VIEW_HELCAPS                 40008&lt;br /&gt;+#define ID_VIEW_DRIVERCOLORKEYCAPS      40003&lt;br /&gt;+#define ID_VIEW_DRIVERPALETTECAPS       40004&lt;br /&gt;+#define ID_VIEW_DRIVERBLTCAPS           40005&lt;br /&gt;+#define ID_VIEW_DRIVERALPHACAPS         40006&lt;br /&gt;+#define ID_VIEW_DRIVEROVERLAYCAPS       40007&lt;br /&gt;+#define ID_VIEW_DRIVERMISCCAPS          40008&lt;br /&gt;#define ID_VIEW_HELCOLORKEYCAPS         40009&lt;br /&gt;-#define ID_VIEW_HELFXCAPS               40010&lt;br /&gt;-#define ID_VIEW_HELPALETTECAPS          40011&lt;br /&gt;-#define ID_VIEW_HELSURFACECAPS          40012&lt;br /&gt;+#define ID_VIEW_HELPALETTECAPS          40010&lt;br /&gt;+#define ID_VIEW_HELBLTCAPS              40011&lt;br /&gt;+#define ID_VIEW_HELALPHACAPS            40012&lt;br /&gt;+#define ID_VIEW_HELOVERLAYCAPS          40013&lt;br /&gt;+#define ID_VIEW_HELMISCCAPS             40014&lt;br /&gt;+&lt;br /&gt;#define IDC_STATIC                      -1&lt;br /&gt;&lt;br /&gt;// Next default values for new objects&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;source 所在位置是 C:\WINCE600\PUBLIC\DIRECTX\SDK\SAMPLES\DXMISC\DDCAPS&lt;br /&gt;&lt;br /&gt;build ddcaps 的 command 是：&lt;br /&gt;&lt;code&gt; sysgen -p directx ddcaps&lt;/code&gt;&lt;br /&gt;因為 ddcaps 是在 public 下的 directx 目錄，所以 -p 後面要寫 directx ，意思是(path = directx)。&lt;br /&gt;project name 就是 ddcaps.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2117270136732158310-6495435704664642305?l=realchecko.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realchecko.blogspot.com/feeds/6495435704664642305/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2117270136732158310&amp;postID=6495435704664642305' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/6495435704664642305'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/6495435704664642305'/><link rel='alternate' type='text/html' href='http://realchecko.blogspot.com/2010/08/modify-ddcaps-for-ce-60.html' title='Modify DDCAPS for CE 6.0'/><author><name>Checko</name><uri>http://www.blogger.com/profile/03239306354367907990</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/blogger/669/302/320/IMGP0803.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2117270136732158310.post-8294868014128849457</id><published>2010-08-12T11:56:00.004+08:00</published><updated>2010-11-30T17:12:38.565+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WindowsCE'/><category scheme='http://www.blogger.com/atom/ns#' term='MSDN'/><category scheme='http://www.blogger.com/atom/ns#' term='Microsoft'/><title type='text'>DirectDraw Capability in CE 6.0</title><content type='html'>要知道系統哪些 DirectDraw Function 是 hardware support，哪些是用 software emulate，&lt;br /&gt;可以用 &lt;a href="http://msdn.microsoft.com/en-us/library/ee491685.aspx"&gt;IDirectDraw::GetCaps&lt;/a&gt; 來取得 ddraw capability 列表：&lt;br /&gt;&lt;code&gt;HRESULT GetCaps(&lt;br /&gt;LPDDCAPS lpDDDriverCaps,&lt;br /&gt;LPDDCAPS lpDDEmulCaps&lt;br /&gt;);&lt;/code&gt;&lt;br /&gt;傳進去的兩個 argument 都是用來取出 capability 的 structure pointer，結構完全一樣，一個是 hardware support list，一個是 software emulation list&lt;br /&gt;&lt;ul&gt;&lt;li&gt;lpDDDriverCaps : hardware&lt;/li&gt;&lt;li&gt;lpDDEmulCaps : software&lt;/li&gt;&lt;/ul&gt;Support List structure 的definition 是 &lt;a href="http://msdn.microsoft.com/en-us/library/ee490705.aspx"&gt;DDCAPS&lt;/a&gt;：&lt;br /&gt;&lt;code&gt;&lt;br /&gt;typedef struct _DDCAPS {&lt;br /&gt;DWORD dwSize;&lt;br /&gt;DWORD dwCKeyCaps;&lt;br /&gt;DWORD dwPalCaps;&lt;br /&gt;DWORD dwBltCaps;&lt;br /&gt;DWORD dwAlphaCaps;&lt;br /&gt;DWORD dwOverlayCaps;&lt;br /&gt;DWORD dwVidMemTotal;&lt;br /&gt;DWORD dwVidMemFree;&lt;br /&gt;DWORD dwVidMemStride;&lt;br /&gt;DWORD dwMaxVisibleOverlays;&lt;br /&gt;DWORD dwCurrVisibleOverlays;&lt;br /&gt;DWORD dwNumFourCCCodes;&lt;br /&gt;DWORD dwAlignBoundarySrc;&lt;br /&gt;DWORD dwAlignSizeSrc;&lt;br /&gt;DWORD dwAlignBoundaryDest;&lt;br /&gt;DWORD dwAlignSizeDest;&lt;br /&gt;DWORD dwRops[DD_ROP_SPACE];&lt;br /&gt;DWORD dwMinOverlayStretch;&lt;br /&gt;DWORD dwMaxOverlayStretch;&lt;br /&gt;DWORD dwMiscCaps;&lt;br /&gt;} DDCAPS,FAR *LPDDCAPS;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;每個 DWORD的每個 bit 都代表一個 function，宣告在 ddraw.h (C:\WINCE600\PUBLIC\COMMON\SDK\INC\ddraw.h)&lt;br /&gt;&lt;br /&gt;platform builder public folder 附有一個 DDCAPS 的 sample program，可以列出 platform ddraw hardware/software support .&lt;br /&gt;很悲慘的是，ddcaps structure 在 CE 6.0 大幅修改，所以DDCAPS sample code 在 6.0 不能 build 了！！&lt;br /&gt;看這一篇： &lt;a href="http://msdn.microsoft.com/en-us/library/ee491224.aspx"&gt;DirectDraw Migration&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;&lt;br /&gt;我做了修改： &lt;a href="http://realchecko.blogspot.com/2010/08/modify-ddcaps-for-ce-60.html"&gt;Modify DDCAPS for CE 6.0&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2117270136732158310-8294868014128849457?l=realchecko.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realchecko.blogspot.com/feeds/8294868014128849457/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2117270136732158310&amp;postID=8294868014128849457' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/8294868014128849457'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/8294868014128849457'/><link rel='alternate' type='text/html' href='http://realchecko.blogspot.com/2010/08/directdraw-capability-in-ce-60.html' title='DirectDraw Capability in CE 6.0'/><author><name>Checko</name><uri>http://www.blogger.com/profile/03239306354367907990</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/blogger/669/302/320/IMGP0803.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2117270136732158310.post-4541726879127497726</id><published>2010-08-11T16:48:00.003+08:00</published><updated>2010-08-11T17:15:30.849+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WindowsCE'/><category scheme='http://www.blogger.com/atom/ns#' term='Microsoft'/><category scheme='http://www.blogger.com/atom/ns#' term='WTL'/><title type='text'>CListBox : ListBox control in WTL</title><content type='html'>WTL 也包裝了一些 common control，例如 ListBox，名稱叫 CListBox, 在 atlctrls.h.&lt;br /&gt;&lt;br /&gt;像 前面的 example : &lt;a href="http://realchecko.blogspot.com/2010/05/win32-listbox-control.html"&gt;http://realchecko.blogspot.com/2010/05/win32-listbox-control.html&lt;/a&gt;&lt;br /&gt;改用 WTL 來寫，就是：&lt;br /&gt;&lt;code&gt;#pragma once&lt;br /&gt;#define WINVER 0x0600&lt;br /&gt;&lt;br /&gt;#include &amp;lt;atlbase.h&amp;gt;&lt;br /&gt;#include &amp;lt;atlapp.h&amp;gt;&lt;br /&gt;#include &amp;lt;atlwin.h&amp;gt;&lt;br /&gt;#include &amp;lt;atlctrls.h&amp;gt;&lt;br /&gt;&lt;br /&gt;#include &amp;quot;resource.h&amp;quot;&lt;br /&gt;&lt;br /&gt;class CMainDialog : public CDialogImpl&amp;lt;CMainDialog&amp;gt;&lt;br /&gt;{&lt;br /&gt;public:&lt;br /&gt;    enum {IDD = IDD_DIALOG1 };&lt;br /&gt;    int addi;&lt;br /&gt;    CListBox list;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    BEGIN_MSG_MAP(CMainDialog)&lt;br /&gt;        MESSAGE_HANDLER(WM_INITDIALOG,OnInitDialog)&lt;br /&gt;        COMMAND_ID_HANDLER(IDCANCEL, OnCancel)&lt;br /&gt;        COMMAND_ID_HANDLER(IDC_BTNADD,OnBtnAdd)&lt;br /&gt;    END_MSG_MAP()&lt;br /&gt;&lt;br /&gt;    LRESULT OnInitDialog(UINT,WPARAM,LPARAM,BOOL&amp;amp;)&lt;br /&gt;    {&lt;br /&gt;        addi=0;&lt;br /&gt;        RETAILMSG(1,(TEXT(&amp;quot;OnInitDialog\r\n&amp;quot;)));&lt;br /&gt;        list.Attach(GetDlgItem(IDC_LIST1));&lt;br /&gt;        return TRUE;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    LRESULT OnCancel(WORD,WORD wID,HWND,BOOL&amp;amp;)&lt;br /&gt;    {&lt;br /&gt;        ::PostQuitMessage(wID);&lt;br /&gt;        return 0;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    LRESULT OnBtnAdd(WORD,WORD wID,HWND,BOOL&amp;amp; hHandled)&lt;br /&gt;    {&lt;br /&gt;        TCHAR outmsg[10];&lt;br /&gt;        swprintf(outmsg,_T(&amp;quot;%d&amp;quot;),addi++);&lt;br /&gt;        list.AddString(outmsg);&lt;br /&gt;        int cnt = list.GetCount();&lt;br /&gt;        if(cnt&amp;gt;30)&lt;br /&gt;            list.DeleteString(0);&lt;br /&gt;        cnt = list.GetCount();&lt;br /&gt;        if(cnt&amp;gt;=14)&lt;br /&gt;            list.SetTopIndex(cnt-14);&lt;br /&gt;        RETAILMSG(1,(TEXT(&amp;quot;Button Add\r\n&amp;quot;)));&lt;br /&gt;        return TRUE;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;CAppModule _Module;&lt;br /&gt;&lt;br /&gt;int WINAPI _tWinMain(HINSTANCE hInstance,HINSTANCE,LPTSTR lpstrCmdLine,int nCmdShow)&lt;br /&gt;{&lt;br /&gt;    HRESULT hRes = ::CoInitializeEx(NULL,COINIT_MULTITHREADED);&lt;br /&gt;    ::DefWindowProc(NULL,0,0,0L);&lt;br /&gt;    AtlInitCommonControls(NULL);&lt;br /&gt;    hRes = _Module.Init(NULL,hInstance);&lt;br /&gt;&lt;br /&gt;    CMainDialog dlgMain;&lt;br /&gt;    hRes = dlgMain.DoModal();&lt;br /&gt;    ::CoUninitialize();&lt;br /&gt;&lt;br /&gt;    return hRes;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;可以看到，大概是用 Attach( GetDlgItem(IDC_LIST1)) 把 WTL class: CListBox 和 ListBox control 建立關係。&lt;br /&gt;&lt;br /&gt;相關的說明： &lt;a href="http://www.cchsu.com/arthur/prg_bg5/wtl3.htm"&gt;http://www.cchsu.com/arthur/prg_bg5/wtl3.htm&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2117270136732158310-4541726879127497726?l=realchecko.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realchecko.blogspot.com/feeds/4541726879127497726/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2117270136732158310&amp;postID=4541726879127497726' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/4541726879127497726'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/4541726879127497726'/><link rel='alternate' type='text/html' href='http://realchecko.blogspot.com/2010/08/clistbox-listbox-control-in-wtl.html' title='CListBox : ListBox control in WTL'/><author><name>Checko</name><uri>http://www.blogger.com/profile/03239306354367907990</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/blogger/669/302/320/IMGP0803.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2117270136732158310.post-2777924071580090632</id><published>2010-08-10T15:35:00.003+08:00</published><updated>2010-08-10T16:24:49.598+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ARM'/><category scheme='http://www.blogger.com/atom/ns#' term='WindowsCE'/><category scheme='http://www.blogger.com/atom/ns#' term='Software'/><category scheme='http://www.blogger.com/atom/ns#' term='Microsoft'/><title type='text'>Build Assembly code in VS2005</title><content type='html'>這是參考 tcpmp 的 project 檔。&lt;br /&gt;&lt;br /&gt;大概也跟 eVC 一樣，就是為 assembly.asm 加上 custom build command.&lt;br /&gt;&lt;ol&gt;&lt;li&gt;先把 assembly code 的 source file 寫好&lt;/li&gt;&lt;li&gt;開啟 VS2005，把 assembly file 加到 source folder 中&lt;/li&gt;&lt;li&gt;在 assembly file 按右鍵，選 properties&lt;/li&gt;&lt;li&gt;Custom Build Step -- General --Command Line,, 寫&lt;code&gt;armasm.exe -cpu xscale "$(InputPath)" "$(IntDir)/$(InputName).obj"&lt;/code&gt;&lt;/li&gt;&lt;li&gt;Output 寫&lt;code&gt;$(IntDir)/$(InputName).obj&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2117270136732158310-2777924071580090632?l=realchecko.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realchecko.blogspot.com/feeds/2777924071580090632/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2117270136732158310&amp;postID=2777924071580090632' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/2777924071580090632'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/2777924071580090632'/><link rel='alternate' type='text/html' href='http://realchecko.blogspot.com/2010/08/build-assembly-code-in-vs2005.html' title='Build Assembly code in VS2005'/><author><name>Checko</name><uri>http://www.blogger.com/profile/03239306354367907990</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/blogger/669/302/320/IMGP0803.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2117270136732158310.post-3764310460330053897</id><published>2010-08-09T18:50:00.008+08:00</published><updated>2010-08-10T11:27:06.168+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ARM'/><category scheme='http://www.blogger.com/atom/ns#' term='WindowsCE'/><category scheme='http://www.blogger.com/atom/ns#' term='Notes'/><category scheme='http://www.blogger.com/atom/ns#' term='Workrecord'/><category scheme='http://www.blogger.com/atom/ns#' term='Software'/><title type='text'>CpuId - 紀錄一下</title><content type='html'>因為 CE 6.0 沒有辦法 SetKMode，所以只好... 寫一個 driver，然後 load 進去..,&lt;br /&gt;&lt;br /&gt;這就是 copy 自 tcpmp getcpuid 的 code 後，run 起來：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;我們的： 4117B362,1D152152,0,0&lt;/li&gt;&lt;li&gt;測試的： 410FB764,1D992992,0,0&lt;/li&gt;&lt;/ul&gt;第一個，cpu id&lt;br /&gt;&lt;br /&gt;4117B362:ref(&lt;a href="http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0360f/CACEDHJG.html"&gt;http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0360f/CACEDHJG.html&lt;/a&gt;)&lt;br /&gt;所以是 ARM1136, rev2&lt;br /&gt;&lt;br /&gt;410FB764: ref (&lt;a href="http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0360f/CACEDHJG.html"&gt;http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0360f/CACEDHJG.html&lt;/a&gt;)&lt;br /&gt;所以是 ARM1176 , rev 4&lt;br /&gt;&lt;br /&gt;第二個，cache type register&lt;br /&gt;&lt;br /&gt;ref : &lt;a href="http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0211k/I67616.html"&gt;http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0211k/I67616.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;[31:29] : always 0&lt;/li&gt;&lt;li&gt;[28:25] : ctype - cache type b1110 means "write back","register 7 operation","format C"&lt;/li&gt;&lt;li&gt;[24] : separate D and I cache&lt;/li&gt;&lt;li&gt;[23:12] : D cache size&lt;/li&gt;&lt;li&gt;[11:0] : I cache size&lt;/li&gt;&lt;/ul&gt;其中 D 和 I cache size encoding format:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;[11] : P&lt;/li&gt;&lt;li&gt;[10:9] : always 0&lt;/li&gt;&lt;li&gt;[8:6] :  size&lt;/li&gt;&lt;li&gt;[5:3] : association (way)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;[2] : M&lt;/li&gt;&lt;li&gt;[1:0] Length&lt;/li&gt;&lt;/ul&gt;所以&lt;br /&gt;1D152152 :  16K, 4 way, len=32 bytes.&lt;br /&gt;1D992992: 32K, 4 way, len=32 bytes.&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;driver code&lt;br /&gt;&lt;br /&gt;GETID.C:&lt;br /&gt;&lt;code&gt;#include &amp;lt;windows.h&amp;gt;&lt;br /&gt;#include &amp;lt;drvlib.h&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;//-----        Code Control        -----&lt;br /&gt;#define GID_DEBUG&lt;br /&gt;&lt;br /&gt;#ifdef DEBUG&lt;br /&gt;DBGPARAM dpCurSettings = { TEXT("Getid"), {&lt;br /&gt;    TEXT("Verbose"), TEXT(""), TEXT(""), TEXT(""),&lt;br /&gt;    TEXT(""), TEXT(""), TEXT(""), TEXT(""),&lt;br /&gt;    TEXT(""), TEXT(""), TEXT(""), TEXT(""),&lt;br /&gt;    TEXT(""), TEXT(""), TEXT(""), TEXT("")},&lt;br /&gt;0x00000000&lt;br /&gt;};&lt;br /&gt;#endif&lt;br /&gt;&lt;br /&gt;extern void GetCpuId(int,DWORD*);&lt;br /&gt;&lt;br /&gt;void SafeGetCpuId(int Id, DWORD* p)&lt;br /&gt;{&lt;br /&gt;memset(p,0,4*sizeof(DWORD));&lt;br /&gt;  GetCpuId(Id,p);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;//---        GID_Init&lt;br /&gt;DWORD GID_Init(DWORD dwContext)&lt;br /&gt;{&lt;br /&gt;      DWORD  CpuId[4];&lt;br /&gt;      DWORD dwErr;&lt;br /&gt;      TCHAR outmsg[60];&lt;br /&gt;&lt;br /&gt;      RETAILMSG(1, (TEXT("[GID]    GID_Init+\r\n")));&lt;br /&gt;&lt;br /&gt;      SafeGetCpuId(0,CpuId);&lt;br /&gt;RETAILMSG(1,(TEXT("%X,%X,%X,%X\r\n"),CpuId[0],CpuId[1],CpuId[2],CpuId[3]));&lt;br /&gt;swprintf(outmsg,TEXT("%X,%X,%X,%X"),CpuId[0],CpuId[1],CpuId[2],CpuId[3]);&lt;br /&gt;&lt;br /&gt;MessageBox(NULL,outmsg,TEXT("GID"),MB_OK);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;RETAILMSG(1, (TEXT("[GID]    GID_Init OK \r\n")));&lt;br /&gt;return TRUE;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;//---        GID_Deinit&lt;br /&gt;BOOL GID_Deinit(DWORD dwContext)&lt;br /&gt;{&lt;br /&gt;RETAILMSG(1, (TEXT("[GID]    GID_Deinit+\r\n")));&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;return TRUE;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;//---        GID_Open&lt;br /&gt;DWORD GID_Open(DWORD dwData, DWORD dwAccess, DWORD dwShareMode)&lt;br /&gt;{&lt;br /&gt;RETAILMSG(1, (TEXT("[GID]    GID_Open+\r\n")));&lt;br /&gt;&lt;br /&gt;return dwData;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;//---        GID_Close&lt;br /&gt;BOOL GID_Close(DWORD Handle)&lt;br /&gt;{&lt;br /&gt;RETAILMSG(1, (TEXT("[GID]    GID_Close+\r\n")));&lt;br /&gt;&lt;br /&gt;return TRUE;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;//---        GID_Read&lt;br /&gt;DWORD GID_Read(DWORD Handle, LPVOID pBuffer, DWORD dwNumBytes)&lt;br /&gt;{&lt;br /&gt;RETAILMSG(1, (TEXT("[GID]    GID_Read+\r\n")));&lt;br /&gt;return 0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;//---        GID_Write&lt;br /&gt;DWORD GID_Write(DWORD Handle, LPCVOID pBuffer, DWORD dwNumBytes)&lt;br /&gt;{&lt;br /&gt;RETAILMSG(1, (TEXT("[GID]    GID_Write+\r\n")));&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;return 0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;//---        GID_Seek&lt;br /&gt;DWORD GID_Seek(DWORD Handle, long lDistance, DWORD dwMoveMethod)&lt;br /&gt;{&lt;br /&gt;RETAILMSG(1, (TEXT("[GID]    GID_Seek+\r\n")));&lt;br /&gt;&lt;br /&gt;return (DWORD) -1;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;//---        GID_IOControl&lt;br /&gt;BOOL GID_IOControl(&lt;br /&gt;          DWORD Handle,&lt;br /&gt;          DWORD dwCode,&lt;br /&gt;          PBYTE pBufIn,&lt;br /&gt;          DWORD dwLenIn,&lt;br /&gt;          PBYTE pBufOut,&lt;br /&gt;          DWORD dwLenOut,&lt;br /&gt;          PDWORD pdwActualOut&lt;br /&gt;          )&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;RETAILMSG(1, (TEXT("[GID]    GID_IOControl+\r\n")));&lt;br /&gt;return (FALSE);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;BOOL&lt;br /&gt;GID_DllEntry(&lt;br /&gt;HINSTANCE   hinstDll,             /*@parm Instance pointer. */&lt;br /&gt;DWORD   dwReason,                 /*@parm Reason routine is called. */&lt;br /&gt;LPVOID  lpReserved                /*@parm system parameter. */&lt;br /&gt;)&lt;br /&gt;{&lt;br /&gt;if (dwReason == DLL_PROCESS_ATTACH)&lt;br /&gt;{&lt;br /&gt; DisableThreadLibraryCalls((HMODULE) hinstDll);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;return (TRUE);&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;arm.s&lt;br /&gt;&lt;code&gt;    INCLUDE kxarm.h&lt;br /&gt;&lt;br /&gt;EXPORT GetCpuId&lt;br /&gt;&lt;br /&gt;TEXTAREA&lt;br /&gt;&lt;br /&gt;LEAF_ENTRY GetCpuId&lt;br /&gt;  export GetCpuId&lt;br /&gt;mrs    r0,cpsr&lt;br /&gt;&lt;br /&gt;and r0,r0,#15&lt;br /&gt;cmp r0,#15&lt;br /&gt;bne UserMode&lt;br /&gt;mrc p15,0,r0,c0,c0,0&lt;br /&gt;nop&lt;br /&gt;nop&lt;br /&gt;mrc p15,0,r2,c0,c0,1&lt;br /&gt;nop&lt;br /&gt;nop&lt;br /&gt;str r0,[r1,#0]&lt;br /&gt;str r2,[r1,#4]&lt;br /&gt;UserMode&lt;br /&gt;mov    pc,lr&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;ref (&lt;a href="http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0360f/CACEDHJG.html"&gt;http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0360f/CACEDHJG.htm&lt;/a&gt;l) CpuID 取的是 opcode2 = 0 和 1 : cpu id 跟 cache type.&lt;br /&gt;GETID.DEF&lt;br /&gt;&lt;code&gt;LIBRARY getid&lt;br /&gt;&lt;br /&gt;EXPORTS&lt;br /&gt;GID_Init&lt;br /&gt;GID_Deinit&lt;br /&gt;GID_Open&lt;br /&gt;GID_Close&lt;br /&gt;GID_Read&lt;br /&gt;GID_Write&lt;br /&gt;GID_IOControl&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;sources&lt;br /&gt;&lt;code&gt;&lt;br /&gt;TARGETNAME=getid&lt;br /&gt;TARGETTYPE=DYNLINK&lt;br /&gt;RELEASETYPE=PLATFORM&lt;br /&gt;&lt;br /&gt;DLLENTRY=GID_DllEntry&lt;br /&gt;DEFFILE=$(_TARGETPLATROOT)\SRC\DRIVERS\getid\getid.def&lt;br /&gt;&lt;br /&gt;PREPROCESSDEFFILE=1&lt;br /&gt;SYNCHRONIZE_DRAIN=1&lt;br /&gt;WINCEREL=1&lt;br /&gt;&lt;br /&gt;TARGETLIBS= \&lt;br /&gt;$(_COMMONSDKROOT)\LIB\$(_CPUINDPATH)\coredll.lib \&lt;br /&gt;&lt;br /&gt;SOURCELIBS= \&lt;br /&gt;&lt;br /&gt;SOURCES= \&lt;br /&gt;getid.c \&lt;br /&gt;arm.s&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;load driver 的程式就是以前哪個 activedriverex( ). 改一下 dll name 就可以&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;ref &lt;a href="http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0211k/I67616.html"&gt;http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0211k/I67616.html&lt;/a&gt;&lt;br /&gt;用&lt;br /&gt;&lt;h3 class="title"&gt; c0, Core feature ID registers&lt;br /&gt;&lt;/h3&gt;好像可以得到更多 cpu feature&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2117270136732158310-3764310460330053897?l=realchecko.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realchecko.blogspot.com/feeds/3764310460330053897/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2117270136732158310&amp;postID=3764310460330053897' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/3764310460330053897'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/3764310460330053897'/><link rel='alternate' type='text/html' href='http://realchecko.blogspot.com/2010/08/cpuid.html' title='CpuId - 紀錄一下'/><author><name>Checko</name><uri>http://www.blogger.com/profile/03239306354367907990</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/blogger/669/302/320/IMGP0803.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2117270136732158310.post-8753825287979041806</id><published>2010-08-07T17:14:00.003+08:00</published><updated>2010-08-07T19:39:13.422+08:00</updated><title type='text'>to replace t3</title><content type='html'>t3&lt;br /&gt;&lt;ul&gt;&lt;li&gt;500萬 1/2.4" CCD&lt;/li&gt;&lt;li&gt;3x optical zoom&lt;/li&gt;&lt;li&gt; 38 - 114 mm&lt;br /&gt;&lt;/li&gt;&lt;li&gt; F3.5 - F4.4&lt;/li&gt;&lt;li&gt;640 x 480, 30 fps m jpg&lt;/li&gt;&lt;li&gt;2.5" lcd&lt;/li&gt;&lt;/ul&gt;&lt;span id="show"&gt;&lt;span style="color:#555555;"&gt;COOLPIX S620  nt 5980&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;span id="show"&gt;&lt;span style="color:#555555;"&gt;1,220 萬 &lt;/span&gt;&lt;/span&gt;&lt;span id="show"&gt;&lt;span style="color:#555555;"&gt;1/2.33 英寸 CCD&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span id="show"&gt;&lt;span style="color:#555555;"&gt;4倍變焦 &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:Arial,Helvetica;font-size:-1;"&gt;&lt;span class="13px_normal"&gt;28-112mm&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:Arial,Helvetica;font-size:-1;"&gt;&lt;span class="13px_normal"&gt;F2.7-5.8&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:Arial,Helvetica;font-size:-1;"&gt;&lt;span class="13px_normal"&gt;640 x 480@30fps mjpeg&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:Arial,Helvetica;font-size:-1;"&gt;&lt;span class="13px_normal"&gt;2.7" lcd&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;VR 光學防震&lt;/li&gt;&lt;/ul&gt;&lt;span class="text20"&gt;OLYMPUS FE-4030 nt 5900&lt;br /&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;1400 萬像素&lt;/li&gt;&lt;li&gt;4X 26 mm 至 105 mm&lt;/li&gt;&lt;li&gt;2.6 (wide) – 5.9 (tele)&lt;/li&gt;&lt;li&gt;640 x 480 @ 30/15 fps mjpeg&lt;/li&gt;&lt;li&gt;2.7" lcd&lt;/li&gt;&lt;/ul&gt;&lt;span class="smalltxt"&gt;&lt;span class="bold"&gt;OLYMPUS μ1070 nt 4999 (costco)&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;1,200萬&lt;/li&gt;&lt;li&gt;&lt;span id="show"&gt;&lt;span class="text13List"  style="color:#666666;"&gt;&lt;span style="font-size: 9pt; color: black; font-family: 新細明體;"&gt;&lt;span&gt;38mm&lt;/span&gt;&lt;span&gt;~114mm&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span id="show"&gt;&lt;span class="text13List"  style="color:#666666;"&gt;&lt;span style="font-size: 9pt; color: black; font-family: 新細明體;"&gt;&lt;span&gt;F3.5(W)~F5.0(T)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;640 x 480 @ 30/15 fps mjpeg&lt;/li&gt;&lt;li&gt;2.7" lcd&lt;/li&gt;&lt;li&gt;&lt;span id="show"&gt;&lt;span class="text13List"  style="color:#666666;"&gt;CCD移動式手震校正&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;FUJI &lt;span class="text20"&gt;F72EXR nt 5990&lt;br /&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2117270136732158310-8753825287979041806?l=realchecko.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realchecko.blogspot.com/feeds/8753825287979041806/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2117270136732158310&amp;postID=8753825287979041806' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/8753825287979041806'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/8753825287979041806'/><link rel='alternate' type='text/html' href='http://realchecko.blogspot.com/2010/08/to-replace-t3.html' title='to replace t3'/><author><name>Checko</name><uri>http://www.blogger.com/profile/03239306354367907990</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/blogger/669/302/320/IMGP0803.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2117270136732158310.post-6872561015936756645</id><published>2010-08-05T11:56:00.004+08:00</published><updated>2010-08-05T14:26:03.877+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ARM'/><category scheme='http://www.blogger.com/atom/ns#' term='Hardware'/><category scheme='http://www.blogger.com/atom/ns#' term='Software'/><title type='text'>pipeline bubble</title><content type='html'>利用 assembly 來optimize speed 時，要注意，並不是 instruction line 短就夠了。&lt;br /&gt;還要注意 pipline 的特性。&lt;br /&gt;&lt;br /&gt;pipeline 將指令分成幾個 stage：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;fetch,&lt;/li&gt;&lt;li&gt; decode/register read,&lt;/li&gt;&lt;li&gt; alu,&lt;br /&gt;&lt;/li&gt;&lt;li&gt;memory write,&lt;br /&gt;&lt;/li&gt;&lt;li&gt;register update.&lt;/li&gt;&lt;/ul&gt;如果這樣個 assembly codes:&lt;br /&gt;&lt;code&gt; ldr r0,#1&lt;br /&gt;add r3,r0,r1&lt;/code&gt;第二行指令在 decode/register read 時，r0 還沒update，因為上一行才執行到alu operation。所以在pipeline中的第二行指令就要停下來，等兩個clock，等上一行指令執行到register update後，才可以繼續。&lt;br /&gt;這樣，就白白浪費 2 個 clock 了。&lt;br /&gt;&lt;br /&gt;為了避免這樣的情況，寫 assembly 的時候，就可以在中間插入下面要作的 assembly code，不要白白浪費這兩個clock&lt;br /&gt;&lt;br /&gt;在 (很久)前面的文章：yuv - rgb color space convert 的 assembly code 可以看到。最後一個作者的assembly code 就有做到這個(所以整個 code 的 flow 變得不好trace)。實測的結果，也是最快的。&lt;br /&gt;&lt;hr /&gt;在 Wiki 里也有&lt;a href="http://en.wikipedia.org/wiki/Compiler_optimization"&gt;說明&lt;/a&gt;：&lt;br /&gt;&lt;dl&gt;&lt;dt&gt;&lt;b&gt;&lt;a href="http://en.wikipedia.org/wiki/Instruction_scheduling" title="Instruction scheduling"&gt;instruction scheduling&lt;/a&gt;&lt;/b&gt;&lt;/dt&gt;&lt;dd&gt;Instruction scheduling is an important optimization for modern &lt;a href="http://en.wikipedia.org/wiki/Instruction_pipeline" title="Instruction pipeline"&gt;pipelined&lt;/a&gt;  processors, which avoids stalls or bubbles in the pipeline by  clustering instructions with no dependencies together, while being  careful to preserve the original semantics.&lt;/dd&gt;&lt;/dl&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2117270136732158310-6872561015936756645?l=realchecko.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realchecko.blogspot.com/feeds/6872561015936756645/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2117270136732158310&amp;postID=6872561015936756645' title='2 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/6872561015936756645'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/6872561015936756645'/><link rel='alternate' type='text/html' href='http://realchecko.blogspot.com/2010/08/pipeline-bubble.html' title='pipeline bubble'/><author><name>Checko</name><uri>http://www.blogger.com/profile/03239306354367907990</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/blogger/669/302/320/IMGP0803.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2117270136732158310.post-9210731636377724266</id><published>2010-08-04T18:48:00.003+08:00</published><updated>2010-08-04T18:51:57.168+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bookmark'/><category scheme='http://www.blogger.com/atom/ns#' term='WindowsCE'/><title type='text'>OEM 自訂 cache mode --- CE 6.0</title><content type='html'>這一篇 ( &lt;a href="http://support.microsoft.com/kb/977855"&gt;http://support.microsoft.com/kb/977855/&lt;/a&gt; ) 超新的... An update that enables the Windows Embedded CE 6.0 kernel to support different cache mode bits is available&lt;br /&gt;&lt;br /&gt;是 Microsoft as Windows Embedded CE 6.0 Platform Builder Monthly Update (June 2010). 才支援。&lt;br /&gt;&lt;br /&gt;就是在 5.0 以前都有 support 的 OEMARMCacheMode( ) 回報 .&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2117270136732158310-9210731636377724266?l=realchecko.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realchecko.blogspot.com/feeds/9210731636377724266/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2117270136732158310&amp;postID=9210731636377724266' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/9210731636377724266'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/9210731636377724266'/><link rel='alternate' type='text/html' href='http://realchecko.blogspot.com/2010/08/oem-cache-mode-ce-60.html' title='OEM 自訂 cache mode --- CE 6.0'/><author><name>Checko</name><uri>http://www.blogger.com/profile/03239306354367907990</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/blogger/669/302/320/IMGP0803.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2117270136732158310.post-1345591198556988169</id><published>2010-08-04T11:14:00.004+08:00</published><updated>2010-08-04T18:37:36.228+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ARM'/><category scheme='http://www.blogger.com/atom/ns#' term='Hardware'/><title type='text'>cache</title><content type='html'>cache 是一小塊和cpu時脈一樣的記憶體，作為 cpu 與 主記憶體間的 buffer。&lt;br /&gt;當 cpu 要讀取 memory 時， cache 先把 memory 的資料讀進 cache 中，然後再讓 cpu 讀取。&lt;br /&gt;&lt;br /&gt;cpu 每次讀取的單位是 int (32bit)，但是 cache 為求效能，會一次讀入比 int 還多的資料。&lt;br /&gt;cache 每次讀入的資料大小叫 line size，每次讀入的資料放入 一個 line。&lt;br /&gt;&lt;br /&gt;cache 就是利用這樣預先讀取的能力，讓cpu 下次需要讀取記憶體時，可以直接由 cache 拿，不需要再向 主記憶體 讀取。&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;由於 cache 只有小小一塊，所以必須要有一個機制知道 cpu 需要存取記憶體時，那個 address的內容是不是已經在cache 里，如果在，是在 cache 的那一條 line ...&lt;br /&gt;&lt;br /&gt;最直覺的方法就是去找每一個 cache line 的 address，看看那一個 line 所以 cache 的 記憶體位址是不是 cpu 現在要的。&lt;br /&gt;&lt;br /&gt;這樣個 cache 叫 associative cache.&lt;br /&gt;&lt;br /&gt;但是這樣作很耗空間(電路)，因為每一個 line 都要作一個 address比較電路。&lt;br /&gt;所以就有比較便宜的作法..  把 把 address 分成兩部份：&lt;br /&gt;&lt;br /&gt;tag, index&lt;br /&gt;&lt;br /&gt;以 32 bit 的 address line 為例，可以分成：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;tag : 31~20&lt;/li&gt;&lt;li&gt;index : 19~0&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;這樣要找cache 時就可以反過來用，用 address的 0~19作 index，找到那個 cache index line 的 tag，然後跟 31~20比較就可以。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;後來又有折衷的辦法，就是...每個 index 可以有兩個 tag欄位和lines，這樣，每20 條位址線，就可以共用兩條 cache line。 -- 這就叫 2 way cache.&lt;br /&gt;=&amp;gt;這樣就是：拿 index 找到對應的 2 個 tag ，比較和 address bit 31-20 一步一樣。&lt;br /&gt;&lt;br /&gt;一此類推，可以有 4 way cache。&lt;br /&gt;&lt;hr /&gt;這一篇 (&lt;a href="http://www.mirabilisdesign.com/Pages/Demonstrations/systemarchitecture/Cache_System/Functional_Cache_Model_Overview.html"&gt;http://www.mirabilisdesign.com/Pages/Demonstrations/systemarchitecture/Cache_System/Functional_Cache_Model_Overview.html&lt;/a&gt;)雖然是 sim software 的說明，但是可以看到 ARM11 cache 的 impelement 圖例&lt;br /&gt;&lt;br /&gt;cache line size 是 16 words (address 0~3), index size 是 4096 (address 4~15), tag filed 是 address 16~31，&lt;br /&gt;&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;&lt;br /&gt;所以 cache index size x byte size x way = cache size&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2117270136732158310-1345591198556988169?l=realchecko.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realchecko.blogspot.com/feeds/1345591198556988169/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2117270136732158310&amp;postID=1345591198556988169' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/1345591198556988169'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/1345591198556988169'/><link rel='alternate' type='text/html' href='http://realchecko.blogspot.com/2010/08/cache.html' title='cache'/><author><name>Checko</name><uri>http://www.blogger.com/profile/03239306354367907990</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/blogger/669/302/320/IMGP0803.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2117270136732158310.post-5654525924254008609</id><published>2010-08-02T09:36:00.000+08:00</published><updated>2010-08-02T09:38:39.228+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bookmark'/><category scheme='http://www.blogger.com/atom/ns#' term='sitememo'/><title type='text'></title><content type='html'>這個網站很不錯，範圍很廣，軟體與實際的應用.. &lt;a href="http://yukuan.blogspot.com/"&gt;http://yukuan.blogspot.com/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2117270136732158310-5654525924254008609?l=realchecko.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realchecko.blogspot.com/feeds/5654525924254008609/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2117270136732158310&amp;postID=5654525924254008609' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/5654525924254008609'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/5654525924254008609'/><link rel='alternate' type='text/html' href='http://realchecko.blogspot.com/2010/08/blog-post.html' title=''/><author><name>Checko</name><uri>http://www.blogger.com/profile/03239306354367907990</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/blogger/669/302/320/IMGP0803.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2117270136732158310.post-3385212831502941934</id><published>2010-07-30T11:49:00.002+08:00</published><updated>2010-07-30T11:56:30.010+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WindowsCE'/><category scheme='http://www.blogger.com/atom/ns#' term='Workrecord'/><title type='text'>CE 6 error : invalid parameters passwd to wince.bat</title><content type='html'>&lt;code&gt;invalide parameters passed to wince.bat&lt;/code&gt;&lt;br /&gt;最近要 show catalog item view 時，出現這個 error dialog，然後 vs2005 就 fail 了。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;查到後來是 BSP 設定會自動 SET, UNSET 一些 SYSGEN_XX，所以不知道哪一個 SYSGEN_XX 被修改所導致。&lt;br /&gt;&lt;br /&gt;Google 一下，唯一的一個解答，好像是說環境變數造成的....&lt;br /&gt;結果我用 clean system，reinstall CE6 還是一樣會發生.&lt;br /&gt;&lt;br /&gt;還沒有查到是哪一個 sysgen parameter..&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2117270136732158310-3385212831502941934?l=realchecko.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realchecko.blogspot.com/feeds/3385212831502941934/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2117270136732158310&amp;postID=3385212831502941934' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/3385212831502941934'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/3385212831502941934'/><link rel='alternate' type='text/html' href='http://realchecko.blogspot.com/2010/07/ce-6-error-invalid-parameters-passwd-to.html' title='CE 6 error : invalid parameters passwd to wince.bat'/><author><name>Checko</name><uri>http://www.blogger.com/profile/03239306354367907990</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/blogger/669/302/320/IMGP0803.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2117270136732158310.post-854073411724671659</id><published>2010-07-20T10:41:00.004+08:00</published><updated>2010-11-02T13:38:19.139+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Hardware'/><title type='text'>Mode Register Set  - DDR</title><content type='html'>DDR 也有一堆參數可以設，但是 Memory 不像 MCU 或 periperial IC 一樣，有 register 可以設。&lt;br /&gt;&lt;blockquote&gt;memory 的 address/data line 直接對應到內部的 cell，沒有 mapping到內部的 register。&lt;br /&gt;&lt;/blockquote&gt;所以 DDR Spec 規定了一個 bus pattern ，當 bus pattern 是這樣，A0~A14 就對應要寫入 register 的內容。 這個動作就叫做 Mode Register Set&lt;br /&gt;&lt;blockquote&gt;一般好像 CS, CAS, RAS, WE 都是 low 的時候是 mode register set，這時後 A0~A14 的內容會被解讀為 mod register set command 的 op-code&lt;br /&gt;&lt;/blockquote&gt;好像在 chip power up sequence 中有MRS 的階段，所有 DDR 開機都要經過這個階段？有些把這個"寫入 DDR Mode Rester" 的動作叫 Load Mode Register - LMR)&lt;br /&gt;&lt;br /&gt;Mode Register Set 還有 Extended Mode Register Set，可以用來設定 DDR 的 auto-refresh type (range) 和 DDR 的 output current/strength。&lt;br /&gt;&lt;br /&gt;Mode Register Set 要 MCU 的 control 支援，通常 MCU 的 memory control unit 會提供 EMRS register 和 EMRS-cycle (設定 EMRS 鎖需要的clock)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2117270136732158310-854073411724671659?l=realchecko.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realchecko.blogspot.com/feeds/854073411724671659/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2117270136732158310&amp;postID=854073411724671659' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/854073411724671659'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/854073411724671659'/><link rel='alternate' type='text/html' href='http://realchecko.blogspot.com/2010/07/mode-register-set-ddr.html' title='Mode Register Set  - DDR'/><author><name>Checko</name><uri>http://www.blogger.com/profile/03239306354367907990</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/blogger/669/302/320/IMGP0803.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2117270136732158310.post-8142341135779500822</id><published>2010-07-19T14:49:00.005+08:00</published><updated>2011-02-01T10:30:34.171+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Hardware'/><title type='text'>DDR</title><content type='html'>在 DRAM 的設計上，加快 memory core 的 clock rate 比較難，所以都朝著 增加 i/o bus clock 來改進。&lt;br /&gt;&lt;br /&gt;DDR 的規格，就是這樣。設法從 memory core 一次提出多一點的 data，然後 queue 住，等 i/o 提取。&lt;br /&gt;這樣就可以增加 i/o 的 clock rate.&lt;br /&gt;&lt;br /&gt;RAS - Bank Select。所以 tRAS 就是 Bank open time.&lt;br /&gt;RC - RAW Cycle 。tRC = tRAS + tRP.&lt;br /&gt;Raw Access 的 cycle time ＝RAS pulse width + Precharge latency&lt;br /&gt;RP 就是 precharge time.&lt;br /&gt;&lt;br /&gt;為降低 power ，所以DDR2 由 2.5V 降到 1.8V&lt;br /&gt;工作電壓降低也有助於增加clock rate (voltage swing).&lt;br /&gt;&lt;br /&gt;高速後，layout trace delay 的問題也開始要考慮&lt;br /&gt;&lt;br /&gt;DDR 解決的方法是在 data strobe 前加上 clock forwarding&lt;br /&gt;DDR2 則再加入 different signal 的要求：DQS, /DQS.&lt;br /&gt;&lt;hr /&gt;&lt;a href="http://www.hardwaresecrets.com/article/Understanding-RAM-Timings/26/2"&gt;&lt;br /&gt;&lt;/a&gt;&lt;a href="http://www.hardwaresecrets.com/printpage/Understanding-RAM-Timings/26"&gt;&lt;span style="font-size:130%;"&gt;&lt;b&gt;Understanding RAM Timings&lt;/b&gt;&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;CL  (CAS Latency) 是說，當 Read Cmd 後，需要多少 clock ，memory 的 data 才能 ready。&lt;br /&gt;所以 CL=3 ，代表 read command 後，還要等 3 個 clock ，才能讀 data。&lt;br /&gt;&lt;br /&gt;memory 有所謂的 burst mode，就是當下一個 data 和這一個 data 是連續的時候，下一個 data 不需要等 CL 個clock，可以在下一個 clock 就輸出。&lt;br /&gt;&lt;hr /&gt;DRAM Access 的 sequence 是這樣：&lt;br /&gt;&lt;br /&gt;RAS -- CAS -- CMD -- Data Ready&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;RAS-- CAS 間需要的 clock : tRCD&lt;/li&gt;&lt;li&gt;CAS -- CMD 間需要的 clock : CL&lt;/li&gt;&lt;li&gt;下完 PreCharge Command 後，接受下一個command需要的時間 : tRP&lt;/li&gt;&lt;/ul&gt;ODT - On Deivice Termination&lt;br /&gt;&lt;blockquote&gt;就是把終端電阻放在chip 里，不是 lay在板子上。&lt;br /&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2117270136732158310-8142341135779500822?l=realchecko.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realchecko.blogspot.com/feeds/8142341135779500822/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2117270136732158310&amp;postID=8142341135779500822' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/8142341135779500822'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/8142341135779500822'/><link rel='alternate' type='text/html' href='http://realchecko.blogspot.com/2010/07/ddr.html' title='DDR'/><author><name>Checko</name><uri>http://www.blogger.com/profile/03239306354367907990</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/blogger/669/302/320/IMGP0803.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2117270136732158310.post-3400303946671929441</id><published>2010-07-19T13:14:00.003+08:00</published><updated>2010-07-19T14:08:16.144+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Hardware'/><title type='text'>SDRAM, DDR, and DDRII 示意圖</title><content type='html'>&lt;a href="http://www.lostcircuits.com/mambo//index.php?option=com_content&amp;amp;task=view&amp;amp;id=35&amp;amp;Itemid=60&amp;amp;limit=1&amp;amp;limitstart=1"&gt;這一篇 &lt;/a&gt;有很好的圖示，說明 SDRAM, DDR, DDRII 的 clock 差異&lt;br /&gt;&lt;br /&gt;因為直接連圖不好意思，所以說明一下大概的原理：&lt;br /&gt;&lt;br /&gt;假設 RAM Cell clock 都是 100MHz...&lt;br /&gt;&lt;ul&gt;&lt;li&gt;SDRAM 的 data 輸出和 data clock 的 rising edge 同步，所以也是 100MHz，因為一次一筆，所以不用 buffer 就直接輸出。&lt;br /&gt;&lt;/li&gt;&lt;li&gt;DDR 的 data 輸出和 data clock 的 rising edge, falling edge 都同步，所以一樣用 100MHz，但是因為一個edge 只能 output 一筆，所以內部要先 buffer 一份&lt;/li&gt;&lt;li&gt;DDR II 把輸出clock 增加一倍，而且也是 rising/falling edge 都輸出，所以內部要 buffer 3 份 data&lt;/li&gt;&lt;/ul&gt;... 這樣說起來有點奇怪，還是直接看圖好了..&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/checkoblog/4807267875/" title="IMGP1396 by Checko's Blog Image, on Flickr"&gt;&lt;img src="http://farm5.static.flickr.com/4075/4807267875_744700832b.jpg" width="500" height="375" alt="IMGP1396" /&gt;&lt;/a&gt;&lt;br /&gt;本來以為內部buffer 的 data 用來解釋 CL (data - to CMD delay) ，但是好像不是喔。&lt;br /&gt;內部 buffer 只需要 delay 待會 才要的 data，第一筆 data 還是可以直接 output 出去，不需要 delay 的喔。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2117270136732158310-3400303946671929441?l=realchecko.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realchecko.blogspot.com/feeds/3400303946671929441/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2117270136732158310&amp;postID=3400303946671929441' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/3400303946671929441'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/3400303946671929441'/><link rel='alternate' type='text/html' href='http://realchecko.blogspot.com/2010/07/sdram-ddr-and-ddrii.html' title='SDRAM, DDR, and DDRII 示意圖'/><author><name>Checko</name><uri>http://www.blogger.com/profile/03239306354367907990</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/blogger/669/302/320/IMGP0803.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm5.static.flickr.com/4075/4807267875_744700832b_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2117270136732158310.post-8410736320896832918</id><published>2010-07-19T10:21:00.002+08:00</published><updated>2010-07-19T11:13:43.773+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ARM'/><category scheme='http://www.blogger.com/atom/ns#' term='WindowsCE'/><title type='text'>VFP in CE 6.0</title><content type='html'>有關 CE 6 的 ARM VFP 支援&lt;br /&gt;&lt;br /&gt;這一篇 &lt;a href="http://groups.google.com/group/microsoft.public.windowsce.platbuilder/tree/browse_frm/thread/71dfb4f0da8290b0/d7dcc3ad5d8bded6?rnum=1&amp;amp;_done=%20%20%2Fgroup%2Fmicrosoft.public.windowsce.platbuilder%2Fbrowse_frm%2Fthread%2F71dfb4"&gt;google groupe討論&lt;/a&gt; 說&lt;br /&gt;&lt;blockquote&gt;The VS2005 compiler used by PB for CE6.0 emits no VFP instructions and&lt;br /&gt;unless you implement FPCRT.DLL for an ARM then all CE implementations&lt;br /&gt;are integer (default MS implementation of FPCRT uses software&lt;br /&gt;emulation), even if you have a hardware VFP in your core (e.g. ARM11&lt;br /&gt;or Cortex-A8). To actually use the VFP you must do the following:&lt;br /&gt;&lt;br /&gt;1. Use SYSGEN_OEM_FPCRT - catalog item "OEM Floating Point CRT (ARM&lt;br /&gt;only)&lt;br /&gt;2. Download the VFPv2 library support from the ARM website and&lt;br /&gt;incorporate it into your build:&lt;br /&gt;www.arm.com/products/os/windowsce_vfp_dl.html&lt;br /&gt;&lt;br /&gt;Instructions are included with the download from ARM.&lt;br /&gt;&lt;br /&gt;My tests show a 4x increase in performance on floating point&lt;br /&gt;operations on a release build on an ARM1136JF-S core.&lt;br /&gt;&lt;br /&gt;Andrew. &lt;/blockquote&gt;&lt;br /&gt;也就是說，CE 6 的 VFP driver(?) library f是由 ARM 提供的。&lt;br /&gt;&lt;br /&gt;還有這&lt;a href="http://social.msdn.microsoft.com/Forums/en-US/winembplatdev/thread/90c14df6-24f6-41ac-942b-698c8e625ff5"&gt;一篇 MSDN 討論&lt;/a&gt;，說&lt;br /&gt;&lt;blockquote&gt;The current version of Windows CE supports the ARMV4I architecture. Cortex A8 it's ARMv7 (ARM's naming can be even more confusing than ms one...) and currently the compiler does not use its specific features (NEON, VFP3 etc.).&lt;br /&gt;&lt;br /&gt;The new release of Windows CE (named Windows Embedded Compact 7) will support the ARMv7 architecture.&lt;br /&gt;&lt;br /&gt;Here you can find some information about the new features of this release:&lt;br /&gt;&lt;br /&gt;http://www.microsoft.com/windowsembedded/en-us/products/windowsce/compact7.mspx&lt;br /&gt;&lt;br /&gt;You can download a public beta from connect.microsoft.com.&lt;br /&gt;&lt;br /&gt;If your project has not a very short time frame (you plan to release your device Q2 next year, for example), you may consider using this new release for your development to be able to "unleash" all the power of your CPU core.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Valter Minute&lt;br /&gt;Windows Embedded MVP&lt;br /&gt;http://geekswithblogs.net/WindowsEmbeddedCookbook&lt;/blockquote&gt;&lt;br /&gt;所以你藥用 CE 6 寫 VFP 或是 NEON 的 code 是不可能的，要等 Windows Embedded 7.&lt;br /&gt;&lt;br /&gt;總合起來，可以要看一下 msdn :&lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ee479873.aspx"&gt;Including a Replacement Floating Point C Run-Time Library in a Run-Time Image&lt;/a&gt;&lt;br /&gt;還有&lt;a href="http://evmonbeagle.codeplex.com/wikipage?title=Implementing%20CRT%20Vector%20Floating%20Point%20Support&amp;amp;referringTitle=Documentation"&gt;這一篇的實做&lt;/a&gt;  copy 下來，免得不見：&lt;hr /&gt;&lt;br /&gt;Download and install the "ARM® VFPv2 Floating Point Support Library"  from ARM.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;If building with Platform Builder to build your  OS image&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;simply add the FPCRT project to your solution, and  set the following catalog feature&lt;br /&gt;&lt;br /&gt;&lt;b&gt;EVM_3530\Core  OS\CEBASE\Applications and Services Development\C Libraries and  Runtimes\OEM Floating Point CRT (ARM only)&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;A SYSGEN is  required.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;If building without Platform Builder, ensure the  SYSGEN variable is set.  I added the following to my "tiny&lt;/i&gt;kernel  DEBUG.bat" file.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;set SYSGEN_OEM_FPCRT=1&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Add entries to platform.bib&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;fpcrt.dll            $(_FLATRELEASEDIR)\fpcrt.dll               NK  SH&lt;br /&gt;k.fpcrt.dll          $(_FLATRELEASEDIR)\fpcrt.dll               NK  SHMK&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;I copied the contents of %&lt;i&gt;WINCEROOT%\OTHERS\ARM\VFPv2\src\ARM&lt;/i&gt;VFPv2\obj  to my prebuilt directory.&lt;br /&gt;Then copied the DLL project to my %&lt;i&gt;WINCEROOT%\OTHERS\ARM\VFPv2\src\FPCRT  to my %&lt;/i&gt;PLATFORMROOT%\%_TGTPLAT%\src\drivers directory.&lt;br /&gt;Modified  dirs, and updated sources to point to new library location.&lt;br /&gt;&lt;br /&gt;A  SYSGEN is required.&lt;br /&gt;&lt;h2&gt;&lt;b&gt;Visual Studio 2008 VFP Support&lt;/b&gt;&lt;/h2&gt; VS2008 ARM compiler supports emulated and hardware floating point.  To  enable hardware based Vector Floating point you need to use this option&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;/QRfpe-&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;This means &lt;b&gt;not floating point emulation&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;If you  use&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;/QRfpe&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;it will generate software floating point, as it means &lt;b&gt;floating  point emulation&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://support.microsoft.com/kb/947894" class="externalLink"&gt;Microsoft  KB 947894&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Note:  This is not related to NEON support&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;有關 multimedia (video/audio/graphic) 部份，ARM 有提供 OpenMax 的實做 (實際用 ARM11, Cortex A8 feature optimize) 的 library&lt;br /&gt;&lt;a href="http://www.arm.com/community/multimedia/standards-apis.php"&gt;Khronos Standards&lt;/a&gt;&lt;br /&gt;...但是依照慣例，ARM的網頁連結 半年後一定又會改 &gt;_&lt;&lt;br /&gt;&lt;br /&gt;要註冊才能download..&lt;br /&gt;喔？是以 library 的方式提供，用 realview compile (當然不是 VS...)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2117270136732158310-8410736320896832918?l=realchecko.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realchecko.blogspot.com/feeds/8410736320896832918/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2117270136732158310&amp;postID=8410736320896832918' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/8410736320896832918'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/8410736320896832918'/><link rel='alternate' type='text/html' href='http://realchecko.blogspot.com/2010/07/vfp-in-ce-60.html' title='VFP in CE 6.0'/><author><name>Checko</name><uri>http://www.blogger.com/profile/03239306354367907990</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/blogger/669/302/320/IMGP0803.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2117270136732158310.post-6822529725832838408</id><published>2010-07-12T11:42:00.003+08:00</published><updated>2010-07-12T18:19:44.735+08:00</updated><title type='text'></title><content type='html'>取得 4 種 size/範圍 的 DC (Device Context)&lt;br /&gt;&lt;ul&gt;&lt;li&gt;BeginPaint(hwnd, &amp;amp;ps) : 這個範圍最小，只有視窗中，client 的 "invalide" 區域，可以畫。&lt;/li&gt;&lt;li&gt;GetDC(hwnd) : 整個 Client area (也就是不含 menu, toolbar, statusbar,...)&lt;/li&gt;&lt;li&gt;GetWindowDC(hwnd) : 整個視窗 (含 client area, menu, toolbar , statusbar..)&lt;/li&gt;&lt;li&gt;CreateDC("DISPLAY",NULL,NULL,NULL) : 整個螢幕&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2117270136732158310-6822529725832838408?l=realchecko.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realchecko.blogspot.com/feeds/6822529725832838408/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2117270136732158310&amp;postID=6822529725832838408' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/6822529725832838408'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/6822529725832838408'/><link rel='alternate' type='text/html' href='http://realchecko.blogspot.com/2010/07/4-size-dc-device-context-beginpainthwnd.html' title=''/><author><name>Checko</name><uri>http://www.blogger.com/profile/03239306354367907990</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/blogger/669/302/320/IMGP0803.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2117270136732158310.post-2043675340792559892</id><published>2010-07-08T16:09:00.003+08:00</published><updated>2010-07-08T16:16:12.304+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WindowsCE'/><category scheme='http://www.blogger.com/atom/ns#' term='Microsoft'/><title type='text'>Speed up Windows CE boot time</title><content type='html'>以第一個 application 畫面顯示出來為準...&lt;br /&gt;&lt;br /&gt;首先是,,改用 XIP。&lt;br /&gt;&lt;blockquote&gt;XIP 的話，NK 被切成 tiny 和 BINFS 兩部份， bootloader 只要load binfs 就可以開始啟動 os 了，不用把整個 OS bin 都 load 進來 才動作，所以可以比較快。&lt;/blockquote&gt;&lt;br /&gt;用 msdn 的 delay load driver - busenum2&lt;br /&gt;&lt;blockquote&gt;一些不急的 driver 等 gwes , ap load 完後再load。這樣 就可以比較快進入 ap.&lt;/blockquote&gt;&lt;br /&gt;bootloader&lt;br /&gt;&lt;blockquote&gt;直接 load os，不要 作 2 step loading -- load eboot, eboot load os。這樣可以比較快。&lt;/blockquote&gt;&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;但是怎麼作，好像都要 8 sec 以上，要做出 5 sec 開機好像不可能喔...&lt;br /&gt;&lt;br /&gt;bootloader load tinybin, binfs 啟動就花 3 sec&lt;br /&gt;load gwes, gmtt_o 又花 1.6 sec 以上&lt;br /&gt;&lt;br /&gt;再加一些其他啦里啦鉔的....&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2117270136732158310-2043675340792559892?l=realchecko.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realchecko.blogspot.com/feeds/2043675340792559892/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2117270136732158310&amp;postID=2043675340792559892' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/2043675340792559892'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/2043675340792559892'/><link rel='alternate' type='text/html' href='http://realchecko.blogspot.com/2010/07/speed-up-windows-ce-boot-time.html' title='Speed up Windows CE boot time'/><author><name>Checko</name><uri>http://www.blogger.com/profile/03239306354367907990</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/blogger/669/302/320/IMGP0803.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2117270136732158310.post-6999106759148086874</id><published>2010-07-05T18:37:00.002+08:00</published><updated>2010-07-06T11:34:19.575+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WindowsCE'/><category scheme='http://www.blogger.com/atom/ns#' term='Workrecord'/><category scheme='http://www.blogger.com/atom/ns#' term='MSDN'/><title type='text'>再作 celog.dll - boot time</title><content type='html'>因為要作 msdn 那個 delay load driver 的測試，所以把 celog 也 enable 起來：&lt;br /&gt;&lt;br /&gt;在 os project 勾選&lt;br /&gt;&lt;ul&gt;&lt;li&gt;enable event tracking during boot&lt;/li&gt;&lt;li&gt;flush tracked event to release directory&lt;/li&gt;&lt;/ul&gt;然後 修改 makexip.js，把 celog.dll 放到 boot region。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;參考 http://msdn.microsoft.com/en-us/library/aa450700.aspx&lt;br /&gt;設定&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;[HKEY_LOCAL_MACHINE\System\CeLog]&lt;br /&gt;    "Transport"="LocalFile"&lt;br /&gt;    "FileName"="\\celog.clg"&lt;br /&gt;    "ZoneCE"=dword:00014040&lt;br /&gt;    "FlushTimeout"=dword:1F4&lt;br /&gt;  &lt;/pre&gt;&lt;br /&gt;log 到 ram, 每 500ms flush 到 ram file一次 (避免 data loss)&lt;br /&gt;log 的東西：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;CELZONE_BOOT_TIME     0x00010000 -- 包含 boot event&lt;br /&gt;&lt;/li&gt;&lt;li&gt;CELZONE_LOADER      0x00004000 -- 包含 load module (dll) 的 event&lt;br /&gt;&lt;/li&gt;&lt;li&gt;CELZONE_PROCESS    0x00000040 -- 包含 create process (exe) 的 event&lt;/li&gt;&lt;/ul&gt;重 build 開機後，就可以看到  celog.clg 在 // 下， copy 到 SD。&lt;br /&gt;開啟 build environment:&lt;br /&gt;&lt;pre&gt; readlog celog.clg output.txt&lt;/pre&gt;把 clg 轉為文字。&lt;br /&gt;&lt;br /&gt;就可以看到 load module 和 create process event 的時間了。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2117270136732158310-6999106759148086874?l=realchecko.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realchecko.blogspot.com/feeds/6999106759148086874/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2117270136732158310&amp;postID=6999106759148086874' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/6999106759148086874'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/6999106759148086874'/><link rel='alternate' type='text/html' href='http://realchecko.blogspot.com/2010/07/celogdll-boot-time.html' title='再作 celog.dll - boot time'/><author><name>Checko</name><uri>http://www.blogger.com/profile/03239306354367907990</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/blogger/669/302/320/IMGP0803.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2117270136732158310.post-6718178595783339328</id><published>2010-07-05T16:39:00.002+08:00</published><updated>2010-07-05T16:47:32.001+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WindowsCE'/><category scheme='http://www.blogger.com/atom/ns#' term='MSDN'/><category scheme='http://www.blogger.com/atom/ns#' term='Microsoft'/><title type='text'>clone public code</title><content type='html'>大概就是用 sysgen_capture 這個 tool  來作：&lt;br /&gt;&lt;br /&gt;首先找到 sysgen 的 targetname。假設是 celogflush 好了&lt;br /&gt;* 在 platform/yourbspname 下 create 一個 folder : celogflush&lt;br /&gt;* 在 celogflush 下： sysgen_capture -p common celogflush&lt;br /&gt;* copy public/common/sdk/samples/celog/flush/celogflush/flush.c 過來&lt;br /&gt;* 因為 celogflush/sources 有列 include path : ..，所以把 ../*.h 也 copy 過來&lt;br /&gt;* rename 剛剛 sysgen_capture 產生的 sources.celogflush 為 sources&lt;br /&gt;* 修改 sources，把 source = 加上 flush.c&lt;br /&gt;* copy Makefile 過來&lt;br /&gt;這樣就可以下 build，產生 celogflush.exe 了&lt;br /&gt;&lt;br /&gt;主要大概是用 sysgen_caputre 產生 target 的 source 檔，這樣才知道 target 用的 library 有哪些。&lt;br /&gt;&lt;br /&gt;把 source file copy 過來，修改 sources。&lt;br /&gt;雖然 library 中會有同樣的 sample，但是大蓋會以 source  = 列出的優先(吧?)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2117270136732158310-6718178595783339328?l=realchecko.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realchecko.blogspot.com/feeds/6718178595783339328/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2117270136732158310&amp;postID=6718178595783339328' title='2 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/6718178595783339328'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/6718178595783339328'/><link rel='alternate' type='text/html' href='http://realchecko.blogspot.com/2010/07/clone-public-code.html' title='clone public code'/><author><name>Checko</name><uri>http://www.blogger.com/profile/03239306354367907990</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/blogger/669/302/320/IMGP0803.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2117270136732158310.post-7320554821923922182</id><published>2010-06-29T18:05:00.004+08:00</published><updated>2010-06-29T18:14:09.027+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WindowsCE'/><category scheme='http://www.blogger.com/atom/ns#' term='Thanks'/><category scheme='http://www.blogger.com/atom/ns#' term='MSDN'/><category scheme='http://www.blogger.com/atom/ns#' term='Microsoft'/><title type='text'>The master makefile of Windows CE</title><content type='html'>真是太感謝 &lt;a href="http://www.blogger.com/profile/04123884669201226100"&gt;Kun-Yi &lt;/a&gt;啦！&lt;br /&gt;&lt;br /&gt;從我進來這裡，RBT 就展示他sysgen XXX 的能力，讓我門少build 一些 code，少浪費一些時間。&lt;br /&gt;但是我問他，怎麼知道 改  OOO 時要用 XXX ?&lt;br /&gt;他也說不出個所以然來 &lt;blockquote&gt;不然就是他不願意說...&lt;/blockquote&gt;所以我就不斷的在找這個謎.....(找了好幾年..)&lt;br /&gt;&lt;br /&gt;後來，上一篇，偉大而又無私的 資深 Windows CE 專家 Kun-Ki 直接給出答案：&lt;br /&gt;就是 &lt;span style="font-weight: bold;font-size:130%;" &gt;PUBLIC\COMMON\CESYSGEN\makefile&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;打開來看，果然有所有 target 的 name 和 dependency..&lt;br /&gt;&lt;br /&gt;真是令人感動！！&lt;br /&gt;&lt;br /&gt;終於看到 CE 的 master makefile ....&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2117270136732158310-7320554821923922182?l=realchecko.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realchecko.blogspot.com/feeds/7320554821923922182/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2117270136732158310&amp;postID=7320554821923922182' title='3 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/7320554821923922182'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/7320554821923922182'/><link rel='alternate' type='text/html' href='http://realchecko.blogspot.com/2010/06/master-makefile-of-windows-ce.html' title='The master makefile of Windows CE'/><author><name>Checko</name><uri>http://www.blogger.com/profile/03239306354367907990</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/blogger/669/302/320/IMGP0803.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2117270136732158310.post-5142704839828140473</id><published>2010-06-28T16:17:00.005+08:00</published><updated>2010-06-28T18:51:52.729+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WindowsCE'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><category scheme='http://www.blogger.com/atom/ns#' term='MSDN'/><category scheme='http://www.blogger.com/atom/ns#' term='Microsoft'/><title type='text'>output message on device on/off - sysgen and private</title><content type='html'>在查 system poweron/off 時，有時要列印出所以 driver 的 on/off message。&lt;br /&gt;一個一個加很麻煩，可以直接在 device manger 加：&lt;pre&gt;C:\WinCE600\PRIVATE\WINCEOS\COREOS\DEVICE\DEVCORE\Devapi.c&lt;/pre&gt;裡面的 DevMgrPowerOffHandler:&lt;pre&gt;原來的&lt;pre&gt;                DEBUGMSG(ZONE_PNP,(TEXT("Calling \'%s\' PowerDown at 0x%x\r\n"),&lt;br /&gt;&lt;/pre&gt;改為強制輸出的 RETAILMSG 就可以。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;在該 folder build 完後，下 sysgen -p common devmgr 後，就可以makeimg 了。&lt;br /&gt;&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;-p common  的意思是  "在 wince600\public\common 下"&lt;br /&gt;-p option 好像是指 public 下的 folder。&lt;br /&gt;所以 sysgen -p common devmgr 的意思是要 sysgen public\common\ 下的 devmgr&lt;br /&gt;-- 雖然不知道怎麼看出common folder 里有 devmgr 這個 target @_@..&lt;br /&gt;&lt;br /&gt;可以測試一下：&lt;br /&gt;sysgen -p directx 會 build 出 public\direct 下所有的 directx example&lt;br /&gt;如果只要 build mosquito:&lt;br /&gt;sysgen -p directx mosquito&lt;br /&gt;&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;sysgen 也是一個 batch 檔...&lt;br /&gt;&lt;br /&gt;只是我一直找不到那些 sysgen 的 "target" 到底在哪裡...&lt;br /&gt;&lt;hr /&gt; 關於 sysgen 的target ..大概可以到 retail folder 去找,, dll 或是 exe。&lt;br /&gt;用 cesysgen_capture，會產生 該 project 的 sources file，然後去找該 target 是由哪些&lt;br /&gt;library build 出來的。&lt;pre&gt;cesysgen_capture -p common devmgr &lt;/pre&gt;會產生一個 sources.devmgr&lt;br /&gt;&lt;br /&gt;sysgen_capture device&lt;br /&gt;&lt;br /&gt;會產生一堆 (相依?) 的 source 檔：&lt;br /&gt;&lt;/pre&gt;&lt;ul&gt;&lt;li&gt;sources.ceddk  -- ceddk.lib&lt;br /&gt;&lt;/li&gt;&lt;li&gt;sources.devmgr -- devmgr.lib&lt;br /&gt;&lt;/li&gt;&lt;li&gt;sources.pm -- pm.lib&lt;br /&gt;&lt;/li&gt;&lt;li&gt;sources.udevice -- udevice.exe&lt;/li&gt;&lt;li&gt;sources.device -- device.exe&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2117270136732158310-5142704839828140473?l=realchecko.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realchecko.blogspot.com/feeds/5142704839828140473/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2117270136732158310&amp;postID=5142704839828140473' title='2 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/5142704839828140473'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/5142704839828140473'/><link rel='alternate' type='text/html' href='http://realchecko.blogspot.com/2010/06/output-message-on-device-onoff-sysgen.html' title='output message on device on/off - sysgen and private'/><author><name>Checko</name><uri>http://www.blogger.com/profile/03239306354367907990</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/blogger/669/302/320/IMGP0803.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2117270136732158310.post-4642759005867077394</id><published>2010-06-24T10:58:00.005+08:00</published><updated>2010-08-12T16:58:48.666+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Software'/><category scheme='http://www.blogger.com/atom/ns#' term='WTL'/><title type='text'>operator overwrite : conversion function</title><content type='html'>在WTL 的source code 看到：&lt;code&gt;&lt;br /&gt;operator HBITMAP() const { return m_hBitmap; }&lt;br /&gt;&lt;/code&gt; 所以不知道是哪一個 operator 被 overwrite。&lt;blockquote&gt;&lt;br /&gt;有 HBITMAP 這個 operator 嗎？&lt;/blockquote&gt;&lt;br /&gt;的確，就是 conversion function&lt;br /&gt;&lt;br /&gt;自動型別轉換.&lt;code&gt;&lt;br /&gt;CBitmap theBitmap;&lt;br /&gt;HBITMAP hBitmap;&lt;br /&gt;&lt;br /&gt;hBitmap = theBitmap; // 等於是 hBitmap = (HBITMAP)theBitmap;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;這個就是 conversion&lt;br /&gt;上面的 example 會讓 hBitmap  = theBitmap.m_hBitmap;&lt;br /&gt;&lt;br /&gt;... 好像也是為了好看...好吧，還有方便..&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2117270136732158310-4642759005867077394?l=realchecko.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realchecko.blogspot.com/feeds/4642759005867077394/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2117270136732158310&amp;postID=4642759005867077394' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/4642759005867077394'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/4642759005867077394'/><link rel='alternate' type='text/html' href='http://realchecko.blogspot.com/2010/06/operator-overwrite-conversion-function.html' title='operator overwrite : conversion function'/><author><name>Checko</name><uri>http://www.blogger.com/profile/03239306354367907990</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/blogger/669/302/320/IMGP0803.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2117270136732158310.post-3557915590176425019</id><published>2010-06-24T10:23:00.005+08:00</published><updated>2010-07-29T15:57:00.334+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><category scheme='http://www.blogger.com/atom/ns#' term='Software'/><category scheme='http://www.blogger.com/atom/ns#' term='MSDN'/><category scheme='http://www.blogger.com/atom/ns#' term='Microsoft'/><category scheme='http://www.blogger.com/atom/ns#' term='WTL'/><title type='text'>smart_ptr in WTL CBitmap</title><content type='html'>看到 WTL 的 AtlCopyBitmap ( ) 中，有：&lt;code&gt;&lt;br /&gt;CBitmap bmNew = NULL;&lt;br /&gt;..&lt;br /&gt;bmNew.CreateCompatibleBitmap( ..&lt;br /&gt;&lt;/code&gt;覺得很奇怪。&lt;br /&gt;所以看一下 CBitmap 的 implement  (在 atlgdi.h),, 有這一段：&lt;code&gt;&lt;br /&gt;    CBitmapT&amp;lt;t_bManaged&amp;gt;&amp;amp; operator =(HBITMAP hBitmap)&lt;br /&gt;    {&lt;br /&gt;        Attach(hBitmap);&lt;br /&gt;        return *this;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    void Attach(HBITMAP hBitmap)&lt;br /&gt;    {&lt;br /&gt;        if(t_bManaged &amp;amp;&amp;amp; m_hBitmap != NULL&amp;amp;&amp;amp; m_hBitmap != hBitmap)&lt;br /&gt;            ::DeleteObject(m_hBitmap);&lt;br /&gt;        m_hBitmap = hBitmap;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    HBITMAP Detach()&lt;br /&gt;    {&lt;br /&gt;        HBITMAP hBitmap = m_hBitmap;&lt;br /&gt;        m_hBitmap = NULL;&lt;br /&gt;        return hBitmap;&lt;br /&gt;    }&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;所以是 CBitmap overwrite 了 operator "="&lt;br /&gt;配合 attach, detach 來看，這有點像 smart_ptr 的作法。... 雖然他是handle wrapper，不是 pointer wrapper..&lt;blockquote&gt;&lt;br /&gt;typedef CBitmapT&lt;true&gt;    CBitmap;&lt;br /&gt;true 代表 memory management 由 class 自己 handle。&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;所以那個  CBitmap bmNew = NULL 代表將 bmNew 的 member m_hBitmap 設為 NULL。&lt;br /&gt;&lt;blockquote&gt;這應該只是為了好看吧..否則寫兩行也可以呀：&lt;br /&gt;CBitmap bmNew;&lt;br /&gt;bmNew.m_hBitmap = NULL;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2117270136732158310-3557915590176425019?l=realchecko.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realchecko.blogspot.com/feeds/3557915590176425019/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2117270136732158310&amp;postID=3557915590176425019' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/3557915590176425019'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/3557915590176425019'/><link rel='alternate' type='text/html' href='http://realchecko.blogspot.com/2010/06/smartptr-in-wtl-cbitmap.html' title='smart_ptr in WTL CBitmap'/><author><name>Checko</name><uri>http://www.blogger.com/profile/03239306354367907990</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/blogger/669/302/320/IMGP0803.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2117270136732158310.post-4218911681358756129</id><published>2010-06-23T19:20:00.003+08:00</published><updated>2010-06-23T19:25:28.333+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WindowsCE'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><category scheme='http://www.blogger.com/atom/ns#' term='MSDN'/><title type='text'>GDI - SelectObject</title><content type='html'>DC (Device Context) 是畫布&lt;br /&gt;一堆 GDI 物件：Pen, Brush, Font, Bitmap, ..都是可以畫在畫布(DC)上的物件。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;所以要用這些 GDI 畫圖時，要用 SelectObject(DC_A,Object_A) ，告訴kernel 我要 DC_A上用Object_A 畫圖了。&lt;br /&gt;&lt;br /&gt;SelectObject( ) 會傳回那個 DC 原來的 Object 內容，讓你畫完後，可以 Select 回來原來物件。&lt;br /&gt;&lt;blockquote&gt;例如原來是 12 點字，後來用 14 點字寫幾個字後，選回原來的 12點字&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;... 希望這個想法可以用....&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2117270136732158310-4218911681358756129?l=realchecko.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realchecko.blogspot.com/feeds/4218911681358756129/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2117270136732158310&amp;postID=4218911681358756129' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/4218911681358756129'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/4218911681358756129'/><link rel='alternate' type='text/html' href='http://realchecko.blogspot.com/2010/06/gdi-selectobject.html' title='GDI - SelectObject'/><author><name>Checko</name><uri>http://www.blogger.com/profile/03239306354367907990</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/blogger/669/302/320/IMGP0803.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2117270136732158310.post-6903055221584127899</id><published>2010-06-17T18:48:00.003+08:00</published><updated>2010-06-17T18:52:30.962+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WindowsCE'/><category scheme='http://www.blogger.com/atom/ns#' term='Notes'/><category scheme='http://www.blogger.com/atom/ns#' term='Embedded'/><title type='text'>show progress bar when booting - CE</title><content type='html'>&lt;a href="http://www.cnblogs.com/we-hjb/archive/2010/03/05/1679472.html"&gt;這一篇 &lt;/a&gt;說道如何作 開機動畫。&lt;br /&gt;&lt;br /&gt;他的作法是在 CE driver 中作，他選 backlight driver。&lt;br /&gt;-- 應該要把 backlight driver 放在前面一點。&lt;br /&gt;&lt;br /&gt;在 backlight driver 啟動(Init or PowerOn ?)的時候 create 一個 thread，定時的 update lcd buffer。一直到 Stopflash 的 event 送達。&lt;br /&gt;&lt;br /&gt;Stop event 可以由 shell 送出。代表開機完成了。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;問題： Driver PowerUp/Down 時好像是 single thread，可以create thread 嗎？&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2117270136732158310-6903055221584127899?l=realchecko.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realchecko.blogspot.com/feeds/6903055221584127899/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2117270136732158310&amp;postID=6903055221584127899' title='4 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/6903055221584127899'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/6903055221584127899'/><link rel='alternate' type='text/html' href='http://realchecko.blogspot.com/2010/06/show-progress-bar-when-booting-ce.html' title='show progress bar when booting - CE'/><author><name>Checko</name><uri>http://www.blogger.com/profile/03239306354367907990</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/blogger/669/302/320/IMGP0803.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2117270136732158310.post-1020818350223986405</id><published>2010-06-17T17:50:00.003+08:00</published><updated>2010-08-12T17:00:57.624+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Software'/><title type='text'>auto_ptr</title><content type='html'>auto_ptr 是 smart_ptr 的一種。&lt;br /&gt;&lt;br /&gt;利用 auto variable 在離開 scope 會自動被 delete 的特性。&lt;br /&gt;讓 一般的 pointer variable 在 new object 後，也有這樣的特性。&lt;br /&gt;這樣，就不必特地在 function return 前 手動 call delete 了。&lt;br /&gt;&lt;br /&gt;參考 &lt;a href="http://ootips.org/yonat/4dev/smart-pointers.html"&gt;http://ootips.org/yonat/4dev/smart-pointers.html&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;原來 pointer 的寫法：&lt;br /&gt;&lt;code&gt;void foo()&lt;br /&gt;{&lt;br /&gt;    MyClass* p(new MyClass);&lt;br /&gt;    p-&amp;gt;DoSomething();&lt;br /&gt;    delete p;&lt;br /&gt;}&lt;/code&gt;&lt;br /&gt;改用 auto_ptr 後，可以這樣寫：&lt;br /&gt;&lt;code&gt;void foo()&lt;br /&gt;{&lt;br /&gt;    auto_ptr&amp;lt;MyClass&amp;gt; p(new MyClass);&lt;br /&gt;    p-&amp;gt;DoSomething();&lt;br /&gt;}&lt;/code&gt;&lt;br /&gt;針對 memory 管理這一點，auto_ptr 還提供一些其他的功能：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;指定；當一個 ptr = 另一個 ptr，原來 ptr 的 object 會先 delete 掉。&lt;/li&gt;&lt;li&gt;exception handling : 在所有動作作try-catch，這樣當 exception 時，還可以正常 free 掉 object&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2117270136732158310-1020818350223986405?l=realchecko.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realchecko.blogspot.com/feeds/1020818350223986405/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2117270136732158310&amp;postID=1020818350223986405' title='2 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/1020818350223986405'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/1020818350223986405'/><link rel='alternate' type='text/html' href='http://realchecko.blogspot.com/2010/06/autoptr.html' title='auto_ptr'/><author><name>Checko</name><uri>http://www.blogger.com/profile/03239306354367907990</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/blogger/669/302/320/IMGP0803.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2117270136732158310.post-2187998107748332636</id><published>2010-06-15T14:08:00.002+08:00</published><updated>2010-06-17T18:58:50.152+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WindowsCE'/><category scheme='http://www.blogger.com/atom/ns#' term='MEMO'/><category scheme='http://www.blogger.com/atom/ns#' term='Software'/><category scheme='http://www.blogger.com/atom/ns#' term='MSDN'/><title type='text'>Bookmark - Monte Carlo Profiler for CE 6.0 (MSDN)</title><content type='html'>http://msdn.microsoft.com/en-US/library/ee481579.aspx 這一篇 MSDN 有講 CE 6.0 Monte Carlo Profiler 的作法，可以試試看。&lt;br /&gt;&lt;br /&gt;用 target control 下 prof 可以看到help&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2117270136732158310-2187998107748332636?l=realchecko.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realchecko.blogspot.com/feeds/2187998107748332636/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2117270136732158310&amp;postID=2187998107748332636' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/2187998107748332636'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/2187998107748332636'/><link rel='alternate' type='text/html' href='http://realchecko.blogspot.com/2010/06/bookmark-monte-carlo-profiler-for-ce-60.html' title='Bookmark - Monte Carlo Profiler for CE 6.0 (MSDN)'/><author><name>Checko</name><uri>http://www.blogger.com/profile/03239306354367907990</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/blogger/669/302/320/IMGP0803.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2117270136732158310.post-2648794897167886222</id><published>2010-06-14T18:42:00.003+08:00</published><updated>2010-06-14T18:55:47.804+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WindowsCE'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><category scheme='http://www.blogger.com/atom/ns#' term='Software'/><category scheme='http://www.blogger.com/atom/ns#' term='Microsoft'/><category scheme='http://www.blogger.com/atom/ns#' term='WTL'/><title type='text'>WTL - request to send WM_PAINT message</title><content type='html'>WM_PAIN message 被送出的機會有：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;OS 發現你的視窗區域需要重劃了，例如：被其他windows 蓋過，size 改變..&lt;/li&gt;&lt;li&gt;你自己呼叫 function，叫 OS 送 message 給你&lt;/li&gt;&lt;/ul&gt;WTL 里要呼叫 Invalidate( )，實際上是 ATL implement 的，不是 WTL。&lt;br /&gt;在 altwin.h 。&lt;br /&gt;實際上他也是呼叫 InvalidateRect( ) 而已。&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;順便寫一下 CPaintDC&lt;br /&gt;&lt;br /&gt;原本在 Win32SDK 中，要對 DC 作動作，都要 beginpaint, get xx 等一堆，然後畫完又要  endpaint.. etc.&lt;br /&gt;&lt;br /&gt;CPaintDC 就把剛剛的動作包裝起來，在 constructor 中作 BeginPain，在Destrctor 作 EndPaint。&lt;br /&gt;&lt;br /&gt;又 CPaintDC 繼承自 CDCT。&lt;br /&gt;&lt;br /&gt;CDCT 是 WTL 把所有 Win32 的 DC 繪圖包裝起來的 class。&lt;br /&gt;所以一旦生成 CPaintDC 後，就可以任意使用 DC繪圖 function 了。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2117270136732158310-2648794897167886222?l=realchecko.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realchecko.blogspot.com/feeds/2648794897167886222/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2117270136732158310&amp;postID=2648794897167886222' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/2648794897167886222'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/2648794897167886222'/><link rel='alternate' type='text/html' href='http://realchecko.blogspot.com/2010/06/wtl-request-to-send-wmpaint-message.html' title='WTL - request to send WM_PAINT message'/><author><name>Checko</name><uri>http://www.blogger.com/profile/03239306354367907990</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/blogger/669/302/320/IMGP0803.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2117270136732158310.post-1637827290253206100</id><published>2010-06-10T11:33:00.003+08:00</published><updated>2010-08-10T14:36:40.378+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WindowsCE'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><category scheme='http://www.blogger.com/atom/ns#' term='Software'/><category scheme='http://www.blogger.com/atom/ns#' term='Microsoft'/><category scheme='http://www.blogger.com/atom/ns#' term='WTL'/><title type='text'>Simple Dialog Program with WTL</title><content type='html'>一個簡單的 Dialog 程式：&lt;br /&gt;main.cpp:&lt;br /&gt;&lt;code&gt;#pragma once&lt;br /&gt;#define WINVER 0x0420&lt;br /&gt;&lt;br /&gt;#include &amp;lt;atlbase.h&amp;gt;&lt;br /&gt;#include &amp;lt;atlapp.h&amp;gt;&lt;br /&gt;#include &amp;lt;atlwin.h&amp;gt;&lt;br /&gt;&lt;br /&gt;#include "resource.h"&lt;br /&gt;&lt;br /&gt;class CMainDialog : public CDialogImpl&amp;lt;CMainDialog&amp;gt;&lt;br /&gt;{&lt;br /&gt;public:&lt;br /&gt;enum { IDD = IDD_MAINDLG };&lt;br /&gt;&lt;br /&gt;BEGIN_MSG_MAP(CMainDialog)&lt;br /&gt; COMMAND_ID_HANDLER(IDCANCEL, OnCancel)&lt;br /&gt;END_MSG_MAP()&lt;br /&gt;&lt;br /&gt;LRESULT OnCancel(WORD,WORD wID,HWND,BOOL&amp;amp;)&lt;br /&gt;{&lt;br /&gt; ::PostQuitMessage(wID);&lt;br /&gt; return 0;&lt;br /&gt;}&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;CAppModule _Module;&lt;br /&gt;&lt;br /&gt;int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE,LPTSTR lpstrCmdLine, int nCmdShow)&lt;br /&gt;{&lt;br /&gt;HRESULT hRes = ::CoInitialize(NULL);&lt;br /&gt;&lt;br /&gt;::DefWindowProc(NULL,0,0,0L);&lt;br /&gt;&lt;br /&gt;AtlInitCommonControls(NULL);&lt;br /&gt;&lt;br /&gt;hRes = _Module.Init(NULL,hInstance);&lt;br /&gt;&lt;br /&gt;CMainDialog dlgMain;&lt;br /&gt;hRes = dlgMain.DoModal();&lt;br /&gt;&lt;br /&gt;_Module.Term();&lt;br /&gt;::CoUninitialize();&lt;br /&gt;&lt;br /&gt;return hRes;&lt;br /&gt;}&lt;/code&gt;&lt;br /&gt;resource.h&lt;br /&gt;&lt;code&gt;#define IDD_MAINDLG                     101&lt;br /&gt;&lt;br /&gt;// Next default values for new objects&lt;br /&gt;//&lt;br /&gt;#ifdef APSTUDIO_INVOKED&lt;br /&gt;#ifndef APSTUDIO_READONLY_SYMBOLS&lt;br /&gt;#define _APS_NEXT_RESOURCE_VALUE        102&lt;br /&gt;#define _APS_NEXT_COMMAND_VALUE         40001&lt;br /&gt;#define _APS_NEXT_CONTROL_VALUE         1001&lt;br /&gt;#define _APS_NEXT_SYMED_VALUE           101&lt;br /&gt;#endif&lt;br /&gt;#endif&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;resource.rc 就是一個 dialog，沒有 button。&lt;br /&gt;&lt;hr&gt;&lt;br /&gt;奇怪，現在我自己照著作，反而要改這樣：&lt;br /&gt;.c&lt;br /&gt;&lt;code&gt;#pragma once&lt;br /&gt;#define WINVER 0x0600&lt;br /&gt;&lt;br /&gt;#include &amp;lt;atlbase.h&amp;gt;&lt;br /&gt;#include &amp;lt;atlapp.h&amp;gt;&lt;br /&gt;#include &amp;lt;atlwin.h&amp;gt;&lt;br /&gt;&lt;br /&gt;#include &amp;quot;resource.h&amp;quot;&lt;br /&gt;&lt;br /&gt;class CMainDialog : public CDialogImpl&amp;lt;CMainDialog&amp;gt;&lt;br /&gt;{&lt;br /&gt;public:&lt;br /&gt; enum { IDD = IDD_DIALOG1 };&lt;br /&gt;&lt;br /&gt; BEGIN_MSG_MAP(CMainDialog)&lt;br /&gt;  COMMAND_ID_HANDLER(IDCANCEL, OnCancel)&lt;br /&gt; END_MSG_MAP()&lt;br /&gt;&lt;br /&gt; LRESULT OnCancel(WORD,WORD wID,HWND, BOOL&amp;amp;)&lt;br /&gt; {&lt;br /&gt;  ::PostQuitMessage(wID);&lt;br /&gt;  return 0;&lt;br /&gt; }&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;CAppModule _Module;&lt;br /&gt;&lt;br /&gt;int WINAPI _tWinMain(HINSTANCE hInstance,HINSTANCE,LPTSTR lpstrCmdLine,int nCmdShow)&lt;br /&gt;{&lt;br /&gt; HRESULT hRes = ::CoInitializeEx(NULL,COINIT_MULTITHREADED);&lt;br /&gt; ::DefWindowProc(NULL,0,0,0L);&lt;br /&gt; AtlInitCommonControls(NULL);&lt;br /&gt; hRes = _Module.Init(NULL,hInstance);&lt;br /&gt;&lt;br /&gt; CMainDialog dlgMain;&lt;br /&gt; hRes = dlgMain.DoModal();&lt;br /&gt; ::CoUninitialize();&lt;br /&gt;&lt;br /&gt; return hRes;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;.h 大概就跟上面一樣。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2117270136732158310-1637827290253206100?l=realchecko.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realchecko.blogspot.com/feeds/1637827290253206100/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2117270136732158310&amp;postID=1637827290253206100' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/1637827290253206100'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/1637827290253206100'/><link rel='alternate' type='text/html' href='http://realchecko.blogspot.com/2010/06/simple-dialog-program-with-wtl.html' title='Simple Dialog Program with WTL'/><author><name>Checko</name><uri>http://www.blogger.com/profile/03239306354367907990</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/blogger/669/302/320/IMGP0803.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2117270136732158310.post-2999302088908870272</id><published>2010-06-10T11:17:00.002+08:00</published><updated>2010-06-14T18:48:10.549+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WindowsCE'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><category scheme='http://www.blogger.com/atom/ns#' term='MSDN'/><category scheme='http://www.blogger.com/atom/ns#' term='WTL'/><title type='text'>Close button on Dialog Menu</title><content type='html'>原來 &lt;a href="http://msdn.microsoft.com/en-us/library/ms644994%28VS.85%29.aspx"&gt;msdn 有寫&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Dialog Create 時有加上 "WS_SYSMENU" flag 的話，dialog 上方就會出現 menu bar，然後有 minimize, maximum, close 三個方塊在右邊。&lt;br /&gt;&lt;br /&gt;當按下 close 方塊時，windows 會送出 IDCANCEL 這個 command。&lt;br /&gt;&lt;br /&gt;所以要加上 IDCANCEL 的 command id handler ，才會關掉 dialog。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2117270136732158310-2999302088908870272?l=realchecko.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realchecko.blogspot.com/feeds/2999302088908870272/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2117270136732158310&amp;postID=2999302088908870272' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/2999302088908870272'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/2999302088908870272'/><link rel='alternate' type='text/html' href='http://realchecko.blogspot.com/2010/06/close-button-on-dialog-menu.html' title='Close button on Dialog Menu'/><author><name>Checko</name><uri>http://www.blogger.com/profile/03239306354367907990</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/blogger/669/302/320/IMGP0803.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2117270136732158310.post-4140041572769724580</id><published>2010-06-09T16:11:00.002+08:00</published><updated>2010-08-12T17:01:19.572+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WindowsCE'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><category scheme='http://www.blogger.com/atom/ns#' term='WTL'/><title type='text'>WTL : the simple ATL Windows Program</title><content type='html'>&lt;code&gt;&lt;br /&gt;#define STRICT&lt;br /&gt;#define VC_EXTRALEAN&lt;br /&gt;&lt;br /&gt;#include &amp;lt;atlbase.h&amp;gt;&lt;br /&gt;#include &amp;lt;atlwin.h&amp;gt;&lt;br /&gt;&lt;br /&gt;class CMyWindow : public CWindowImpl&amp;lt;CMyWindow,CWindow,CFrameWinTraits&amp;gt;&lt;br /&gt;{&lt;br /&gt;public:&lt;br /&gt; DECLARE_WND_CLASS(_T(&amp;quot;My Window Class&amp;quot;))&lt;br /&gt;&lt;br /&gt; BEGIN_MSG_MAP(CMyWindow)&lt;br /&gt;  MESSAGE_HANDLER(WM_CLOSE,  OnClose)&lt;br /&gt;  MESSAGE_HANDLER(WM_DESTROY,OnDestroy)&lt;br /&gt; END_MSG_MAP()&lt;br /&gt;&lt;br /&gt;    LRESULT OnClose(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL&amp;amp; bHandled)&lt;br /&gt; {&lt;br /&gt;  DestroyWindow();&lt;br /&gt;  return 0;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;    LRESULT OnDestroy(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL&amp;amp; bHandled)&lt;br /&gt; {&lt;br /&gt;  PostQuitMessage(0);&lt;br /&gt;  return 0;&lt;br /&gt; }&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hInstPrev, LPTSTR szCmdLine, int nCmdShow)&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt; CMyWindow WndMain;&lt;br /&gt; MSG msg;&lt;br /&gt;&lt;br /&gt; if (NULL == WndMain.Create(NULL,CWindow::rcDefault,_T(&amp;quot;Hello&amp;quot;)))&lt;br /&gt; {&lt;br /&gt;  return 1;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; WndMain.ShowWindow(nCmdShow);&lt;br /&gt; WndMain.UpdateWindow();&lt;br /&gt;&lt;br /&gt; while(GetMessage(&amp;amp;msg,NULL,0,0) &amp;gt; 0)&lt;br /&gt; {&lt;br /&gt;  TranslateMessage(&amp;amp;msg);&lt;br /&gt;  DispatchMessage(&amp;amp;msg);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; return msg.wParam;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;可以用在 Win32 和 Win32_CE 上。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2117270136732158310-4140041572769724580?l=realchecko.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realchecko.blogspot.com/feeds/4140041572769724580/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2117270136732158310&amp;postID=4140041572769724580' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/4140041572769724580'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/4140041572769724580'/><link rel='alternate' type='text/html' href='http://realchecko.blogspot.com/2010/06/wtl-simple-atl-windows-program.html' title='WTL : the simple ATL Windows Program'/><author><name>Checko</name><uri>http://www.blogger.com/profile/03239306354367907990</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/blogger/669/302/320/IMGP0803.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2117270136732158310.post-2075737078860133571</id><published>2010-06-09T14:31:00.002+08:00</published><updated>2010-06-09T14:34:34.382+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Hardware'/><title type='text'>ISDBT Error Correction Code</title><content type='html'>ISDBT 信號使用 Reed Solomoon 作 Error Correction Code。&lt;br /&gt;&lt;br /&gt;有時候，為了要能測試出 RF 接收的特性，必須把接收端的 Reed Solomoon Correction 關閉。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2117270136732158310-2075737078860133571?l=realchecko.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realchecko.blogspot.com/feeds/2075737078860133571/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2117270136732158310&amp;postID=2075737078860133571' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/2075737078860133571'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/2075737078860133571'/><link rel='alternate' type='text/html' href='http://realchecko.blogspot.com/2010/06/isdbt-error-correction-code.html' title='ISDBT Error Correction Code'/><author><name>Checko</name><uri>http://www.blogger.com/profile/03239306354367907990</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/blogger/669/302/320/IMGP0803.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2117270136732158310.post-7005744199427444990</id><published>2010-06-07T14:57:00.008+08:00</published><updated>2010-08-11T17:20:54.850+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><category scheme='http://www.blogger.com/atom/ns#' term='Microsoft'/><category scheme='http://www.blogger.com/atom/ns#' term='WTL'/><title type='text'>WTL : Windows Template Library</title><content type='html'>WTL 是 Template Library，所以安裝的方法就是解開後，把 WTL\include 加到 project 的 include path 里就可以。&lt;br /&gt;Tools--Options--ProjectAndSolutions--VC++Directory&lt;br /&gt;&lt;blockquote&gt;這個option 每個 platform (Win32, Ce, SmartPhone..) 都不樣，所以要一一設定。&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;AppWiz 是安裝 WTL AppWizard 的javascript，根據 VS的不同，有不同的 script&lt;br /&gt;&lt;ul&gt;&lt;li&gt;setup80x.js 是 for VS2005 express 版本，但是 express 版不包含 ATL，所以要而外安裝一版 platform SDK 。&lt;/li&gt;&lt;li&gt;也有提供 WinCE版本的 wizard install script&lt;/li&gt;&lt;/ul&gt;Wizard 執行完後，New Project，選 WTL, Dialog base ，就可以create 一個 dialog program。&lt;br /&gt;&lt;br /&gt;就先由 Sample 的：ImageView 作練習，sample 是 for smart phone，照著 copy 到  standard sdk&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;看 起來好像是 SDI application。所以用 Wizard create 一個 SDI..&lt;br /&gt;一開始就遇到一個問題....CString 宣告不認識 -- 結果好像是 WTL8 有改了，要 include atlmisc.h。&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;感覺起來就是利用 template ，做到針對 function implement class/template。&lt;br /&gt;使用時依照需要繼承 class/template，然後改寫某 function。&lt;br /&gt;&lt;blockquote&gt;這就跟 RBT 的 coding 構想一樣：找class繼承，然後修改&lt;br /&gt;&lt;br /&gt;這樣的設計理念應該是每個 class/template 只做一件事。使用的方法就是繼承，修改，然後生成。&lt;br /&gt;&lt;br /&gt;另一種理念應該是...萬能的 class，使用發法是生成(給予適當參數)，然後使用。&lt;br /&gt;&lt;/blockquote&gt;所以 WTL 的程式設計好像是...了解MFC 原來 一些 event hander -- OnCreate, OnPaint, OnClick,,,, 在 WTL 中處理的 template/class，依照需要的時候繼承下來，然後就可以改寫 那些event handler。&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;唉～～對於 FrameWindow 跟 Window 的區別還是不了解..&lt;br /&gt;&lt;br /&gt;在 atlcrack.h 的 BEGIN_MSG_MAP_EX 註解：&lt;br /&gt;&lt;pre&gt;// Note about message maps with cracked handlers:&lt;br /&gt;// For ATL 3.0, a message map using cracked handlers MUST use BEGIN_MSG_MAP_EX.&lt;br /&gt;// For ATL 7.0 or higher, you can use BEGIN_MSG_MAP for CWindowImpl/CDialogImpl derived classes,&lt;br /&gt;// but must use BEGIN_MSG_MAP_EX for classes that don't derive from CWindowImpl/CDialogImpl.&lt;br /&gt;&lt;/pre&gt;所以繼承 CWindowImpl和 CDialogImpl的話，就可以用 BEGIN_MSG_MAP，如果不是繼承這兩個，就要用 BEGIN_MSG_MAP_EX (?)&lt;br /&gt;&lt;blockquote&gt;CWindowImpl和CDialogImpl 定義在 ATL。&lt;/blockquote&gt;&lt;ul&gt;&lt;li&gt;CWindow (也定義在ATL)，只包含 HWND這個資料結構的內容，還有一些標準 WIN32 function 。並沒有做出 message loop，message handler 這樣的架構出來。&lt;/li&gt;&lt;li&gt;CWindowImpl 就有 implement message loop/handler 的架構。&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;所以&lt;br /&gt;&lt;ul&gt;&lt;li&gt;繼承 CWindow 的話，要自己作 message loop/handler -- WTL 提供 BEGIN_MSG_MAP_EX 這類 macro。&lt;/li&gt;&lt;li&gt;繼承 CWindowImpl 的話，已經有 message loop 了，就用 BEGIN_MSG_MAP 就可以。&lt;/li&gt;&lt;/ul&gt;ATL 有關 Windows 部份可以參考 &lt;a href="http://msdn.microsoft.com/en-us/library/x1wf8d3x%28v=VS.80%29.aspx"&gt;MSDN&lt;/a&gt;&lt;br /&gt;&lt;a href="http://wtl.wikispaces.com/"&gt;http://wtl.wikispaces.com/ &lt;/a&gt;這個有比較好的wiki說明。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2117270136732158310-7005744199427444990?l=realchecko.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realchecko.blogspot.com/feeds/7005744199427444990/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2117270136732158310&amp;postID=7005744199427444990' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/7005744199427444990'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/7005744199427444990'/><link rel='alternate' type='text/html' href='http://realchecko.blogspot.com/2010/06/wtl-windows-template-library.html' title='WTL : Windows Template Library'/><author><name>Checko</name><uri>http://www.blogger.com/profile/03239306354367907990</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/blogger/669/302/320/IMGP0803.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2117270136732158310.post-1954261025476312098</id><published>2010-06-04T17:42:00.005+08:00</published><updated>2010-06-04T19:27:37.537+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Others'/><category scheme='http://www.blogger.com/atom/ns#' term='Software'/><title type='text'>IJG - Inependent JPEG Group</title><content type='html'>&lt;a href="http://www.ijg.org/"&gt;IJG &lt;/a&gt;提供一個JPEG 操作的 library，目前已經到 v8，有持續在 update。&lt;br /&gt;&lt;br /&gt;download source code 下來後，看一下 install.txt，裡面有說在各 platform 的 build 方法。&lt;br /&gt;在 Windows VC 的話，分為兩種：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;使用 command line&lt;/li&gt;&lt;li&gt;使用 VS 開project&lt;/li&gt;&lt;/ul&gt;用 VS 開 project 的方法我不會用，project 開起來會 fail，所以我只好用 command line 的方法：&lt;br /&gt;&lt;ol&gt;&lt;li&gt;VC command build 用 makefile.vc，config file 用 jconfig.vc&lt;/li&gt;&lt;li&gt;所以先 copy 一份 jconfig.vc 為 jconfig.h&lt;/li&gt;&lt;li&gt;nmake -f makefile.vc&lt;/li&gt;&lt;/ol&gt;OK。&lt;br /&gt;&lt;br /&gt;要注意，在 VC Command line 下 build，要先 run 過 VC 目錄下的 SETVCVAR.BAT 設好path.&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;build 好後：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;cjpeg.exe 是壓縮&lt;/li&gt;&lt;li&gt;djpeg.exe 是解壓縮&lt;/li&gt;&lt;/ul&gt;&lt;hr /&gt;&lt;br /&gt;看makefile.vc 可以看一下 libjpeg 的 source，&lt;br /&gt;依照 compress，decompress分成&lt;br /&gt;&lt;pre&gt;CLIBOBJECTS= jcapimin.obj jcapistd.obj jcarith.obj jctrans.obj jcparam.obj \&lt;br /&gt;        jdatadst.obj jcinit.obj jcmaster.obj jcmarker.obj jcmainct.obj \&lt;br /&gt;        jcprepct.obj jccoefct.obj jccolor.obj jcsample.obj jchuff.obj \&lt;br /&gt;        jcdctmgr.obj jfdctfst.obj jfdctflt.obj jfdctint.obj&lt;br /&gt;&lt;/pre&gt;和&lt;br /&gt;&lt;pre&gt;DLIBOBJECTS= jdapimin.obj jdapistd.obj jdarith.obj jdtrans.obj jdatasrc.obj \&lt;br /&gt;        jdmaster.obj jdinput.obj jdmarker.obj jdhuff.obj jdmainct.obj \&lt;br /&gt;        jdcoefct.obj jdpostct.obj jddctmgr.obj jidctfst.obj jidctflt.obj \&lt;br /&gt;        jidctint.obj jdsample.obj jdcolor.obj jquant1.obj jquant2.obj \&lt;br /&gt;        jdmerge.obj&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;只需要 decompress 的就只要 build DLIBOBJECTS 就可以&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2117270136732158310-1954261025476312098?l=realchecko.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realchecko.blogspot.com/feeds/1954261025476312098/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2117270136732158310&amp;postID=1954261025476312098' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/1954261025476312098'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/1954261025476312098'/><link rel='alternate' type='text/html' href='http://realchecko.blogspot.com/2010/06/ijg-inependent-jpeg-group.html' title='IJG - Inependent JPEG Group'/><author><name>Checko</name><uri>http://www.blogger.com/profile/03239306354367907990</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/blogger/669/302/320/IMGP0803.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2117270136732158310.post-1638844302610670629</id><published>2010-06-04T14:57:00.004+08:00</published><updated>2010-08-12T17:01:44.334+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ARM'/><category scheme='http://www.blogger.com/atom/ns#' term='Hardware'/><category scheme='http://www.blogger.com/atom/ns#' term='Embedded'/><title type='text'>CPU 與週邊 的速度</title><content type='html'>CPU 跑 600，週邊 IO 的 clock 是 60。&lt;br /&gt;所以當 CPU 對 GPIO register 寫資料時，是同步在 60MHz...&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt; ldr   r0, =GPIO1_PAD_EN&lt;br /&gt; mov   r1, #0x00100000 ; pin 20&lt;br /&gt; str   r1,[r0]&lt;br /&gt; ldr   r0, =GPIO1_CTRL20&lt;br /&gt; mov   r1,#0x120&lt;br /&gt; mov   r2,#0x160&lt;br /&gt;1 &lt;br /&gt; str   r1,[r0]&lt;br /&gt; nop&lt;br /&gt; str   r2,[r0]&lt;br /&gt; nop&lt;br /&gt; b     %b1  &lt;br /&gt;&lt;/code&gt;&lt;br /&gt;這一段 code，有沒有加 nop 輸出的方波都是 10MHz。&lt;br /&gt;但是把 nop 改為&lt;br /&gt;&lt;code&gt;&lt;br /&gt; str   r1,[r0]&lt;br /&gt; str   r1,[r0]&lt;br /&gt; str   r2,[r0]&lt;br /&gt; str   r2,[r0]&lt;br /&gt; b     %b1  &lt;br /&gt;&lt;/code&gt;&lt;br /&gt;這樣改完，輸出方波變成 5MHz。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;也就是說..如果一直 polling 週邊得的話，就等於是用 60MHz 在跑....&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2117270136732158310-1638844302610670629?l=realchecko.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realchecko.blogspot.com/feeds/1638844302610670629/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2117270136732158310&amp;postID=1638844302610670629' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/1638844302610670629'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/1638844302610670629'/><link rel='alternate' type='text/html' href='http://realchecko.blogspot.com/2010/06/cpu.html' title='CPU 與週邊 的速度'/><author><name>Checko</name><uri>http://www.blogger.com/profile/03239306354367907990</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/blogger/669/302/320/IMGP0803.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2117270136732158310.post-5509250821533175439</id><published>2010-05-28T11:34:00.006+08:00</published><updated>2010-08-11T16:56:37.034+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WindowsCE'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><category scheme='http://www.blogger.com/atom/ns#' term='MSDN'/><title type='text'>Win32 Listbox Control 的操作</title><content type='html'>有時候要簡單的 log 來 show message，但是又不是 console mode ，這樣就要拉一個 ListBox 來作。&lt;br /&gt;&lt;br /&gt;ListBox 的操作： &lt;a href="http://msdn.microsoft.com/en-us/library/bb775146%28v=VS.85%29.aspx"&gt;MSDN - Listbox&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;首先 Win32 的 Control 就是預先寫好的小Dialog Window，所以要控制 Control Item ，只有用 SendMessage 的方式。&lt;br /&gt;&lt;br /&gt;這種已經寫好的 Control (DialogWindow)，每次要送message 過去，還要先從 ID 取得 hWnd 再送，有點麻煩，所以 Win32 提供一個直接對 ID 送 Message 的 function&lt;br /&gt;&lt;code&gt;SendDlgItemMessage&lt;/code&gt;&lt;br /&gt;ListBox 的控制，用在 show log 的化，簡單的就是：&lt;br /&gt;&lt;ol&gt;&lt;li&gt;加入Item&lt;/li&gt;&lt;li&gt;移動 List&lt;/li&gt;&lt;li&gt;刪除 Item&lt;/li&gt;&lt;/ol&gt;三個都是用 SendDlgItemMesage 來完成的，三個function 的 Message ID 不一樣：&lt;br /&gt;&lt;ol&gt;&lt;li&gt;加入 Item : LB_ADDSTRING&lt;/li&gt;&lt;li&gt;移動List : LB_SETTOPINDEX&lt;/li&gt;&lt;li&gt;刪除 Item : LB_DELETESTRING&lt;/li&gt;&lt;/ol&gt;另外，ListBox 有一個 property - Sort，可以設定是否自動對 Item 排序，在作 Log 用時當然是不需要，但是 default 是 TRUE，要記得改。&lt;br /&gt;&lt;br /&gt;ADDSTRING default 是作 "Append"，所以剛好符合 log 的動作，從後面加上去。&lt;br /&gt;&lt;br /&gt;ListBox 雖然有 scroll bar ，但是不會自己scroll 到最後，所以要用 LB_SETTOPINDEX 來指定第一個顯示的 item，好移動 scrollbar。&lt;br /&gt;但是因為要讓最後一行對齊最後，所以反而要先用 LB_GETCOUNT 取得所有 item 的數量，自己減去 list 一面的 item 數好找到最後一頁的第一個 item 的 index...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;以下就是簡單的 sample code，只有兩個 button - add, clear(all) 和一個 14 行的 list。&lt;br /&gt;list 只保持 30 個 item，每按一下 add，就會加一行。&lt;br /&gt;&lt;code&gt;#include "stdafx.h"&lt;br /&gt;#include &amp;lt;windows.h&amp;gt;&lt;br /&gt;#include "ListBoxTest.h"&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;BOOL    CALLBACK DialogProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)&lt;br /&gt;{&lt;br /&gt;static int i=0;&lt;br /&gt; switch (uMsg)&lt;br /&gt; {&lt;br /&gt;case WM_INITDIALOG:&lt;br /&gt;&lt;br /&gt;return TRUE;&lt;br /&gt;     case WM_CLOSE:&lt;br /&gt;EndDialog(hWnd,0);&lt;br /&gt;return TRUE;&lt;br /&gt;case WM_COMMAND:&lt;br /&gt;switch(wParam)&lt;br /&gt;{&lt;br /&gt;case IDC_ADD :{&lt;br /&gt; TCHAR outmsg[10];&lt;br /&gt; swprintf(outmsg,_T("%d"),i++);&lt;br /&gt;&lt;br /&gt; SendDlgItemMessage(hWnd,IDC_LIST1,LB_ADDSTRING,0,LPARAM(outmsg));&lt;br /&gt; int cnt=SendDlgItemMessage(hWnd,IDC_LIST1,LB_GETCOUNT,0,0);&lt;br /&gt; if(cnt&amp;gt;30)&lt;br /&gt;  SendDlgItemMessage(hWnd,IDC_LIST1,LB_DELETESTRING,0,0);&lt;br /&gt; cnt=SendDlgItemMessage(hWnd,IDC_LIST1,LB_GETCOUNT,0,0);&lt;br /&gt; if(cnt&amp;gt;=14)&lt;br /&gt; SendDlgItemMessage(hWnd,IDC_LIST1,LB_SETTOPINDEX,cnt-14,0);&lt;br /&gt; return TRUE;&lt;br /&gt;     }&lt;br /&gt;case IDC_CLEAR:{&lt;br /&gt; int cnt=SendDlgItemMessage(hWnd,IDC_LIST1,LB_GETCOUNT,0,0);&lt;br /&gt; while(cnt--&amp;gt;0)&lt;br /&gt;  SendDlgItemMessage(hWnd,IDC_LIST1,LB_DELETESTRING,0,0);&lt;br /&gt; return TRUE;&lt;br /&gt;      }&lt;br /&gt;default:&lt;br /&gt; return FALSE;&lt;br /&gt;}&lt;br /&gt;default:&lt;br /&gt;return FALSE;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;WTL 有包裝 ListBox，使用 WTL 的 example 是 &lt;a href="http://realchecko.blogspot.com/2010/08/clistbox-listbox-control-in-wtl.html"&gt;http://realchecko.blogspot.com/2010/08/clistbox-listbox-control-in-wtl.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2117270136732158310-5509250821533175439?l=realchecko.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realchecko.blogspot.com/feeds/5509250821533175439/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2117270136732158310&amp;postID=5509250821533175439' title='3 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/5509250821533175439'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/5509250821533175439'/><link rel='alternate' type='text/html' href='http://realchecko.blogspot.com/2010/05/win32-listbox-control.html' title='Win32 Listbox Control 的操作'/><author><name>Checko</name><uri>http://www.blogger.com/profile/03239306354367907990</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/blogger/669/302/320/IMGP0803.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2117270136732158310.post-7222438137914872233</id><published>2010-05-21T19:37:00.001+08:00</published><updated>2010-05-21T19:42:46.715+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WindowsCE'/><title type='text'>Change Mass Storage Volume Name/Label</title><content type='html'>變更 Mass Storage 的 Volume Name/Label&lt;br /&gt;&lt;br /&gt;在這一篇 &lt;a href="http://geekswithblogs.net/KMOS/archive/2010/04/17/fat-volume-and-ce.aspx"&gt;http://geekswithblogs.net/KMOS/archive/2010/04/17/fat-volume-and-ce.aspx&lt;/a&gt;&lt;br /&gt;還有這一篇 &lt;a href="http://www.tech-archive.net/Archive/WindowsCE/microsoft.public.windowsce.platbuilder/2010-04/msg00220.html"&gt;http://www.tech-archive.net/Archive/WindowsCE/microsoft.public.windowsce.platbuilder/2010-04/msg00220.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;大概就是去改：&lt;span style="font-size:100%;"&gt;public\common\oak\drivers\fsd\fatutil\MAIN\  下面的檔案&lt;br /&gt;&lt;blockquote&gt;很複雜&lt;/blockquote&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2117270136732158310-7222438137914872233?l=realchecko.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realchecko.blogspot.com/feeds/7222438137914872233/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2117270136732158310&amp;postID=7222438137914872233' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/7222438137914872233'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/7222438137914872233'/><link rel='alternate' type='text/html' href='http://realchecko.blogspot.com/2010/05/change-mass-storage-volume-namelabel.html' title='Change Mass Storage Volume Name/Label'/><author><name>Checko</name><uri>http://www.blogger.com/profile/03239306354367907990</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/blogger/669/302/320/IMGP0803.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2117270136732158310.post-2696046203541100282</id><published>2010-05-17T18:31:00.003+08:00</published><updated>2010-05-17T18:33:04.220+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tcpmp'/><category scheme='http://www.blogger.com/atom/ns#' term='ffmpeg'/><category scheme='http://www.blogger.com/atom/ns#' term='WindowsCE'/><title type='text'>tcpmp - sample prorgram</title><content type='html'>在 sample folder 下有比較簡單的 main sample：&lt;br /&gt;把 sample_win32.c , dumpoutput.c, dumpoutput.h 拷貝到 player.c&lt;br /&gt;&lt;br /&gt;開啟 player.sln，把原來的 source remove 掉，加入上面的兩個 .c。&lt;br /&gt;build OK。&lt;br /&gt;&lt;br /&gt;還沒測..&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2117270136732158310-2696046203541100282?l=realchecko.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realchecko.blogspot.com/feeds/2696046203541100282/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2117270136732158310&amp;postID=2696046203541100282' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/2696046203541100282'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/2696046203541100282'/><link rel='alternate' type='text/html' href='http://realchecko.blogspot.com/2010/05/tcpmp-sample-prorgram.html' title='tcpmp - sample prorgram'/><author><name>Checko</name><uri>http://www.blogger.com/profile/03239306354367907990</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/blogger/669/302/320/IMGP0803.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2117270136732158310.post-7485502380841439540</id><published>2010-05-17T16:43:00.004+08:00</published><updated>2010-05-17T18:15:48.252+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tcpmp'/><category scheme='http://www.blogger.com/atom/ns#' term='ffmpeg'/><category scheme='http://www.blogger.com/atom/ns#' term='WindowsCE'/><category scheme='http://www.blogger.com/atom/ns#' term='Complain'/><title type='text'>complian 一下 .... 無關的東西...其實是自己不好 XD</title><content type='html'>有點詞窮..&lt;pre&gt; {array Node;&lt;br /&gt;...&lt;br /&gt;struct node* Platform;&lt;br /&gt;...}&lt;/pre&gt; Node 這個詞到處在用，還分大小寫..當 structure name，又當 variable name...&lt;br /&gt; 懷疑是不是故意的..&lt;br /&gt; 最好是 struct node* Platform 實際上是從 array Node 中挑出一個來的。&lt;br /&gt;&lt;br /&gt;好像有用到 Singletone pattern，用 struct context *Context() 取出唯一的 context 指標。&lt;br /&gt;&lt;br /&gt;用 C++寫就好，幹嘛要用C寫，然後又要做出C++的東西 (default constructer，class hierachy，function overwrite..  abstrator overwrite etc)。&lt;br /&gt;&lt;br /&gt;用 define function 作 cast pointer 真是糟糕，看起來是 argument，卻拿來作 cast name。&lt;br /&gt;&lt;br /&gt;然後整個 project sourcecode 就是 node 來 node 去的，什麼名字都有node，也就等於什麼名字都沒有 node...(難怪會重寫)&lt;br /&gt;&lt;br /&gt;Module Name 先放在 string table裡，每個 id 代表一個 Module Name，然後再用 Id 來 load module。&lt;br /&gt;&lt;br /&gt;還有..&lt;pre&gt; stringdef Def;&lt;br /&gt;stringdef* Ptr = &amp;Def;&lt;br /&gt;..&lt;br /&gt;(,,, &amp;amp;Ptr,,,)&lt;/pre&gt;這樣的code..&lt;br /&gt;&lt;br /&gt;nodedef : node的定義，包含..&lt;br /&gt;&lt;ul&gt;&lt;li&gt;load  setting&lt;/li&gt;&lt;li&gt;ID&lt;/li&gt;&lt;li&gt;parent class (的ID)&lt;/li&gt;&lt;li&gt;priority (?)&lt;/li&gt;&lt;li&gt;這個 node (class?) 的 create function&lt;/li&gt;&lt;li&gt;delete function&lt;/li&gt;&lt;/ul&gt;ID 系統，使用 FOURCC : 四個 char (0x00~0xFF) 組成 8x4=32 bit (一個 int)。&lt;br /&gt;&lt;br /&gt;又有node，又有 class，node define 的東西是 class。&lt;br /&gt;&lt;br /&gt;static function，第一個 argument 在所有的caller 都是一樣的值，那為什麼不直接 reference ? 還要多一個標準？&lt;br /&gt;&lt;br /&gt;NodeClass 就要用 FindClass 來操作。 -- 因為 FindClass 內部只對 NodeClass 這個 member 操作。(隱含的)&lt;br /&gt;&lt;br /&gt;一堆 node, class 都 initial 完後，在 global unique variable - Context( ) 的 array xxx 就已經都註冊好所有 id 和對應的 create function。&lt;br /&gt;&lt;br /&gt;NoteCreate( classid) 會從 context array 中找到那個 classid 的 node..&lt;br /&gt;&lt;ol&gt;&lt;li&gt;LoadLibrary&lt;/li&gt;&lt;li&gt;Call DLLRegister&lt;/li&gt;&lt;li&gt;load parent class/node (recursive)&lt;/li&gt;&lt;li&gt;call node 的 Create( )&lt;/li&gt;&lt;/ol&gt;所有都 Initialize 完後，call INTERFACE_ID 這個 class 起來 --- 這個 class 用 WinPopupClass( ) 叫起&lt;br /&gt;  又是一個 特例。所以 interface 這個 node 要用 NodeCreate( ) 出來後，要手動 cast 成 (win*) 然後取出 Popup( )&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2117270136732158310-7485502380841439540?l=realchecko.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realchecko.blogspot.com/feeds/7485502380841439540/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2117270136732158310&amp;postID=7485502380841439540' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/7485502380841439540'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/7485502380841439540'/><link rel='alternate' type='text/html' href='http://realchecko.blogspot.com/2010/05/blog-post.html' title='complian 一下 .... 無關的東西...其實是自己不好 XD'/><author><name>Checko</name><uri>http://www.blogger.com/profile/03239306354367907990</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/blogger/669/302/320/IMGP0803.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2117270136732158310.post-2176400941019288803</id><published>2010-05-13T16:27:00.006+08:00</published><updated>2010-08-12T17:02:57.623+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tcpmp'/><category scheme='http://www.blogger.com/atom/ns#' term='WindowsCE'/><title type='text'>code reading - tcpmp, node</title><content type='html'>&lt;code&gt;&lt;br /&gt;NodeLoadModule( )&lt;br /&gt;{&lt;br /&gt;  Module = LoadLibrary(path);&lt;br /&gt;  Proc = GetProcAddress(Module,"DLLRegister");&lt;br /&gt;  Result = (Proc)();&lt;br /&gt;}&lt;/code&gt;&lt;br /&gt;所有的 Node 在被 NodeLoadModule( ) load 進去的時候，Node 的 DLLRegister( ) 會被呼叫。&lt;br /&gt;&lt;br /&gt;所以 node.h 中有宣告：&lt;br /&gt;&lt;code&gt;&lt;br /&gt;DLLEXPORT int DLLRegister(int ContextVersion);&lt;br /&gt;DLLEXPORT void DLLUnRegister();&lt;/code&gt;&lt;br /&gt;所有 作為 Node的 DLL ，都要 include node.h，所以都要 implement DLLRegister( ) 。&lt;br /&gt;&lt;br /&gt;Node 的使用用類似 IOControl 的方式，統一一個 funciton interface : Set( ) ，再把需要的功能以 control code 傳進 Set( ) function：&lt;br /&gt;&lt;code&gt;&lt;br /&gt;            Node-&amp;gt;Set(Node,Msg,&amp;amp;Data,Size);&lt;/code&gt;&lt;br /&gt;Node 的宣告是：&lt;br /&gt;&lt;code&gt;typedef struct node&lt;br /&gt;{&lt;br /&gt;  int            Class;&lt;br /&gt;  nodeenum    Enum;&lt;br /&gt;  nodeget        Get; //typedef    int (*nodeget)(void* This,int No,void* Data,int Size);&lt;br /&gt;  nodeset        Set; //typedef    int (*nodeset)(void* This,int No,const void* Data,int Size);&lt;br /&gt;} node;&lt;/code&gt;&lt;br /&gt;...找不到 node 初值(內容) 設定的部份。&lt;br /&gt;&lt;br /&gt;nod.Get, Set 設定是在 node 的 Create( ) 。&lt;br /&gt;以 platform 為例：&lt;code&gt;static int Create(platform* p)&lt;br /&gt;{&lt;br /&gt;   cpudetect Info;&lt;br /&gt;   p-&amp;gt;Node.Enum = (nodeenum)Enum;&lt;br /&gt;   p-&amp;gt;Node.Get = (nodeget)Get;&lt;br /&gt;   p-&amp;gt;Node.Set = (nodeset)Set;&lt;br /&gt;   p-&amp;gt;Model = MODEL_UNKNOWN;&lt;br /&gt;&lt;/code&gt;在 NodeRegisterClass( ) 時，該 Node的 Create( ) function 會被呼叫。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2117270136732158310-2176400941019288803?l=realchecko.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realchecko.blogspot.com/feeds/2176400941019288803/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2117270136732158310&amp;postID=2176400941019288803' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/2176400941019288803'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/2176400941019288803'/><link rel='alternate' type='text/html' href='http://realchecko.blogspot.com/2010/05/code-reading-tcpmp-node.html' title='code reading - tcpmp, node'/><author><name>Checko</name><uri>http://www.blogger.com/profile/03239306354367907990</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/blogger/669/302/320/IMGP0803.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2117270136732158310.post-2070044838298107584</id><published>2010-05-13T15:56:00.004+08:00</published><updated>2010-08-12T17:03:25.588+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tcpmp'/><category scheme='http://www.blogger.com/atom/ns#' term='ffmpeg'/><category scheme='http://www.blogger.com/atom/ns#' term='WindowsCE'/><title type='text'>notes - code reading of ffmpeg</title><content type='html'>&lt;code&gt;&lt;br /&gt;AVCodec h264_decoder = {&lt;br /&gt;   "h264",     //name&lt;br /&gt;   CODEC_TYPE_VIDEO,     //type&lt;br /&gt;   CODEC_ID_H264,        //id&lt;br /&gt;   sizeof(H264Context),  //private data size&lt;br /&gt;   decode_init,          // (*init)()&lt;br /&gt;   NULL,                 // (*encode)()&lt;br /&gt;   decode_end,           // (*close)()&lt;br /&gt;   decode_frame,         // (*decode)()&lt;br /&gt;   /*CODEC_CAP_DRAW_HORIZ_BAND |*/ CODEC_CAP_DR1 | CODEC_CAP_TRUNCATED | CODEC_CAP_DELAY,  //capability&lt;br /&gt; NULL,             //next&lt;br /&gt; flush_dpb,        // (*flush)()&lt;br /&gt;};&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2117270136732158310-2070044838298107584?l=realchecko.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realchecko.blogspot.com/feeds/2070044838298107584/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2117270136732158310&amp;postID=2070044838298107584' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/2070044838298107584'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/2070044838298107584'/><link rel='alternate' type='text/html' href='http://realchecko.blogspot.com/2010/05/notes-code-reading-of-ffmpeg.html' title='notes - code reading of ffmpeg'/><author><name>Checko</name><uri>http://www.blogger.com/profile/03239306354367907990</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/blogger/669/302/320/IMGP0803.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2117270136732158310.post-3549030992143690499</id><published>2010-05-12T15:26:00.004+08:00</published><updated>2010-05-12T16:02:25.686+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ffmpeg'/><category scheme='http://www.blogger.com/atom/ns#' term='WindowsCE'/><title type='text'>Try VLC for WINCE</title><content type='html'>雖然網站說 因為沒有 developer 對這個有興趣，所以ce 的 port 中止了，&lt;br /&gt;但是還有是 for CE 的 nightly build 可以 download (不知道是不是因為 auto build 的關係)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://nightlies.videolan.org/build/wince/?C=M;O=D"&gt;http://nightlies.videolan.org/build/wince/?C=M;O=D&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;說明是 for XScale，還是 dowload 下來試試。&lt;br /&gt;&lt;br /&gt;使用KITL 來 run ，結果有 message ; find no plugin, check --plugin-path&lt;br /&gt;所以改用 target control 來 run , command:&lt;pre&gt;&gt;s SDMMC\vlc\vlc --plugin-path SDMMC\vlc\plugins&lt;/pre&gt;就可以 load plugins 的 dll 了。&lt;br /&gt;結果 load lib555 出現 exception&lt;pre&gt;PB Debugger Loaded 'liblive555_plugin.dll', no matching symbolic information found.&lt;br /&gt;Exception 'Data Abort' (4): Thread-Id=059c003e(pth=8e23815c), Proc-Id=059b002a(pprc=8ddbc36c) 'vlc.exe',&lt;br /&gt;VM-active=059b002a(pprc=8ddbc36c) 'vlc.exe'&lt;br /&gt;PC=42f14df8(liblive555_plugin.dll+0x00084df8) RA=42f0a1a8(liblive555_plugin.dll+0x0007a1a8) SP=0011f848,&lt;br /&gt;BVA=6d9dc460&lt;br /&gt;&lt;br /&gt;Data Abort: 0xC0000005 0x42F14DF8&lt;br /&gt;&lt;/pre&gt;把lib555 拿掉試試看..&lt;br /&gt;變成&lt;pre&gt;PB Debugger Loaded 'libyuy2_i422_plugin.dll', no matching symbolic information found.&lt;br /&gt;PB Debugger Loaded 'libzip_plugin.dll', no matching symbolic information found.&lt;br /&gt;Exception 'Raised Exception' (-1): Thread-Id=045f002e(pth=8e23815c), Proc-Id=05fc002a(pprc=8ddbc36c) 'vlc.exe',&lt;br /&gt;VM-active=05fc002a(pprc=8ddbc36c) 'vlc.exe'&lt;br /&gt;PC=4002c508(coredll.dll+0x0001c508) RA=93b3c4c8(kernel.dll+0x000064c8) SP=0011f648, BVA=ffffffff&lt;/pre&gt;一樣，rename掉，繼續..&lt;br /&gt;奇怪，fail在 &lt;pre&gt;B Debugger Loaded 'libyuy2_i422_plugin.dll', no matching symbolic information found.&lt;br /&gt;Exception 'Raised Exception' (-1): Thread-Id=0591003a(pth=8e23815c), Proc-Id=058a005a(pprc=8e946000) 'vlc.exe', VM-active=058a005a(pprc=8e946000) 'vlc.exe'&lt;br /&gt;PC=4002c508(coredll.dll+0x0001c508) RA=93b3c4c8(kernel.dll+0x000064c8) SP=0011f648, BVA=ffffffff&lt;/pre&gt;猜是 memory 不夠的問題，刪掉一堆dll看看.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2117270136732158310-3549030992143690499?l=realchecko.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realchecko.blogspot.com/feeds/3549030992143690499/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2117270136732158310&amp;postID=3549030992143690499' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/3549030992143690499'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/3549030992143690499'/><link rel='alternate' type='text/html' href='http://realchecko.blogspot.com/2010/05/try-vlc-for-wince.html' title='Try VLC for WINCE'/><author><name>Checko</name><uri>http://www.blogger.com/profile/03239306354367907990</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/blogger/669/302/320/IMGP0803.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2117270136732158310.post-6941149041335545114</id><published>2010-05-10T16:35:00.001+08:00</published><updated>2010-05-10T16:37:45.134+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WindowsCE'/><title type='text'>ceappcompat.exe -- check if app runnable on CE 6.0</title><content type='html'>原來 CE 6.0 有附一個工具 ceappcompat.exe ，可以用來檢查 5.0 的 ap 在 6.0 能不能 run.&lt;br /&gt;&lt;br /&gt;在：&lt;br /&gt;http://blogs.msdn.com/mikehall/archive/2006/11/04/ceappcompat-location.aspx&lt;br /&gt;&lt;br /&gt;C:\WINCE600\PUBLIC\COMMON\OAK\BIN\I386&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2117270136732158310-6941149041335545114?l=realchecko.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realchecko.blogspot.com/feeds/6941149041335545114/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2117270136732158310&amp;postID=6941149041335545114' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/6941149041335545114'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/6941149041335545114'/><link rel='alternate' type='text/html' href='http://realchecko.blogspot.com/2010/05/ceappcompatexe-check-if-app-runnable-on.html' title='ceappcompat.exe -- check if app runnable on CE 6.0'/><author><name>Checko</name><uri>http://www.blogger.com/profile/03239306354367907990</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/blogger/669/302/320/IMGP0803.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2117270136732158310.post-1523404095784351116</id><published>2010-05-10T16:17:00.006+08:00</published><updated>2010-08-11T10:57:05.982+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tcpmp'/><category scheme='http://www.blogger.com/atom/ns#' term='ffmpeg'/><category scheme='http://www.blogger.com/atom/ns#' term='WindowsCE'/><title type='text'>tcpmp for WINCE 6.0</title><content type='html'>tcpmp 啟動時會自動 load 目錄下所有的 *.plg 檔。&lt;br /&gt;其實這些檔就是 DLL，但是為了防止load 到騎他program 的 DLL，所以rename 成 plg。&lt;br /&gt;&lt;br /&gt;tcpmp 的 VS2005 project 是一個基本的 project，只包涵 network, mpeg1.. etc 等少數的 codec 在裡面，這些 codec project 會 build 成 *.plg 檔，放在 release/output folder 中。&lt;br /&gt;&lt;br /&gt;其他 project (ffmpeg, aac, ac3..) 要 build 的話，可以直接開啟該 codec project 的 vcp (for eVC 得的那個，不是VC6的)，然後修改一下：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;要 把 common.lib 加入 -- 要把 common.lib 所在path 加到 linker 的 Additional Library Direction 中。把 common.lib 加到 Linker - Input - Additional Dependency 中&lt;br /&gt;&lt;/li&gt;&lt;li&gt;修改 Linker - Output File : $(OutDir)\$(ProjectName).plg&lt;/li&gt;&lt;li&gt;修改 Linker - Debugging - Generate Program Database : $(OutDir)/ffmpeg.pdb&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;這樣就可以了。&lt;br /&gt;也可以直接把project 加到 tcpmp 中。&lt;br /&gt;&lt;br /&gt;tcpmp 有使用 類似 llvm 的技巧，在 port.h 中定義 CONFIG_DYNCODE。&lt;br /&gt;undefine 的話就可以不用 (但是code 沒有很完全)。&lt;br /&gt;&lt;br /&gt;tcpmp 啟動會 load *.txt ，這是原來在 language folder 下的 界面字串定義檔，所以也要 copy 到 執行目錄下。&lt;br /&gt;&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;diff --git a/common/blit/blit_arm_fix.c b/common/blit/blit_arm_fix.c&lt;br /&gt;index 7af2299..6131e95 100644&lt;br /&gt;--- a/common/blit/blit_arm_fix.c&lt;br /&gt;+++ b/common/blit/blit_arm_fix.c&lt;br /&gt;@@ -25,7 +25,7 @@&lt;br /&gt;#include "../dyncode/dyncode.h"&lt;br /&gt;#include "blit_soft.h"&lt;br /&gt;&lt;br /&gt;-#if defined(ARM)&lt;br /&gt;+#if defined(ARM) &amp;amp;&amp;amp; defined(CONFIG_DYNCODE)&lt;br /&gt;&lt;br /&gt;typedef struct stack&lt;br /&gt;{&lt;br /&gt;diff --git a/common/blit/blit_arm_gray.c b/common/blit/blit_arm_gray.c&lt;br /&gt;index 9b7797b..8d8b636 100644&lt;br /&gt;--- a/common/blit/blit_arm_gray.c&lt;br /&gt;+++ b/common/blit/blit_arm_gray.c&lt;br /&gt;@@ -25,7 +25,7 @@&lt;br /&gt;#include "../dyncode/dyncode.h"&lt;br /&gt;#include "blit_soft.h"&lt;br /&gt;&lt;br /&gt;-#if defined(ARM)&lt;br /&gt;+#if defined(ARM) &amp;amp;&amp;amp; defined(CONFIG_DYNCODE)&lt;br /&gt;&lt;br /&gt;typedef struct stack&lt;br /&gt;{&lt;br /&gt;diff --git a/common/blit/blit_arm_half.c b/common/blit/blit_arm_half.c&lt;br /&gt;index a59d66c..089109d 100644&lt;br /&gt;--- a/common/blit/blit_arm_half.c&lt;br /&gt;+++ b/common/blit/blit_arm_half.c&lt;br /&gt;@@ -29,7 +29,7 @@&lt;br /&gt;// DstAlignPos  4&lt;br /&gt;// SrcAlignPos  2&lt;br /&gt;&lt;br /&gt;-#if defined(ARM)&lt;br /&gt;+#if defined(ARM) &amp;amp;&amp;amp; defined(CONFIG_DYNCODE)&lt;br /&gt;&lt;br /&gt;typedef struct stack&lt;br /&gt;{&lt;br /&gt;diff --git a/common/blit/blit_arm_packed_yuv.c b/common/blit/blit_arm_packed_yuv.c&lt;br /&gt;index 494721b..871bd36 100644&lt;br /&gt;--- a/common/blit/blit_arm_packed_yuv.c&lt;br /&gt;+++ b/common/blit/blit_arm_packed_yuv.c&lt;br /&gt;@@ -25,7 +25,7 @@&lt;br /&gt;#include "../dyncode/dyncode.h"&lt;br /&gt;#include "blit_soft.h"&lt;br /&gt;&lt;br /&gt;-#if defined(ARM)&lt;br /&gt;+#if defined(ARM) &amp;amp;&amp;amp; defined(CONFIG_DYNCODE)&lt;br /&gt;&lt;br /&gt;typedef struct stack&lt;br /&gt;{&lt;br /&gt;diff --git a/common/blit/blit_arm_rgb16.c b/common/blit/blit_arm_rgb16.c&lt;br /&gt;index 3c153f1..6de28fb 100644&lt;br /&gt;--- a/common/blit/blit_arm_rgb16.c&lt;br /&gt;+++ b/common/blit/blit_arm_rgb16.c&lt;br /&gt;@@ -25,7 +25,7 @@&lt;br /&gt;#include "../dyncode/dyncode.h"&lt;br /&gt;#include "blit_soft.h"&lt;br /&gt;&lt;br /&gt;-#if defined(ARM)&lt;br /&gt;+#if defined(ARM) &amp;amp;&amp;amp; defined(CONFIG_DYNCODE)&lt;br /&gt;&lt;br /&gt;// R0..R6 temporary&lt;br /&gt;// R7 Pos(when Stretch)&lt;br /&gt;diff --git a/common/blit/blit_arm_stretch.c b/common/blit/blit_arm_stretch.c&lt;br /&gt;index 5855d9c..be36ed8 100644&lt;br /&gt;--- a/common/blit/blit_arm_stretch.c&lt;br /&gt;+++ b/common/blit/blit_arm_stretch.c&lt;br /&gt;@@ -27,7 +27,7 @@&lt;br /&gt;#include "../dyncode/dyncode.h"&lt;br /&gt;#include "blit_soft.h"&lt;br /&gt;&lt;br /&gt;-#if defined(ARM)&lt;br /&gt;+#if defined(ARM) &amp;amp;&amp;amp; defined(CONFIG_DYNCODE)&lt;br /&gt;&lt;br /&gt;typedef struct stack&lt;br /&gt;{&lt;br /&gt;diff --git a/common/blit/blit_arm_yuv.c b/common/blit/blit_arm_yuv.c&lt;br /&gt;index 3e4d612..38ae8cd 100644&lt;br /&gt;--- a/common/blit/blit_arm_yuv.c&lt;br /&gt;+++ b/common/blit/blit_arm_yuv.c&lt;br /&gt;@@ -29,7 +29,7 @@&lt;br /&gt;// DstAlignPos  8&lt;br /&gt;// SrcAlignPos  8&lt;br /&gt;&lt;br /&gt;-#if defined(ARM)&lt;br /&gt;+#if defined(ARM) &amp;amp;&amp;amp; defined(CONFIG_DYNCODE)&lt;br /&gt;&lt;br /&gt;// R0..R4 temporary&lt;br /&gt;// R5 DiffMask (when Diff)&lt;br /&gt;diff --git a/common/blit/blit_soft.c b/common/blit/blit_soft.c&lt;br /&gt;index 3b8770c..f4cb08f 100644&lt;br /&gt;--- a/common/blit/blit_soft.c&lt;br /&gt;+++ b/common/blit/blit_soft.c&lt;br /&gt;@@ -1795,7 +1795,7 @@ static bool_t BlitCompile(blit_soft* p,&lt;br /&gt; p-&amp;gt;SrcPos[i] = BitMaskPos(p-&amp;gt;Src.BitMask[i]);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;-#if defined(ARM)&lt;br /&gt;+#if defined(ARM) &amp;amp;&amp;amp; defined(CONFIG_DYNCODE)&lt;br /&gt;if ((p-&amp;gt;Dst.Flags &amp;amp; PF_RGB) &amp;amp;&amp;amp; p-&amp;gt;Dst.BitCount==16 &amp;amp;&amp;amp; !p-&amp;gt;SrcYUV)&lt;br /&gt; Any_RGB_RGB(p);&lt;br /&gt;if (!p-&amp;gt;SrcYUV &amp;amp;&amp;amp; DstPlanarYUV &amp;amp;&amp;amp; p-&amp;gt;RScaleX==16 &amp;amp;&amp;amp; p-&amp;gt;RScaleY==16)&lt;br /&gt;@@ -1848,11 +1848,14 @@ static bool_t BlitCompile(blit_soft* p,&lt;br /&gt;}&lt;br /&gt;#endif&lt;br /&gt;&lt;br /&gt;+#if defined(ARM) &amp;amp;&amp;amp; defined(CONFIG_DYNCODE)&lt;br /&gt;+&lt;br /&gt;CodeBuild(&amp;amp;p-&amp;gt;Code);&lt;br /&gt;if (p-&amp;gt;Code.Size)&lt;br /&gt; p-&amp;gt;Entry = (blitsoftentry)p-&amp;gt;Code.Code;&lt;br /&gt;else&lt;br /&gt; p-&amp;gt;Entry = NULL;&lt;br /&gt;+#endif&lt;br /&gt;&lt;br /&gt;#if defined(_M_IX86) &amp;amp;&amp;amp; !defined(TARGET_SYMBIAN)&lt;br /&gt;&lt;br /&gt;diff --git a/common/blit/blit_wmmx_fix.c b/common/blit/blit_wmmx_fix.c&lt;br /&gt;index 6ffb3bb..1b3ec38 100644&lt;br /&gt;--- a/common/blit/blit_wmmx_fix.c&lt;br /&gt;+++ b/common/blit/blit_wmmx_fix.c&lt;br /&gt;@@ -32,7 +32,7 @@&lt;br /&gt;// RScale==32 &amp;amp;&amp;amp; !SwapXY 16x4 -&amp;gt; 8x2&lt;br /&gt;// RScale==32 &amp;amp;&amp;amp; SwapXY  4x16 -&amp;gt; 8x2&lt;br /&gt;&lt;br /&gt;-#if defined(ARM)&lt;br /&gt;+#if defined(ARM) &amp;amp;&amp;amp; defined(CONFIG_DYNCODE)&lt;br /&gt;&lt;br /&gt;typedef struct stack&lt;br /&gt;{&lt;br /&gt;diff --git a/common/cpu/cpu.c b/common/cpu/cpu.c&lt;br /&gt;index a68bad6..6e410d1 100644&lt;br /&gt;--- a/common/cpu/cpu.c&lt;br /&gt;+++ b/common/cpu/cpu.c&lt;br /&gt;@@ -64,8 +64,14 @@ void CPUDetect(cpudetect* p)&lt;br /&gt;&lt;br /&gt;#ifdef ARM&lt;br /&gt;p-&amp;gt;Arch = T("ARM");&lt;br /&gt;- SafeGetCpuId(0,CpuId);&lt;br /&gt;+ //SafeGetCpuId(0,CpuId);&lt;br /&gt;&lt;br /&gt;+ p-&amp;gt;ICache = 16*1024;&lt;br /&gt;+ p-&amp;gt;DCache = 16*1024;&lt;br /&gt;+ Caps |= CAPS_ARM_GENERAL;&lt;br /&gt;+ p-&amp;gt;Model = T("1020E");&lt;br /&gt;+ Caps |= CAPS_ARM_5E;&lt;br /&gt;+/*&lt;br /&gt;if (CpuId[0])&lt;br /&gt;{&lt;br /&gt; p-&amp;gt;ICache = 512 &amp;lt;&amp;lt; ((CpuId[1] &amp;gt;&amp;gt; 6) &amp;amp; 7);&lt;br /&gt;@@ -156,7 +162,7 @@ void CPUDetect(cpudetect* p)&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;-&lt;br /&gt;+*/&lt;br /&gt;#elif defined(MIPS)&lt;br /&gt;SafeGetCpuId(0,CpuId);&lt;br /&gt;p-&amp;gt;Arch = T("MIPS");&lt;br /&gt;diff --git a/common/pcm/pcm_arm.c b/common/pcm/pcm_arm.c&lt;br /&gt;index 8ebe96e..269fdc1 100644&lt;br /&gt;--- a/common/pcm/pcm_arm.c&lt;br /&gt;+++ b/common/pcm/pcm_arm.c&lt;br /&gt;@@ -25,7 +25,7 @@&lt;br /&gt;#include "../dyncode/dyncode.h"&lt;br /&gt;#include "pcm_soft.h"&lt;br /&gt;&lt;br /&gt;-#if defined(ARM)&lt;br /&gt;+#if defined(ARM) &amp;amp;&amp;amp; defined(CONFIG_DYNCODE)&lt;br /&gt;&lt;br /&gt;typedef struct stack&lt;br /&gt;{&lt;br /&gt;diff --git a/common/portab.h b/common/portab.h&lt;br /&gt;index 3b47674..bce4701 100644&lt;br /&gt;--- a/common/portab.h&lt;br /&gt;+++ b/common/portab.h&lt;br /&gt;@@ -71,7 +71,7 @@&lt;br /&gt;#endif&lt;br /&gt;&lt;br /&gt;#if defined(ARM) || defined(MIPS) || defined(SH3)&lt;br /&gt;-#define CONFIG_DYNCODE&lt;br /&gt;+#undef CONFIG_DYNCODE&lt;br /&gt;#endif&lt;br /&gt;&lt;br /&gt;#if defined(_M_IX86)&lt;br /&gt;diff --git a/common/win32/platform_win32.c b/common/win32/platform_win32.c&lt;br /&gt;index 0df8c42..78ae591 100644&lt;br /&gt;--- a/common/win32/platform_win32.c&lt;br /&gt;+++ b/common/win32/platform_win32.c&lt;br /&gt;@@ -670,7 +670,7 @@ void Platform_Init()&lt;br /&gt;&lt;br /&gt;BacklightEvent = CreateEvent(NULL, FALSE, FALSE, T("TIMEOUTDISPLAYOFF"));&lt;br /&gt;&lt;br /&gt;- Power_Init();&lt;br /&gt;+ //Power_Init();&lt;br /&gt;#endif&lt;br /&gt;&lt;br /&gt;if (!Context()-&amp;gt;CodePage)&lt;br /&gt;@@ -976,6 +976,7 @@ bool_t GetDisplayPower()&lt;br /&gt;&lt;br /&gt;int SetDisplayPower(bool_t State,bool_t Force)&lt;br /&gt;{&lt;br /&gt;+/*&lt;br /&gt;VIDEO_POWER_MANAGEMENT VPM;&lt;br /&gt;HDC DC;&lt;br /&gt;&lt;br /&gt;@@ -991,6 +992,7 @@ int SetDisplayPower(bool_t State,bool_t Force)&lt;br /&gt; ExtEscape(DC, SETPOWERMANAGEMENT, sizeof(VPM), (LPCSTR) &amp;amp;VPM, 0, NULL);&lt;br /&gt; ReleaseDC(NULL, DC);&lt;br /&gt;}&lt;br /&gt;+*/&lt;br /&gt;return ERR_NONE;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;diff --git a/common/win32/str_win32.c b/common/win32/str_win32.c&lt;br /&gt;index 77bc3bf..04f8a34 100644&lt;br /&gt;--- a/common/win32/str_win32.c&lt;br /&gt;+++ b/common/win32/str_win32.c&lt;br /&gt;@@ -24,6 +24,7 @@&lt;br /&gt;#include "../common.h"&lt;br /&gt;#include "../gzip.h"&lt;br /&gt;&lt;br /&gt;+&lt;br /&gt;#define MAXTEXT  20000&lt;br /&gt;&lt;br /&gt;#if defined(TARGET_WIN32) || defined(TARGET_WINCE)&lt;br /&gt;diff --git a/interface/win32/interface.c b/interface/win32/interface.c&lt;br /&gt;index ac68894..375060f 100644&lt;br /&gt;--- a/interface/win32/interface.c&lt;br /&gt;+++ b/interface/win32/interface.c&lt;br /&gt;@@ -2765,10 +2765,12 @@ static bool_t Proc(intface* p, int Msg, uint32_t wParam, uint32_t lParam, int* R&lt;br /&gt; break;&lt;br /&gt;&lt;br /&gt;case WM_KEYUP:&lt;br /&gt;+/*&lt;br /&gt;#if defined(TARGET_WINCE)&lt;br /&gt; if (!GetDisplayPower())&lt;br /&gt;  SetDisplayPower(0,1);&lt;br /&gt;#endif&lt;br /&gt;+*/&lt;br /&gt; Key = WinKeyState(KeyRotate(p,wParam));&lt;br /&gt; for (i=0;i&amp;lt;HOTKEYCOUNT;++i)&lt;br /&gt;  if (p-&amp;gt;HotKey[i] &amp;amp;&amp;amp; (p-&amp;gt;HotKey[i] &amp;amp; ~HOTKEY_KEEP) == Key)&lt;br /&gt;@@ -2792,6 +2794,7 @@ static bool_t Proc(intface* p, int Msg, uint32_t wParam, uint32_t lParam, int* R&lt;br /&gt; break;&lt;br /&gt;&lt;br /&gt;case WM_HOTKEY:&lt;br /&gt;+/*&lt;br /&gt;#if defined(TARGET_WINCE)&lt;br /&gt; if ((LOWORD(lParam) &amp;amp; MOD_KEYUP))&lt;br /&gt; {&lt;br /&gt;@@ -2800,7 +2803,8 @@ static bool_t Proc(intface* p, int Msg, uint32_t wParam, uint32_t lParam, int* R&lt;br /&gt; }&lt;br /&gt; else&lt;br /&gt;#endif&lt;br /&gt;-   PostMessage(p-&amp;gt;Win.Wnd,WM_COMMAND,wParam,0);&lt;br /&gt;+*/&lt;br /&gt;+  PostMessage(p-&amp;gt;Win.Wnd,WM_COMMAND,wParam,0);&lt;br /&gt; *Result = 0;&lt;br /&gt; return 1;&lt;br /&gt;&lt;br /&gt;diff --git a/interface/win32/win_win32.c b/interface/win32/win_win32.c&lt;br /&gt;index 7c92a1f..821cbe4 100644&lt;br /&gt;--- a/interface/win32/win_win32.c&lt;br /&gt;+++ b/interface/win32/win_win32.c&lt;br /&gt;@@ -2592,6 +2592,7 @@ static void HandleMessage(win* p,MSG* Msg)&lt;br /&gt;{&lt;br /&gt;int Result;&lt;br /&gt;&lt;br /&gt;+/*&lt;br /&gt;#if defined(TARGET_WINCE)&lt;br /&gt;if (Msg-&amp;gt;message == WM_HIBERNATE)&lt;br /&gt;{&lt;br /&gt;@@ -2599,7 +2600,7 @@ static void HandleMessage(win* p,MSG* Msg)&lt;br /&gt;  NodeHibernate();&lt;br /&gt;}&lt;br /&gt;#endif&lt;br /&gt;-&lt;br /&gt;+*/&lt;br /&gt;if (Msg-&amp;gt;message &amp;gt;= WM_APP + 0x200 &amp;amp;&amp;amp;&lt;br /&gt; Msg-&amp;gt;message &amp;lt;= WM_APP + 0x220)&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2117270136732158310-1523404095784351116?l=realchecko.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realchecko.blogspot.com/feeds/1523404095784351116/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2117270136732158310&amp;postID=1523404095784351116' title='2 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/1523404095784351116'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/1523404095784351116'/><link rel='alternate' type='text/html' href='http://realchecko.blogspot.com/2010/05/tcpmp-for-wince-60.html' title='tcpmp for WINCE 6.0'/><author><name>Checko</name><uri>http://www.blogger.com/profile/03239306354367907990</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/blogger/669/302/320/IMGP0803.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2117270136732158310.post-7095814521399787261</id><published>2010-05-07T14:21:00.004+08:00</published><updated>2010-05-12T15:50:17.022+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tcpmp'/><category scheme='http://www.blogger.com/atom/ns#' term='ffmpeg'/><category scheme='http://www.blogger.com/atom/ns#' term='WindowsCE'/><title type='text'>Log : trace tcpmp exception on CE 6.0 - assembly code</title><content type='html'>看一下 assembly code exception 的原因：&lt;br /&gt;&lt;pre&gt;p-&amp;gt;Entry(p,Dst,Src,*DstLength,&amp;amp;p-&gt;State,Volume)&lt;/pre&gt;&lt;br /&gt;對應的 assmbly code是：&lt;br /&gt;&lt;pre&gt;41041954 E59D3044             ldr         r3, Volume, #0x44&lt;br /&gt;41041958 E58D3004             str         r3, [sp, #4]&lt;br /&gt;4104195C E59D302C             ldr         r3, p, #0x2C&lt;br /&gt;41041960 E2833004             add         r3, r3, #4&lt;br /&gt;41041964 E58D3000             str         r3, [sp]&lt;br /&gt;41041968 E59D3038             ldr         r3, DstLength, #0x38&lt;br /&gt;4104196C E5933000             ldr         r3, [r3]&lt;br /&gt;41041970 E59D2034             ldr         r2, Src, #0x34&lt;br /&gt;41041974 E59D1030             ldr         r1, Dst, #0x30&lt;br /&gt;41041978 E59D002C             ldr         r0, p, #0x2C&lt;br /&gt;4104197C E59DE02C             ldr         lr, p, #0x2C&lt;br /&gt;41041980 E59E4000             ldr         r4, [lr]&lt;br /&gt;41041984 E1A0E00F             mov         lr, pc&lt;br /&gt;41041988 E1A0F004             mov         pc, r4&lt;br /&gt;&lt;/pre&gt;可以看到 參數傳遞是 r0~r3,stack,stack&lt;br /&gt;&lt;br /&gt;Entry( ) 內的 assembly code 是：&lt;br /&gt;&lt;pre&gt;010A0000 00000000             andeq       r0, r0, r0&lt;br /&gt;010A0004 00000000             andeq       r0, r0, r0&lt;br /&gt;010A0008 00000000             andeq       r0, r0, r0&lt;br /&gt;010A000C 00000000             andeq       r0, r0, r0&lt;br /&gt;010A0010 E59D4028             ldr         r4, [sp, #0x28]&lt;br /&gt;010A0014 E5947004             ldr         r7, [r4, #4]&lt;br /&gt;010A0018 E5948008             ldr         r8, [r4, #8]&lt;br /&gt;010A001C E59D002C             ldr         r0, [sp, #0x2C]&lt;br /&gt;010A0020 E3570C01             cmp         r7, #1, 24&lt;br /&gt;010A0024 1A000006             bne         010A0044&lt;br /&gt;010A0028 E0D920F2             ldrsh       r2, [r9], #2&lt;br /&gt;010A002C E0020290             mul         r2, r0, r2&lt;br /&gt;010A0030 E1A02442             mov         r2, r2, asr #8&lt;br /&gt;010A0034 E0CB20B2             strh        r2, [r11], #2&lt;br /&gt;010A0038 E15B000E             cmp         r11, lr&lt;br /&gt;010A003C 1AFFFFF9             bne         010A0028&lt;br /&gt;010A0040 E8BD9FF0             ldmia       sp!, {r4 - r12, pc}&lt;br /&gt;010A0044 E1A03428             mov         r3, r8, lsr #8&lt;br /&gt;010A0048 E1A03083             mov         r3, r3, lsl #1&lt;br /&gt;010A004C E19920F3             ldrsh       r2, [r9, +r3]&lt;br /&gt;010A0050 E0888007             add         r8, r8, r7&lt;br /&gt;010A0054 E0020290             mul         r2, r0, r2&lt;br /&gt;010A0058 E1A02442             mov         r2, r2, asr #8&lt;br /&gt;010A005C E0CB20B2             strh        r2, [r11], #2&lt;br /&gt;010A0060 E15B000E             cmp         r11, lr&lt;br /&gt;010A0064 1AFFFFF6             bne         010A0044&lt;br /&gt;010A0068 E8BD9FF0             ldmia       sp!, {r4 - r12, pc}&lt;br /&gt;&lt;/pre&gt;看到好像argument 完全不對應，r0 甚至被破壞..&lt;br /&gt;在 CompileCode( ), BuildCode( ) 完後，0x10A000 的內容：&lt;br /&gt;&lt;pre&gt;010A0000  F0 5F 2D E9 00 B0 91 E5 03 E0 8B E0 00 90 92 E5  ._-.............&lt;br /&gt;010A0010  28 40 9D E5 04 70 94 E5 08 80 94 E5 2C 00 9D E5  (@...p......,...&lt;br /&gt;010A0020  01 0C 57 E3 06 00 00 1A F2 20 D9 E0 90 02 02 E0  ..W...... ......&lt;br /&gt;010A0030  42 24 A0 E1 B2 20 CB E0 0E 00 5B E1 F9 FF FF 1A  B$... ....[.....&lt;br /&gt;010A0040  F0 9F BD E8 28 34 A0 E1 83 30 A0 E1 F3 20 99 E1  ....(4...0... ..&lt;br /&gt;010A0050  07 80 88 E0 90 02 02 E0 42 24 A0 E1 B2 20 CB E0  ........B$... ..&lt;br /&gt;010A0060  0E 00 5B E1 F6 FF FF 1A F0 9F BD E8 00 00 00 00  ..[.............&lt;/pre&gt;&lt;br /&gt;可以看到是不一樣的，0x10A0000 到 0x10A000F 都被清成 0x00。&lt;br /&gt;&lt;br /&gt;之後的 code 果然跟 cache 有關，code都做完後，就要：&lt;br /&gt;&lt;pre&gt;void CodeUnlock(void* Code,int Size)&lt;br /&gt;{&lt;br /&gt;DWORD Protect;&lt;br /&gt;VirtualProtect(Code,Size,PAGE_EXECUTE_READ,&amp;amp;Protect);&lt;br /&gt;&lt;br /&gt;if (FuncCacheSync)&lt;br /&gt;    FuncCacheSync(CACHE_SYNC_INSTRUCTIONS);&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;很奇怪的是，如果在這其中 break 一下(用KITL)，或是完成後，用 DebugWindow 的 Memory 來 check 一下，資料就會正確。&lt;br /&gt;&lt;blockquote&gt;真的是cache 的關係？ 這個 ARM11 有L2 cache..&lt;/blockquote&gt;&lt;br /&gt;在 &lt;a href="http://msdn.microsoft.com/en-us/library/ee482951.aspx"&gt;msdn 這一頁&lt;/a&gt; 有列出，CacheSync 是 Kernel Mode Only.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2117270136732158310-7095814521399787261?l=realchecko.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realchecko.blogspot.com/feeds/7095814521399787261/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2117270136732158310&amp;postID=7095814521399787261' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/7095814521399787261'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/7095814521399787261'/><link rel='alternate' type='text/html' href='http://realchecko.blogspot.com/2010/05/log-trace-tcpmp-exception-on-ce-60_07.html' title='Log : trace tcpmp exception on CE 6.0 - assembly code'/><author><name>Checko</name><uri>http://www.blogger.com/profile/03239306354367907990</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/blogger/669/302/320/IMGP0803.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2117270136732158310.post-9171410867949835928</id><published>2010-05-06T18:47:00.005+08:00</published><updated>2010-05-12T15:50:17.023+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tcpmp'/><category scheme='http://www.blogger.com/atom/ns#' term='ffmpeg'/><category scheme='http://www.blogger.com/atom/ns#' term='WindowsCE'/><title type='text'>Log : tcpmp - add ffmpeg codec support</title><content type='html'>將 ffmpeg project 加入 tcpmp 中。&lt;br /&gt;因為這樣加入的不會有 tcpmp 的 project setting，所以要手動加入 common.lib 的 library path。&lt;br /&gt;還要手動把 common.lib 加入 link library&lt;br /&gt;還要手動設定 output path 到 tcpmp\... 下 (跟大家一樣)&lt;br /&gt;&lt;br /&gt;tcpmp 啟動會自動 load 所有 *.plg 檔，所以 ffmpeg.plg 會被 load 進去。&lt;br /&gt;&lt;br /&gt;開啟 MPEG2 file (DVD) 試試... 一樣發生 exception.. 好像跟 pcm 一樣，是在 assembly - entry( ) 的地方&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2117270136732158310-9171410867949835928?l=realchecko.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realchecko.blogspot.com/feeds/9171410867949835928/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2117270136732158310&amp;postID=9171410867949835928' title='3 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/9171410867949835928'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/9171410867949835928'/><link rel='alternate' type='text/html' href='http://realchecko.blogspot.com/2010/05/log-tcpmp-add-ffmpeg-codec-support.html' title='Log : tcpmp - add ffmpeg codec support'/><author><name>Checko</name><uri>http://www.blogger.com/profile/03239306354367907990</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/blogger/669/302/320/IMGP0803.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2117270136732158310.post-1393848106079561746</id><published>2010-05-06T16:48:00.006+08:00</published><updated>2010-05-12T15:50:17.024+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tcpmp'/><category scheme='http://www.blogger.com/atom/ns#' term='ffmpeg'/><category scheme='http://www.blogger.com/atom/ns#' term='WindowsCE'/><title type='text'>Log : trace tcpmp exception on CE 6.0 - remove exception</title><content type='html'>只好啟動 KITL，作 單布執行。&lt;br /&gt;&lt;ul&gt;&lt;li&gt;enable debug ouput ，rebuild all。&lt;/li&gt;&lt;li&gt;copy all the files in release folder (其實重要的是 pdb) to WINCE600 project release folder&lt;br /&gt;&lt;/li&gt;&lt;li&gt;copy language filt (*.txt) to release WINCE600 project release folder&lt;/li&gt;&lt;li&gt;啟動 KITL 連線，設定 player.exe, common.dll, interface.plg 都由 release folder 取得&lt;/li&gt;&lt;li&gt;啟動 target control，s player.exe&lt;/li&gt;&lt;li&gt;選一個 mp3 file&lt;/li&gt;&lt;li&gt;exception 發生！！&lt;/li&gt;&lt;li&gt;從 call stack 看exception 位置&lt;/li&gt;&lt;/ul&gt;查到是 common\pcm\pcm_soft.c 的 PCMConvert( )，在執行         &lt;pre&gt;p-&amp;gt;Entry(p,Dst,Src,*DstLength,&amp;amp;p-&amp;gt;State,Volume);&lt;/pre&gt;&lt;br /&gt;中 發生 exception。&lt;br /&gt;&lt;br /&gt;trace code，看到 pcm_arm.c&lt;br /&gt;這個好像是在作 arm assembler.....&lt;br /&gt;&lt;pre&gt;            CodeStart(&amp;amp;p-&amp;gt;Code);&lt;br /&gt;         PCMCompile(p);&lt;br /&gt;         CodeBuild(&amp;amp;p-&amp;gt;Code);&lt;br /&gt;         if (p-&amp;gt;Code.Size)&lt;br /&gt;             p-&amp;gt;Entry = (pcmsoftentry)p-&amp;gt;Code.Code;&lt;br /&gt;&lt;/pre&gt;其中 PCMCompile()..&lt;br /&gt;&lt;pre&gt;    // dst pointers&lt;br /&gt; I2C(LDR,R11,R1,0);&lt;br /&gt; I3(ADD,R14,R11,R3); // dstend&lt;br /&gt;&lt;br /&gt; // src pointers&lt;br /&gt; I2C(LDR,R9,R2,0);&lt;br /&gt;&lt;br /&gt; I2C(LDR,R4,SP,OFS(stack,State));&lt;br /&gt; I2C(LDR,R7,R4,OFS(pcmstate,Step));&lt;br /&gt; I2C(LDR,R8,R4,OFS(pcmstate,Pos));&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;不知道這一段 assmbly code 為什麼不能在 CE 6.0 (或是因為 arm11 的關係?)。&lt;br /&gt;在播放wav時，entry( ) 的內容是：&lt;br /&gt;&lt;pre&gt;10A0000 00000000             andeq       r0, r0, r0&lt;br /&gt;010A0004 00000000             andeq       r0, r0, r0&lt;br /&gt;010A0008 00000000             andeq       r0, r0, r0&lt;br /&gt;010A000C 00000000             andeq       r0, r0, r0&lt;br /&gt;010A0010 E59D4028             ldr         r4, [sp, #0x28]&lt;br /&gt;010A0014 E5947004             ldr         r7, [r4, #4]&lt;br /&gt;010A0018 E5948008             ldr         r8, [r4, #8]&lt;br /&gt;010A001C E59D002C             ldr         r0, [sp, #0x2C]&lt;br /&gt;010A0020 E3570C01             cmp         r7, #1, 24&lt;br /&gt;010A0024 1A000006             bne         010A0044&lt;br /&gt;010A0028 E0D920F2             ldrsh       r2, [r9], #2&lt;br /&gt;010A002C E0020290             mul         r2, r0, r2&lt;br /&gt;010A0030 E1A02442             mov         r2, r2, asr #8&lt;br /&gt;010A0034 E0CB20B2             strh        r2, [r11], #2&lt;br /&gt;010A0038 E15B000E             cmp         r11, lr&lt;br /&gt;010A003C 1AFFFFF9             bne         010A0028&lt;br /&gt;010A0040 E8BD9FF0             ldmia       sp!, {r4 - r12, pc}&lt;br /&gt;010A0044 E1A03428             mov         r3, r8, lsr #8&lt;br /&gt;010A0048 E1A03083             mov         r3, r3, lsl #1&lt;br /&gt;010A004C E19920F3             ldrsh       r2, [r9, +r3]&lt;br /&gt;010A0050 E0888007             add         r8, r8, r7&lt;br /&gt;010A0054 E0020290             mul         r2, r0, r2&lt;br /&gt;010A0058 E1A02442             mov         r2, r2, asr #8&lt;br /&gt;010A005C E0CB20B2             strh        r2, [r11], #2&lt;br /&gt;010A0060 E15B000E             cmp         r11, lr&lt;br /&gt;010A0064 1AFFFFF6             bne         010A0044&lt;br /&gt;010A0068 E8BD9FF0             ldmia       sp!, {r4 - r12, pc}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;所以這一段不用 assembly code 改用 UniversalType( )&lt;br /&gt;&lt;pre&gt;#if 0 //(defined(ARM) || defined(SH3) || defined(MIPS)) &amp;amp;&amp;amp; defined(CONFIG_DYNCODE)&lt;br /&gt;         CodeStart(&amp;amp;p-&amp;gt;Code);&lt;br /&gt;         PCMCompile(p);&lt;br /&gt;         CodeBuild(&amp;amp;p-&amp;gt;Code);&lt;br /&gt;         if (p-&amp;gt;Code.Size)&lt;br /&gt;             p-&amp;gt;Entry = (pcmsoftentry)p-&amp;gt;Code.Code;&lt;br /&gt;#else&lt;br /&gt;         p-&amp;gt;SrcType = UniversalType(&amp;amp;p-&amp;gt;Src);&lt;br /&gt;         p-&amp;gt;DstType = UniversalType(&amp;amp;p-&amp;gt;Dst);&lt;br /&gt;         p-&amp;gt;Entry = PCMUniversal;&lt;br /&gt;&lt;/pre&gt;還要記得把 UniversalType( ) 的 define guard um-comment 掉。&lt;br /&gt;&lt;br /&gt;！！這樣就可沒有 exception 了。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2117270136732158310-1393848106079561746?l=realchecko.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realchecko.blogspot.com/feeds/1393848106079561746/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2117270136732158310&amp;postID=1393848106079561746' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/1393848106079561746'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/1393848106079561746'/><link rel='alternate' type='text/html' href='http://realchecko.blogspot.com/2010/05/log-trace-tcpmp-exception-on-ce-60.html' title='Log : trace tcpmp exception on CE 6.0 - remove exception'/><author><name>Checko</name><uri>http://www.blogger.com/profile/03239306354367907990</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/blogger/669/302/320/IMGP0803.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2117270136732158310.post-7099915322665545809</id><published>2010-05-06T14:09:00.004+08:00</published><updated>2010-05-12T15:50:17.025+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tcpmp'/><category scheme='http://www.blogger.com/atom/ns#' term='ffmpeg'/><category scheme='http://www.blogger.com/atom/ns#' term='WindowsCE'/><title type='text'>tcpmp source code - use default language, exception</title><content type='html'>tcpmp 會利用  GetLocaleInfo( ) 來取得 platform 的語系資訊。&lt;br /&gt;&lt;br /&gt;如過想要強制使用英文，可以修改  platform_win32.c 的 DefaultLang( )，強制 return LANG_DEFAULT 就可以。&lt;br /&gt;&lt;br /&gt;tcpmp 還有一段 : SafeException( ) ，將整個 code body 包起來：&lt;br /&gt;&lt;pre&gt;#define SAFE_BEGIN __try {&lt;br /&gt;.... code body...&lt;br /&gt;#define SAFE_END ;} __except (SafeException(_exception_info())) {}&lt;br /&gt;&lt;/pre&gt;SafeException( ) 的 funciton 是：&lt;br /&gt;&lt;pre&gt;int SafeException(void* p)&lt;br /&gt;{&lt;br /&gt;  EXCEPTION_POINTERS* Data = (EXCEPTION_POINTERS*)p;&lt;br /&gt;  stream* File;&lt;br /&gt;  tchar_t Path[MAXPATH];&lt;br /&gt;&lt;br /&gt;  if (Context())&lt;br /&gt;  {&lt;br /&gt;      GetDebugPath(Path,TSIZEOF(Path),T("crash.txt"));&lt;br /&gt;      File = StreamOpen(Path,1);&lt;br /&gt;      if (File)&lt;br /&gt;      {&lt;br /&gt;          void** Stack;&lt;br /&gt;          contextreg* r;&lt;br /&gt;          int No;&lt;br /&gt;          const uint8_t* ContextRecord = (const uint8_t*) Data-&amp;gt;ContextRecord;&lt;br /&gt;          EXCEPTION_RECORD* Record = Data-&amp;gt;ExceptionRecord;&lt;br /&gt;          tchar_t* Name;&lt;br /&gt;          int DllBase;&lt;br /&gt;          tchar_t DllName[MAXPATH];&lt;br /&gt;&lt;br /&gt;          StreamPrintf(File,T("%s %s crash report\n----------------------------\n"),&lt;br /&gt;                  Context()-&amp;gt;ProgramName,Context()-&amp;gt;ProgramVersion);&lt;br /&gt;&lt;br /&gt;          switch (Record-&amp;gt;ExceptionCode)&lt;br /&gt;          {&lt;br /&gt;          case STATUS_ACCESS_VIOLATION:        Name = T("Access violation"); break;&lt;br /&gt;          case STATUS_BREAKPOINT:                Name = T("Breakpoint"); break;&lt;br /&gt;          case STATUS_DATATYPE_MISALIGNMENT:    Name = T("Datatype misalignment"); break;&lt;br /&gt;          case STATUS_ILLEGAL_INSTRUCTION:    Name = T("Illegal instruction"); break;&lt;br /&gt;          case STATUS_INTEGER_DIVIDE_BY_ZERO: Name = T("Int divide by zero"); break;&lt;br /&gt;          case STATUS_INTEGER_OVERFLOW:        Name = T("Int overflow"); break;&lt;br /&gt;          case STATUS_PRIVILEGED_INSTRUCTION: Name = T("Priv instruction"); break;&lt;br /&gt;          case STATUS_STACK_OVERFLOW:            Name = T("Stack overflow"); break;&lt;br /&gt;          default:                            Name = T("Unknown"); break;&lt;br /&gt;          }&lt;br /&gt;&lt;br /&gt;          if (!NodeLocatePtr(Record-&amp;gt;ExceptionAddress,DllName,TSIZEOF(DllName),&amp;amp;DllBase))&lt;br /&gt;          {&lt;br /&gt;              DllName[0] = 0;&lt;br /&gt;              DllBase = (int)Record-&amp;gt;ExceptionAddress;&lt;br /&gt;          }&lt;br /&gt;          StreamPrintf(File,T("%s(%08x) at %08x (%s:%08x)"),Name,Record-&amp;gt;ExceptionCode,Record-&amp;gt;ExceptionAddress,DllName,DllBase);&lt;br /&gt;&lt;br /&gt;          if (Record-&amp;gt;ExceptionCode == STATUS_ACCESS_VIOLATION)&lt;br /&gt;          {&lt;br /&gt;              if (Record-&amp;gt;ExceptionInformation[0])&lt;br /&gt;                  Name = T("Write to");&lt;br /&gt;              else&lt;br /&gt;                  Name = T("Read from");&lt;br /&gt;              StreamPrintf(File,T("\n%s %08x"),Name,Record-&amp;gt;ExceptionInformation[1]);&lt;br /&gt;              if (NodeLocatePtr((void*)Record-&amp;gt;ExceptionInformation[1],DllName,TSIZEOF(DllName),&amp;amp;DllBase))&lt;br /&gt;                  StreamPrintf(File,T(" (%s:%08x)"),DllName,DllBase);&lt;br /&gt;          }&lt;br /&gt;       &lt;br /&gt;          // context&lt;br /&gt;&lt;br /&gt;          StreamPrintf(File,T("\n\ncpu dump:"));&lt;br /&gt;&lt;br /&gt;          for (r=Reg;r-&amp;gt;Name;++r)&lt;br /&gt;          {&lt;br /&gt;              void* Ptr = *(void**)(ContextRecord+r-&amp;gt;Ofs);&lt;br /&gt;&lt;br /&gt;              StreamPrintf(File,T("\n%-5s = %08x"),r-&amp;gt;Name,Ptr);&lt;br /&gt;&lt;br /&gt;              if (NodeLocatePtr(Ptr,DllName,TSIZEOF(DllName),&amp;amp;DllBase))&lt;br /&gt;                  StreamPrintf(File,T(" (%s:%08x)"),DllName,DllBase);&lt;br /&gt;          }&lt;br /&gt;&lt;br /&gt;          if (r-&amp;gt;Ofs &amp;gt;= 0)&lt;br /&gt;          {&lt;br /&gt;              StreamPrintf(File,T("\n\nstack dump:"));&lt;br /&gt;&lt;br /&gt;              Stack = *(void***)(ContextRecord+r-&amp;gt;Ofs);&lt;br /&gt;              for (No=0;No&amp;lt;256;++No,++Stack)&lt;br /&gt;              {&lt;br /&gt;                  if (!IsBadReadPtr(Stack,sizeof(void*)))&lt;br /&gt;                  {&lt;br /&gt;                      void* Ptr = *Stack;&lt;br /&gt;&lt;br /&gt;                      StreamPrintf(File,T("\n%08x %08x"),Stack,Ptr);&lt;br /&gt;&lt;br /&gt;                      if (NodeLocatePtr(Ptr,DllName,TSIZEOF(DllName),&amp;amp;DllBase))&lt;br /&gt;                          StreamPrintf(File,T(" (%s:%08x)"),DllName,DllBase);&lt;br /&gt;                  }&lt;br /&gt;                  else&lt;br /&gt;                      StreamPrintf(File,T("\n%08x ????????"),Stack);&lt;br /&gt;              }&lt;br /&gt;          }&lt;br /&gt;&lt;br /&gt;          StreamPrintf(File,T("\n\n"));&lt;br /&gt;          TRY_BEGIN&lt;br /&gt;          {&lt;br /&gt;              NodeBroadcast(NODE_CRASH,NULL,0);&lt;br /&gt;          }&lt;br /&gt;          TRY_END&lt;br /&gt;          NodeDump(File);&lt;br /&gt;          StreamClose(File);&lt;br /&gt;      }&lt;br /&gt;&lt;br /&gt;      MessageBox(NULL,LangStr(PLATFORM_ID,PLATFORM_CRASH_MESSAGE),&lt;br /&gt;          LangStr(PLATFORM_ID,PLATFORM_CRASH_TITLE),MB_OK|MB_SETFOREGROUND|MB_TOPMOST|MB_ICONSTOP);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  Mem_Done(); // use safevirtualfree (if done by OS, it could be buggy on O2 Atom)&lt;br /&gt;  TerminateProcess(GetCurrentProcess(),1);&lt;br /&gt;  return 1;&lt;br /&gt;}&lt;/pre&gt;就是把 exception 的資料存入 crash.txt。&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;有關 ce 的 try except，在這一篇有說明 &lt;a href="http://windows-ce-dox.net/MS.Press-Programming.Microsoft/html/ch087.htm"&gt;http://windows-ce-dox.net/MS.Press-Programming.Microsoft/html/ch087.htm&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2117270136732158310-7099915322665545809?l=realchecko.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realchecko.blogspot.com/feeds/7099915322665545809/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2117270136732158310&amp;postID=7099915322665545809' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/7099915322665545809'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/7099915322665545809'/><link rel='alternate' type='text/html' href='http://realchecko.blogspot.com/2010/05/tcpmp-source-code-use-default-language.html' title='tcpmp source code - use default language, exception'/><author><name>Checko</name><uri>http://www.blogger.com/profile/03239306354367907990</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/blogger/669/302/320/IMGP0803.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2117270136732158310.post-617943779675337481</id><published>2010-05-06T10:30:00.005+08:00</published><updated>2010-05-12T15:50:17.026+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tcpmp'/><category scheme='http://www.blogger.com/atom/ns#' term='ffmpeg'/><category scheme='http://www.blogger.com/atom/ns#' term='WindowsCE'/><title type='text'>Log : trace tcpmp exception on CE 6.0 SetKMode</title><content type='html'>在 CE 6.0 不能 run 的原因好像是 SetKMode( ) 嗎？&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;雖然 SetKMode 在 CE 6.0 已經不支援了，但是 CoreDll.dll 裡還是找得到 function。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;SetKMode( ) 在 DetectCPU() 中使用，主要在知道 cpu type，設定好一堆 instruction capabilty。&lt;/div&gt;&lt;div&gt;這樣之後的一堆 image process 會依照 cpu 的 capability (指令集) 決定 code。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;只好 hard code &lt;/div&gt;&lt;div&gt;&lt;pre&gt;&lt;span class="Apple-style-span" style="white-space: pre;"&gt;if ((CpuId[0] &amp;amp; 0xFF000000) == 0x41000000) //arm&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="Apple-style-span" style="white-space: pre;"&gt;  {   Caps |= CAPS_ARM_GENERAL;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="Apple-style-span" style="white-space: pre;"&gt;   switch ((CpuId[0] &amp;gt;&amp;gt; 4) &amp;amp; 0xFFF)&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="Apple-style-span" style="white-space: pre;"&gt;   {&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="Apple-style-span" style="white-space: pre;"&gt;   case 0x920: p-&amp;gt;Model = T("920T");&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="Apple-style-span" style="white-space: pre;"&gt; break;   case 0x922: p-&amp;gt;Model = T("922T"); break;   case 0x926: p-&amp;gt;Model = T("926E"); Caps |= CAPS_ARM_5E; break;   case 0x940: p-&amp;gt;Model = T("940T"); break;   case 0x946: p-&amp;gt;Model = T("946E"); Caps |= CAPS_ARM_5E; break;   case 0xA22: p-&amp;gt;Model = T("1020E"); Caps |= CAPS_ARM_5E; break;   }  }&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="white-space: pre;"&gt;還有&lt;pre&gt;if (CpuId[0])  {   p-&amp;gt;ICache = 512 &amp;lt;&amp;lt; ((CpuId[1] &amp;gt;&amp;gt; 6) &amp;amp; 7);   p-&amp;gt;DCache = 512 &amp;lt;&amp;lt; ((CpuId[1] &amp;gt;&amp;gt; 18) &amp;amp; 7);  }&lt;/pre&gt;&lt;/span&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="white-space: pre;"&gt;所以直接寫 &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="white-space: pre;"&gt;&lt;pre&gt;p-&amp;gt;ICache = 16*1024;  p-&amp;gt;DCache = 16*1024;  Caps |= CAPS_ARM_GENERAL;  p-&amp;gt;Model = T("1020E");  Caps |= CAPS_ARM_5E;&lt;/pre&gt;&lt;/span&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="white-space: pre;"&gt;其他的 code 都不要了。&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="white-space: pre;"&gt;這樣 exception 就沒了。&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="white-space: pre;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="white-space: pre;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="white-space: pre;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2117270136732158310-617943779675337481?l=realchecko.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realchecko.blogspot.com/feeds/617943779675337481/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2117270136732158310&amp;postID=617943779675337481' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/617943779675337481'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/617943779675337481'/><link rel='alternate' type='text/html' href='http://realchecko.blogspot.com/2010/05/log-trace-tcpmp-exception-on-ce-60_06.html' title='Log : trace tcpmp exception on CE 6.0 SetKMode'/><author><name>Checko</name><uri>http://www.blogger.com/profile/03239306354367907990</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/blogger/669/302/320/IMGP0803.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2117270136732158310.post-5827753617541725597</id><published>2010-05-06T10:30:00.004+08:00</published><updated>2010-05-12T15:50:17.027+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tcpmp'/><category scheme='http://www.blogger.com/atom/ns#' term='ffmpeg'/><category scheme='http://www.blogger.com/atom/ns#' term='WindowsCE'/><title type='text'>Log : Build tcpmp  - part II . exception on SetKMode</title><content type='html'>在 CE 6.0 不能 run 的原因好像是 SetKMode( ) 嗎？&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;雖然 SetKMode 在 CE 6.0 已經不支援了，但是 CoreDll.dll 裡還是找得到 function。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;SetKMode( ) 在 DetectCPU() 中使用，主要在知道 cpu type，設定好一堆 instruction capabilty。&lt;/div&gt;&lt;div&gt;這樣之後的一堆 image process 會依照 cpu 的 capability (指令集) 決定 code。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;只好 hard code &lt;/div&gt;&lt;div&gt;&lt;pre&gt;&lt;span class="Apple-style-span" style="white-space: pre;"&gt;if ((CpuId[0] &amp;amp; 0xFF000000) == 0x41000000) //arm&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="Apple-style-span" style="white-space: pre;"&gt;  {   Caps |= CAPS_ARM_GENERAL;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="Apple-style-span" style="white-space: pre;"&gt;   switch ((CpuId[0] &amp;gt;&amp;gt; 4) &amp;amp; 0xFFF)&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="Apple-style-span" style="white-space: pre;"&gt;   {&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="Apple-style-span" style="white-space: pre;"&gt;   case 0x920: p-&amp;gt;Model = T("920T");&lt;/span&gt; break;&lt;/pre&gt;&lt;pre&gt;   case 0x922: p-&amp;gt;Model = T("922T"); break;&lt;/pre&gt;&lt;pre&gt;   case 0x926: p-&amp;gt;Model = T("926E"); Caps |= CAPS_ARM_5E; break;&lt;/pre&gt;&lt;pre&gt;   case 0x940: p-&amp;gt;Model = T("940T"); break;&lt;/pre&gt;&lt;pre&gt;   case 0x946: p-&amp;gt;Model = T("946E"); Caps |= CAPS_ARM_5E; break;&lt;/pre&gt;&lt;pre&gt;   case 0xA22: p-&amp;gt;Model = T("1020E"); Caps |= CAPS_ARM_5E; break;&lt;/pre&gt;&lt;pre&gt;   }  }&lt;/pre&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="white-space: pre;"&gt;還有&lt;pre&gt;if (CpuId[0])&lt;/pre&gt;&lt;pre&gt;  {   p-&amp;gt;ICache = 512 &amp;lt;&amp;lt; ((CpuId[1] &amp;gt;&amp;gt; 6) &amp;amp; 7);&lt;/pre&gt;&lt;pre&gt;   p-&amp;gt;DCache = 512 &amp;lt;&amp;lt; ((CpuId[1] &amp;gt;&amp;gt; 18) &amp;amp; 7);&lt;/pre&gt;&lt;pre&gt;  }&lt;/pre&gt;&lt;/span&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="white-space: pre;"&gt;所以直接寫 &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="white-space: pre;"&gt;&lt;pre&gt;p-&amp;gt;ICache = 16*1024;&lt;/pre&gt;&lt;pre&gt;  p-&amp;gt;DCache = 16*1024;&lt;/pre&gt;&lt;pre&gt;  Caps |= CAPS_ARM_GENERAL;&lt;/pre&gt;&lt;pre&gt;  p-&amp;gt;Model = T("1020E");&lt;/pre&gt;&lt;pre&gt;  Caps |= CAPS_ARM_5E;&lt;/pre&gt;&lt;/span&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="white-space: pre;"&gt;其他的 code 都不要了。&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="white-space: pre;"&gt;這樣 exception 就沒了。&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="white-space: pre;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="white-space: pre;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="white-space: pre;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;... 然後第二個 exception 出現....&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2117270136732158310-5827753617541725597?l=realchecko.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realchecko.blogspot.com/feeds/5827753617541725597/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2117270136732158310&amp;postID=5827753617541725597' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/5827753617541725597'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/5827753617541725597'/><link rel='alternate' type='text/html' href='http://realchecko.blogspot.com/2010/05/ce-6.html' title='Log : Build tcpmp  - part II . exception on SetKMode'/><author><name>Checko</name><uri>http://www.blogger.com/profile/03239306354367907990</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/blogger/669/302/320/IMGP0803.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2117270136732158310.post-473556338570885610</id><published>2010-05-05T10:21:00.011+08:00</published><updated>2010-05-12T15:50:17.028+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tcpmp'/><category scheme='http://www.blogger.com/atom/ns#' term='ffmpeg'/><category scheme='http://www.blogger.com/atom/ns#' term='WindowsCE'/><category scheme='http://www.blogger.com/atom/ns#' term='Workrecord'/><category scheme='http://www.blogger.com/atom/ns#' term='Software'/><title type='text'>Log : Build tcpmp</title><content type='html'>tcpmp 0.72RC1 source code 的 download 位置是： http://picard.exceed.hu/tcpmp/test/&lt;div&gt;&lt;blockquote&gt;tcpmp 的開發已經終止，原公司開發 betaplayer，即將 opensource (?)&lt;/blockquote&gt;&lt;/div&gt;&lt;div&gt;開啟 tcpmp.sln 看，是 visual studio V9.0 ，所以使用 VS2005 開啟。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;build - 選 pocket pc 2003 (ARMV4) 版本build OK。&lt;/div&gt;&lt;div&gt;===&amp;gt; 但是 在 CE 5.0 上不能run，連 launch 都不行&lt;/div&gt;&lt;div&gt;&lt;blockquote&gt;發現是 load Interface.plg fail -- 根本沒有這個檔。&lt;/blockquote&gt;&lt;/div&gt;&lt;div&gt;follow readme，用 eVC d開啟，雖然 build fail，但是有出現 interface.plg 在 output folder。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;查看發現， interface 這個 subproject 有設定 output name 是 interface.plg (所以應該是 Dll rename 的)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;看VS2005 的 interface subproject，也有設定 output name 是 plg。&lt;/div&gt;&lt;div&gt;==&amp;gt;在 "packet pc 2003 (armv4)\debug" 下有 interface.plg&lt;/div&gt;&lt;div&gt;&lt;blockquote&gt;copy 到 SD card 上後，player.exe 果然 run 起來，接著出現 exception.. 畫面顯示： Language files (*.txt, *.tgz) ar missing.&lt;/blockquote&gt;&lt;/div&gt;&lt;div&gt;搜尋*.txt，在 lang 這個 folder 裡有很多語系的 txt file，都 copy 到 SD 上， run player .exe 就沒有 error message 了。&lt;br /&gt;&lt;br /&gt;在 CE 5.0 上 run OK，還可以開 WAVE file 播放，但是在 CE 6.0 就會有問題。&lt;br /&gt;&lt;/div&gt;&lt;div&gt;==&amp;gt;有 exception :&lt;/div&gt;&lt;div&gt;&lt;pre&gt;Exception 'Undefined Instruction' (1): Thread-Id=058e007a(pth=8db9e7c8), Proc-Id=0563008a(pprc=8dd91000) 'PLAYER.EXE', VM-active=0563008a(pprc=8dd91000) 'PLAYER.EXE'&lt;br /&gt;PC=41067188(common.dll+0x00097188) RA=41067498(common.dll+0x00097498) SP=0003fa8c, BVA=00000000&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;查到好像是在 Platform_Init ( ) 裡的  NodeRegisterClass(&amp;amp;Platform) 裡。&lt;br /&gt;但是同一function : NodeRegisterClass&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;死在 CallCreate( ) ，這是一個 recursive 程式。&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2117270136732158310-473556338570885610?l=realchecko.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realchecko.blogspot.com/feeds/473556338570885610/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2117270136732158310&amp;postID=473556338570885610' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/473556338570885610'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/473556338570885610'/><link rel='alternate' type='text/html' href='http://realchecko.blogspot.com/2010/05/log-build-tcpmp.html' title='Log : Build tcpmp'/><author><name>Checko</name><uri>http://www.blogger.com/profile/03239306354367907990</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/blogger/669/302/320/IMGP0803.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2117270136732158310.post-3560431776533914712</id><published>2010-04-27T11:21:00.002+08:00</published><updated>2010-04-27T13:21:39.195+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WindowsCE'/><category scheme='http://www.blogger.com/atom/ns#' term='MSDN'/><title type='text'>列出所有執行中的 process name - in CE</title><content type='html'>如果是在 Windows XP/NT/2000  etc 會用 enumprocessmodule 這類的 RAPI。&lt;br /&gt;但是在 CE 裡面這些 function 好像不 support。&lt;br /&gt;&lt;br /&gt;CodeGuru &lt;a href="http://codeguru.earthweb.net/forum/printthread.php?t=267165"&gt;這一篇&lt;/a&gt;文章有 example，藥用 CreateToolhelp32Snapshot( )。&lt;br /&gt;OS 要有 Core OS Services 的 Debugging Tools 的 Toolhelp API&lt;br /&gt;&lt;br /&gt;MSDN &lt;a href="http://msdn.microsoft.com/en-us/library/ee487995.aspx"&gt;這一篇&lt;/a&gt;有說明 (要 toolhelp.lib)&lt;br /&gt;&lt;br /&gt;sample code 是：&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;#include &amp;quot;stdafx.h&amp;quot;&lt;br /&gt;#include &amp;lt;windows.h&amp;gt;&lt;br /&gt;#include &amp;lt;commctrl.h&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#include &amp;lt;windows.h&amp;gt;&lt;br /&gt;#include &amp;lt;tlhelp32.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;&lt;br /&gt;int _tmain(int argc, _TCHAR* argv[])&lt;br /&gt;{&lt;br /&gt;    PROCESSENTRY32 pe32 = { 0 };&lt;br /&gt;&lt;br /&gt;    HANDLE hProcSnap =    CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);&lt;br /&gt;    if(hProcSnap == INVALID_HANDLE_VALUE)&lt;br /&gt;        return 0;&lt;br /&gt;&lt;br /&gt;   &lt;br /&gt;    pe32.dwSize = sizeof(PROCESSENTRY32);&lt;br /&gt;    if(Process32First(hProcSnap,&amp;amp;pe32))&lt;br /&gt;    {&lt;br /&gt;        do{&lt;br /&gt;            wprintf(L&amp;quot;PID:%9d NAME: %s\r\n&amp;quot;, pe32.th32ProcessID, pe32.szExeFile);&lt;br /&gt;        }while(Process32Next(hProcSnap, &amp;amp;pe32));&lt;br /&gt;    }&lt;br /&gt;   &lt;br /&gt;    CloseHandle(hProcSnap);&lt;br /&gt;&lt;br /&gt;    return 0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;輸出的結果是：&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;PID:  4194306 NAME: NK.EXE&lt;br /&gt;PID: 30736390 NAME: udevice.exe&lt;br /&gt;PID: 41418754 NAME: udevice.exe&lt;br /&gt;PID: 62521346 NAME: udevice.exe&lt;br /&gt;PID: 79429634 NAME: udevice.exe&lt;br /&gt;PID: 92995586 NAME: servicesd.exe&lt;br /&gt;PID: 82313222 NAME: explorer.exe&lt;br /&gt;PID: 97910798 NAME: enumallprocessconsole.exe&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2117270136732158310-3560431776533914712?l=realchecko.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realchecko.blogspot.com/feeds/3560431776533914712/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2117270136732158310&amp;postID=3560431776533914712' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/3560431776533914712'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/3560431776533914712'/><link rel='alternate' type='text/html' href='http://realchecko.blogspot.com/2010/04/process-name-in-ce.html' title='列出所有執行中的 process name - in CE'/><author><name>Checko</name><uri>http://www.blogger.com/profile/03239306354367907990</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/blogger/669/302/320/IMGP0803.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2117270136732158310.post-8743029416794709639</id><published>2010-04-23T18:19:00.002+08:00</published><updated>2010-04-23T18:23:58.528+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='FUN'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><title type='text'>Windows 喔，應該是防毒軟體的錯..</title><content type='html'>不過這應該不算是Windows 的錯：&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.zdnet.com.tw/news/software/0,2000085678,20145198,00.htm?feed=RSS:+ZDNet+Taiwan%3A+%B7s%BBD+-+%B7%ED%A4%E9%B3%CC%B7s"&gt;McAfee錯誤更新 澳洲連鎖超商停業&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;其實收銀機這樣的東西應該不須要用Windows。&lt;br /&gt;還裝防毒軟體的意義不知道是什麼？&lt;br /&gt;&lt;br /&gt;收銀機可以 上 msn ? 可以讓 店員 run 自己的軟體？&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;倒是有一堆ATM都是用 windows ，要是有問題就糟了&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2117270136732158310-8743029416794709639?l=realchecko.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realchecko.blogspot.com/feeds/8743029416794709639/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2117270136732158310&amp;postID=8743029416794709639' title='2 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/8743029416794709639'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/8743029416794709639'/><link rel='alternate' type='text/html' href='http://realchecko.blogspot.com/2010/04/windows.html' title='Windows 喔，應該是防毒軟體的錯..'/><author><name>Checko</name><uri>http://www.blogger.com/profile/03239306354367907990</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/blogger/669/302/320/IMGP0803.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2117270136732158310.post-4591734064717028305</id><published>2010-04-23T10:57:00.002+08:00</published><updated>2010-04-23T11:01:34.131+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WindowsCE'/><category scheme='http://www.blogger.com/atom/ns#' term='Microsoft'/><title type='text'>read data from debug port</title><content type='html'>有關由 debugport 輸入讀方法， CE blog 又有一篇文章: &lt;a href="http://ce4all.blogspot.com/2010/04/oemreaddebugbyte-in-ce60.html"&gt;OEMReadDebugByte in CE6.0&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;好像是說，以往 5.0 用的 OEMReadDebugByte 不能用了，要改用 nputDebugCharW.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2117270136732158310-4591734064717028305?l=realchecko.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realchecko.blogspot.com/feeds/4591734064717028305/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2117270136732158310&amp;postID=4591734064717028305' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/4591734064717028305'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/4591734064717028305'/><link rel='alternate' type='text/html' href='http://realchecko.blogspot.com/2010/04/read-data-from-debug-port.html' title='read data from debug port'/><author><name>Checko</name><uri>http://www.blogger.com/profile/03239306354367907990</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/blogger/669/302/320/IMGP0803.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2117270136732158310.post-8477289708111730773</id><published>2010-04-21T09:36:00.003+08:00</published><updated>2010-04-21T09:45:26.040+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='FUN'/><category scheme='http://www.blogger.com/atom/ns#' term='Notes'/><category scheme='http://www.blogger.com/atom/ns#' term='MEMO'/><title type='text'>希臘字母發音</title><content type='html'>bookmark一下：&lt;a href="http://zh.wikipedia.org/zh-tw/%E5%B8%8C%E8%87%98%E5%AD%97%E6%AF%8D"&gt;希臘字母發音&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul  style="font-family:georgia;"&gt;&lt;li&gt;&lt;span style=";font-family:courier new;font-size:130%;"  &gt;α alpha&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:130%;"&gt;β   beta&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:130%;"&gt;γ   gamma&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:130%;"&gt;δ   delta&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:130%;"&gt;ε   epsilon&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:130%;"&gt;ζ   zeta&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:130%;"&gt;η  eta&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:130%;"&gt;θ  theta&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:130%;"&gt;ι   lota&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:130%;"&gt;κ  kappa&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:130%;"&gt;λ  lambda&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:130%;"&gt;μ  mu&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:130%;"&gt;ν  nu&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:130%;"&gt;ξ  xi&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:130%;"&gt;ο  omicron&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:130%;"&gt;π  pi&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:130%;"&gt;ρ  rho&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:130%;"&gt;σ  sigma&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:130%;"&gt;τ  tao&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:130%;"&gt;υ  upsilon&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:130%;"&gt;φ  phi&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:130%;"&gt;χ  chi&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:130%;"&gt;ψ  psi&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:130%;"&gt;ω omega&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2117270136732158310-8477289708111730773?l=realchecko.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realchecko.blogspot.com/feeds/8477289708111730773/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2117270136732158310&amp;postID=8477289708111730773' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/8477289708111730773'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/8477289708111730773'/><link rel='alternate' type='text/html' href='http://realchecko.blogspot.com/2010/04/blog-post.html' title='希臘字母發音'/><author><name>Checko</name><uri>http://www.blogger.com/profile/03239306354367907990</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/blogger/669/302/320/IMGP0803.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2117270136732158310.post-1777441917236543196</id><published>2010-04-13T14:04:00.002+08:00</published><updated>2010-04-13T14:48:55.158+08:00</updated><title type='text'></title><content type='html'>Pre-Sysgen Build - build public, private folder 中 需要的 (list in _DEPTREE varialbe) project。&lt;br /&gt;&lt;blockquote&gt;這個通作通常不需要作，因為這兩個(public, private) folder 的 code 通常是 build 好的，如果你需要改他，最好是clone出來到自己的 bsp 中&lt;/blockquote&gt;&lt;br /&gt;Sysgen -作一堆事，check 把dependent component拉進來，filter some files，generate header, source and files。&lt;br /&gt;這階段的結果會放在 %_PROJECTROOT%\cesysgen\:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;filter 完的 library放在 oak\lib, sdk\lib, ddk\lib&lt;/li&gt;&lt;li&gt;filter 完的 header放在 oak\inc, sdk\inc,ddk\inc&lt;/li&gt;&lt;li&gt;這階段 build好的module(dll) 放在 oak\target&lt;/li&gt;&lt;/ul&gt;手動起動 sysgen 的方式是： blddemo -q&lt;br /&gt;&lt;blockquote&gt; cesysgen 會花很多時間，如果你只要作某幾個 folder，可以在 %_PROJECTROOT% 目錄下 create 一個  %_TGTPROJ%.bat ，定義需要sysgen 的 subfolder 就可以：&lt;pre&gt;_DEPTREE=winceos&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2117270136732158310-1777441917236543196?l=realchecko.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realchecko.blogspot.com/feeds/1777441917236543196/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2117270136732158310&amp;postID=1777441917236543196' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/1777441917236543196'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/1777441917236543196'/><link rel='alternate' type='text/html' href='http://realchecko.blogspot.com/2010/04/pre-sysgen-build-build-public-private.html' title=''/><author><name>Checko</name><uri>http://www.blogger.com/profile/03239306354367907990</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/blogger/669/302/320/IMGP0803.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2117270136732158310.post-4619949698255616291</id><published>2010-04-13T10:44:00.002+08:00</published><updated>2010-04-13T10:48:02.935+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WindowsCE'/><title type='text'>重新enable "File/Symbol not found" Dialog</title><content type='html'>使用 KITL  來run application 時，如果沒有 pdb 或 pdb 內的path 找不到 source，VS2005 會自動跳出 dialog 要你指定。&lt;br /&gt;但是dialog 下方有一個：disable dialog&lt;br /&gt;按下去後，就在也不會跳出這個 dialog 了，也就是說，再也不會問你 source , pdb 在哪？&lt;br /&gt;&lt;br /&gt;如果要再 enable 這個 "自動跳出" 的功能，&lt;a href="http://groups.google.com.tw/group/microsoft.public.windowsce.platbuilder/browse_thread/thread/3dff90fab122dabd#"&gt;這一篇 new group 文章&lt;/a&gt;有說明..&lt;br /&gt;&lt;br /&gt;you can find some debugger options in VS2005.&lt;br /&gt;go to tools -&gt;  options -&gt; platform builder for CE -&gt; System debugger -&gt;&lt;br /&gt; verbosity&lt;br /&gt;just check the two messages is enabled&lt;br /&gt;* Source file  not found&lt;br /&gt;* Symbols file not found&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2117270136732158310-4619949698255616291?l=realchecko.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realchecko.blogspot.com/feeds/4619949698255616291/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2117270136732158310&amp;postID=4619949698255616291' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/4619949698255616291'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/4619949698255616291'/><link rel='alternate' type='text/html' href='http://realchecko.blogspot.com/2010/04/enable-filesymbol-not-found-dialog.html' title='重新enable &quot;File/Symbol not found&quot; Dialog'/><author><name>Checko</name><uri>http://www.blogger.com/profile/03239306354367907990</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/blogger/669/302/320/IMGP0803.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2117270136732158310.post-3864701272867668599</id><published>2010-04-13T10:15:00.002+08:00</published><updated>2010-04-13T11:01:04.367+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WindowsCE'/><category scheme='http://www.blogger.com/atom/ns#' term='MSDN'/><category scheme='http://www.blogger.com/atom/ns#' term='Microsoft'/><title type='text'>一團混亂的 Windows CE update and Rn</title><content type='html'>Windows CE 的 update 真是一團混亂，又有 update, 又有 R1,R2,R3&lt;br /&gt;&lt;br /&gt;所謂 R? 不就是update 的總和嗎？&lt;br /&gt;那不就有 年度 rollup ，為什麼還要有 R2, R3 ?&lt;br /&gt;&lt;br /&gt;如果是分開的，那麼 裝 R3 update 還需要裝 其他 update 嗎？&lt;br /&gt;如果要，安裝的順序是？&lt;br /&gt;&lt;br /&gt;真是一團混亂呀！&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2117270136732158310-3864701272867668599?l=realchecko.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realchecko.blogspot.com/feeds/3864701272867668599/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2117270136732158310&amp;postID=3864701272867668599' title='2 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/3864701272867668599'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/3864701272867668599'/><link rel='alternate' type='text/html' href='http://realchecko.blogspot.com/2010/04/windows-ce-update-and-rn.html' title='一團混亂的 Windows CE update and Rn'/><author><name>Checko</name><uri>http://www.blogger.com/profile/03239306354367907990</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/blogger/669/302/320/IMGP0803.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2117270136732158310.post-2709961164713240477</id><published>2010-04-09T16:54:00.005+08:00</published><updated>2010-04-09T19:39:10.776+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WindowsCE'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><category scheme='http://www.blogger.com/atom/ns#' term='Microsoft'/><title type='text'>CopyFile 還作....</title><content type='html'>CopyFile 跟我們自己寫的 CreateFile -Read - Write 方式有什麼不同？&lt;br /&gt;&lt;ul&gt;&lt;li&gt;CopyFile 做完 copy 動作後，還會將 destination file 的 attribute 設得跟 sourcefile 一樣。&lt;/li&gt;&lt;li&gt;CopyFile 做完 copy 動作後，還會將 destination file 的 accesstime 設得跟 sourcefile 一樣。&lt;/li&gt;&lt;li&gt;以上兩個動作會觸發 handle change notification.&lt;/li&gt;&lt;/ul&gt;Copy 時的動作也不一樣，會先把 Destination file用  SetFilePointer( ), SetEndOfFile( ) 撐開。&lt;br /&gt;再 copy data 進去。&lt;br /&gt;&lt;blockquote&gt;這可能是怕 copy 到一半，空間不夠，所以先撐開。如果空間不夠的話，就會 Fail，就不用浪費時間 copy 了&lt;/blockquote&gt;還有每copy 一單位就會 call 一次callback function (因為實際上是 call CopyFileEx)，但是因為callback function 是 NULL，所以沒動作。&lt;br /&gt;&lt;br /&gt;copyfile 的 source code 在&lt;br /&gt;&lt;pre&gt;c:\wince600\private\winceos\coreos\core\dll\apis.c&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2117270136732158310-2709961164713240477?l=realchecko.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realchecko.blogspot.com/feeds/2709961164713240477/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2117270136732158310&amp;postID=2709961164713240477' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/2709961164713240477'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/2709961164713240477'/><link rel='alternate' type='text/html' href='http://realchecko.blogspot.com/2010/04/copyfile.html' title='CopyFile 還作....'/><author><name>Checko</name><uri>http://www.blogger.com/profile/03239306354367907990</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/blogger/669/302/320/IMGP0803.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2117270136732158310.post-1051874515662237920</id><published>2010-04-08T18:45:00.002+08:00</published><updated>2010-04-08T18:51:51.922+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WindowsCE'/><title type='text'></title><content type='html'>OEMKitlStartup( ) 這個 function, OEM 要 implement 好，讓 Windows CE 來 call。&lt;br /&gt;但是 Windows CE call 不 call ，由 IMGNOKITL 這個 flag 決定。&lt;br /&gt;&lt;br /&gt;KITL enable 了，也連通了。OS boot 後也不一定能 break, 用 target control 控制。&lt;br /&gt;要 enable kernel debugger&lt;br /&gt;&lt;br /&gt;&lt;a href="http://blogs.msdn.com/ce_base/archive/2005/11/30/tips-for-using-breakpoints.aspx"&gt;這一篇&lt;/a&gt; 說，可以下 loaddbg 來load 也可以&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2117270136732158310-1051874515662237920?l=realchecko.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realchecko.blogspot.com/feeds/1051874515662237920/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2117270136732158310&amp;postID=1051874515662237920' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/1051874515662237920'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/1051874515662237920'/><link rel='alternate' type='text/html' href='http://realchecko.blogspot.com/2010/04/oemkitlstartup-function-oem-implement.html' title=''/><author><name>Checko</name><uri>http://www.blogger.com/profile/03239306354367907990</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/blogger/669/302/320/IMGP0803.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2117270136732158310.post-8896068336172200975</id><published>2010-04-08T18:29:00.002+08:00</published><updated>2010-04-08T18:45:43.185+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WindowsCE'/><category scheme='http://www.blogger.com/atom/ns#' term='Software'/><category scheme='http://www.blogger.com/atom/ns#' term='MSDN'/><title type='text'>ERROR_SHARING_VIOLATION - 有點白說</title><content type='html'>關於 ERROR_SHARING_VIOLATIOn 這個 error.&lt;br /&gt;&lt;a href="http://support.microsoft.com/kb/316609/en-us?fr=1"&gt;MS 的解釋&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;就是說，Windows 是一個 multi-tasking 的 OS，所以有人跟你同時在 access 一個 file，而且又同時 write....(有點看圖說故事的感覺)&lt;br /&gt;&lt;br /&gt;所以有這個error 是很正常的事。&lt;br /&gt;&lt;br /&gt;MS提供一個 sample code:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;#define MAXRETRIES  5&lt;br /&gt;#define RETRYDELAY  250&lt;br /&gt;&lt;br /&gt;HANDLE  hFile     = INVALID_HANDLE_VALUE&lt;br /&gt;DWORD   dwRetries = 0;&lt;br /&gt;BOOL    bSuccess  = FALSE;&lt;br /&gt;DWORD   dwErr     = 0;&lt;br /&gt;&lt;br /&gt;do&lt;br /&gt;{&lt;br /&gt;    hFile = CreateFile( szFile,&lt;br /&gt;                        GENERIC_READ,&lt;br /&gt;                        FILE_SHARE_READ | FILE_SHARE_WRITE,&lt;br /&gt;                        NULL,&lt;br /&gt;                        OPEN_EXISTING,&lt;br /&gt;                        FILE_ATTRIBUTE_NORMAL,&lt;br /&gt;                        NULL);&lt;br /&gt;    if ( INVALID_HANDLE_VALUE == hFile )&lt;br /&gt;    {&lt;br /&gt;        dwErr = GetLastError();&lt;br /&gt;&lt;br /&gt;        if ( ERROR_SHARING_VIOLATION == dwErr )&lt;br /&gt;        {&lt;br /&gt;            dwRetries += 1;&lt;br /&gt;            Sleep(RETRYDELAY);&lt;br /&gt;            continue;&lt;br /&gt;        }&lt;br /&gt;        else&lt;br /&gt;        {&lt;br /&gt;            // An error occurred.&lt;br /&gt;            break;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    bSuccess = TRUE;&lt;br /&gt;    break;&lt;br /&gt;} while ( dwRetries &amp;lt; MAXRETRIES );&lt;br /&gt;&lt;br /&gt;if  ( bSuccess )&lt;br /&gt;{&lt;br /&gt;    // You succeeded in opening the file.&lt;br /&gt;}&lt;br /&gt;else&lt;br /&gt;{&lt;br /&gt;    // Failure occurs. Do graceful error handling.&lt;br /&gt;&lt;br /&gt;    // Here, you must notify the user of the failure.&lt;br /&gt;&lt;br /&gt;MessageBox( NULL,&lt;br /&gt;            &amp;quot;Tried to update data file but it was already in use&amp;quot;,&lt;br /&gt;            &amp;quot;Update error...&amp;quot;,&lt;br /&gt;            MB_OK | MB_ICONSTOP );&lt;br /&gt;&lt;br /&gt;    // You also want to put the software back in the state it was in&lt;br /&gt;    // on entrance of the current function, as if the user had never&lt;br /&gt;    // tried to do the update.&lt;br /&gt;&lt;br /&gt;    // This may also require deallocating any resources that were&lt;br /&gt;    // allocated because of this operation.&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;就是有這個 error 的時候，就 sleep 一下，等那個好心的程式write 結束，再 試一次。&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;&lt;br /&gt;Windows XP 還有話說，因為一堆不知名的程式在background 跑 (virus scan, source control.. speed hd.. etc)&lt;br /&gt;&lt;br /&gt;但是 Windows CE 還有這樣的error 真是.. &lt;span style="color:white;"&gt;見鬼了&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2117270136732158310-8896068336172200975?l=realchecko.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realchecko.blogspot.com/feeds/8896068336172200975/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2117270136732158310&amp;postID=8896068336172200975' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/8896068336172200975'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/8896068336172200975'/><link rel='alternate' type='text/html' href='http://realchecko.blogspot.com/2010/04/errorsharingviolation.html' title='ERROR_SHARING_VIOLATION - 有點白說'/><author><name>Checko</name><uri>http://www.blogger.com/profile/03239306354367907990</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/blogger/669/302/320/IMGP0803.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2117270136732158310.post-3602415168251974842</id><published>2010-04-07T19:17:00.006+08:00</published><updated>2010-04-07T19:53:27.130+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WindowsCE'/><category scheme='http://www.blogger.com/atom/ns#' term='Notes'/><category scheme='http://www.blogger.com/atom/ns#' term='Others'/><category scheme='http://www.blogger.com/atom/ns#' term='Software'/><title type='text'>some info for java KVM</title><content type='html'>java KVM 好像變成 J2ME CLDC ，然後又 &lt;a href="https://phoneme.dev.java.net/source/browse/phoneme/"&gt;opensource&lt;/a&gt; 變成 phoneME。&lt;br /&gt;&lt;br /&gt;所以要 build KVM ，好像要到 sun (現在變成 oracle 了) 的 &lt;a href="https://phoneme.dev.java.net/"&gt;phoneME Project&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;有一個人 (&lt;a href="http://www.cs.kuleuven.be/%7Edavy/phoneme/"&gt;http://www.cs.kuleuven.be/~davy/phoneme/&lt;/a&gt;) 真的太好心了。&lt;br /&gt;&lt;br /&gt;不僅把 phoneME for CE 的 build process 寫好patch。&lt;br /&gt;也release 他 build 好的 for KVM for CE : &lt;a href="http://www.cs.kuleuven.be/%7Edavy/phoneme/?q=node/10"&gt;http://www.cs.kuleuven.be/~davy/phoneme/?q=node/10&lt;/a&gt;&lt;br /&gt;  但是 for CE 的 OS 需要 AYGSHELL.DLL&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;phoneME for winCE 比較麻煩的好像是 &lt;a href="http://java.sun.com/javame/reference/docs/sjwc-2.0-web/docs/PortingGuide-html/javacall.html"&gt;JavaCall &lt;/a&gt;部份。&lt;br /&gt;JavaCall 是有關手機部份的功能。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.cs.kuleuven.be/%7Edavy/phoneme/"&gt;好心人的網頁&lt;/a&gt;有介紹 phoneME 的兩個 edition:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;phoneME Feature -- 就是 CLDC&lt;br /&gt;&lt;/li&gt;&lt;li&gt;phoneME Advanced -- 就是 CDC&lt;/li&gt;&lt;/ul&gt;偉大的0xlab 竟然已經把 &lt;a href="http://groups.google.com.tw/group/0xlab-devel/browse_thread/thread/d6d2e61a6169376c"&gt;phoneme port 到 Android&lt;/a&gt; 上...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2117270136732158310-3602415168251974842?l=realchecko.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realchecko.blogspot.com/feeds/3602415168251974842/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2117270136732158310&amp;postID=3602415168251974842' title='2 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/3602415168251974842'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/3602415168251974842'/><link rel='alternate' type='text/html' href='http://realchecko.blogspot.com/2010/04/some-info-for-java-kvm.html' title='some info for java KVM'/><author><name>Checko</name><uri>http://www.blogger.com/profile/03239306354367907990</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/blogger/669/302/320/IMGP0803.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2117270136732158310.post-8033617521201404162</id><published>2010-04-02T18:10:00.005+08:00</published><updated>2010-06-18T14:18:26.959+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WindowsCE'/><category scheme='http://www.blogger.com/atom/ns#' term='MSDN'/><title type='text'>more on celog - ref</title><content type='html'>&lt;pre&gt;&lt;br /&gt;CELZONE_ALWAYSON  0x40000000&lt;br /&gt;CELZONE_BOOT_TIME 0x00010000&lt;br /&gt;CELZONE_CRITSECT  0x00000100&lt;br /&gt;CELZONE_DEBUG     0x00800000&lt;br /&gt;CELZONE_HEAP      0x00000800&lt;br /&gt;CELZONE_INTERRUPT 0x00000001&lt;br /&gt;CELZONE_LOADER    0x00004000&lt;br /&gt;CELZONE_SYNCH     0x00000200&lt;br /&gt;===============================&lt;br /&gt;                0x40814901&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;CE 6.0 Preparation KIT 說：&lt;br /&gt;&lt;pre&gt;NOTE Improving reference naming matching&lt;br /&gt;The CeLog event-tracking system can take advantage of the kernel profiler to look up thread&lt;br /&gt;function names based on start addresses when capturing CreateThread events, if you explicitly&lt;br /&gt;enable the kernel profiler and add profiling symbols to the run-time image by rebuilding the&lt;br /&gt;image with the IMGPROFILER environment variable set. However, CeLog can only look up the&lt;br /&gt;profiling symbols built into the run-time image. Symbols of applications developed based on a&lt;br /&gt;Software Development Kit (SDK) are generally unavailable to the CeLog event-tracking system.&lt;/pre&gt;&lt;br /&gt;也就是說勾選 PROFILING 就可用 fixthreads 列出 thread function name.&lt;br /&gt;&lt;br /&gt;這一篇 &lt;a href="http://blogs.msdn.com/ce_base/archive/2006/06/14/Thread-names-and-CeLog.aspx"&gt;http://blogs.msdn.com/ce_base/archive/2006/06/14/Thread-names-and-CeLog.aspx&lt;/a&gt;&lt;br /&gt;也說使用 PROFILE 可以列出 thread name，&lt;br /&gt;但是又說有 MAP 的話，可以用 -fixthread 或 -v 加入 thread name information&lt;br /&gt;&lt;br /&gt;kernel tracker 的應用： 這一篇 &lt;a href="http://blogs.msdn.com/sloh/archive/2005/05/27/422605.aspx"&gt;Lock Convoys and How to Recognize Them&lt;/a&gt; 說明用 celog file 和 kernel tracker 找出 Lock Convoys 的狀況&lt;br /&gt;&lt;br /&gt;用 readlog 作轉換。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2117270136732158310-8033617521201404162?l=realchecko.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realchecko.blogspot.com/feeds/8033617521201404162/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2117270136732158310&amp;postID=8033617521201404162' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/8033617521201404162'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/8033617521201404162'/><link rel='alternate' type='text/html' href='http://realchecko.blogspot.com/2010/04/celzonealwayson-0x40000000.html' title='more on celog - ref'/><author><name>Checko</name><uri>http://www.blogger.com/profile/03239306354367907990</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/blogger/669/302/320/IMGP0803.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2117270136732158310.post-8575448663484902209</id><published>2010-04-02T18:05:00.001+08:00</published><updated>2010-04-02T18:07:25.850+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WindowsCE'/><category scheme='http://www.blogger.com/atom/ns#' term='MSDN'/><title type='text'>celog : another way - by hand</title><content type='html'>在 news groupe 還有一篇說明： &lt;a href="http://www.relatedterms.com/thread/1874715/If%20celog.clg%20is%20opened%20in%20kernel%20tracker%20%20the%20error%20-%20Corrupt%20datain%20log%20file%20-%20occurs."&gt;http://www.relatedterms.com/thread/1874715/If%20celog.clg%20is%20opened%20in%20kernel%20tracker%20%20the%20error%20-%20Corrupt%20datain%20log%20file%20-%20occurs.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Werner 回答說：&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;First, when you use IMGCELOGENABLE CeLog.dll is loaded very early in the&lt;br /&gt;boot process, too early to read any registry info (as registry is not ready&lt;br /&gt;yet at that time).&lt;br /&gt;Second I see that you have set FlushTimeout=03e8. If you tell CeLogFlush to&lt;br /&gt;use a timeout of 03e8 (1sec) it might be too fast.&lt;br /&gt;&lt;br /&gt;What I do: Do not tick IMGCELOGENABLE, IMGOSCAPTURE, IMGAUTOFLUSH but add&lt;br /&gt;celog.dll, oscapture.exe and celogflush.exe manually in your project.bib&lt;br /&gt;(copy what you need to to from common.bib and common.reg). Make sure you add&lt;br /&gt;the items in FILES section, not MODULES. Now CeLog.dll will only be loaded&lt;br /&gt;when you run CelogFlsuh.exe or OSCapture.exe.As this is much later in the&lt;br /&gt;boot process (I expect that the UI is up and running by then), CeLog.dll can&lt;br /&gt;access the regsitry and load your registry settings. This way you can&lt;br /&gt;increase the buffer size and leave the Flush Timeout to 10sec.&lt;br /&gt;&lt;br /&gt;Are you using Celog in a DEBUG or RETAIL build? I have problems using CeLog&lt;br /&gt;in DEBUG (together with VS + PlatformBuilder 6.0). After Celog.dll loads, it&lt;br /&gt;crashes my image. In a RELEASE build everything works as expected.&lt;br /&gt;&lt;br /&gt;Werner&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2117270136732158310-8575448663484902209?l=realchecko.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realchecko.blogspot.com/feeds/8575448663484902209/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2117270136732158310&amp;postID=8575448663484902209' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/8575448663484902209'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/8575448663484902209'/><link rel='alternate' type='text/html' href='http://realchecko.blogspot.com/2010/04/celog-another-way-by-hand.html' title='celog : another way - by hand'/><author><name>Checko</name><uri>http://www.blogger.com/profile/03239306354367907990</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/blogger/669/302/320/IMGP0803.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2117270136732158310.post-4501643000487857640</id><published>2010-03-31T13:43:00.003+08:00</published><updated>2010-03-31T13:51:51.278+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WindowsCE'/><category scheme='http://www.blogger.com/atom/ns#' term='Microsoft'/><title type='text'>build celogflush.exe in VS2005</title><content type='html'>celogflush.exe 的 source code 在&lt;pre&gt;C:\WINCE600\PUBLIC\COMMON\SDK\SAMPLES\CELOG\FLUSH\CELOGFLUSH&lt;/pre&gt;實際上也有用到上層的&lt;br /&gt;&lt;pre&gt;transport.c, transport.h&lt;/pre&gt;所以&lt;br /&gt;&lt;ul&gt;&lt;li&gt;VS2005 新開一個 smart device console mode project&lt;/li&gt;&lt;li&gt;copy celogflush 下的 .cpp, .h 和 上層(flush)的 transport.c, transport.h 到 project folder&lt;/li&gt;&lt;li&gt;用 celogflush.cpp 取代原 project 的 source，並且加入 transport.c&lt;/li&gt;&lt;li&gt;加入 stdafx.h 後還是發生問題，所以到 build option 中把precompile header 關掉不用&lt;/li&gt;&lt;li&gt;修改 原 celogflush.cpp 加入：&lt;pre&gt;#include "pkfuncs.h"&lt;br /&gt;extern "C"&lt;br /&gt;{&lt;br /&gt;#include "transport.h"&lt;br /&gt;}&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;把WINCE600 COMMON OAK 裡的 toolhelp.h, vmlayout.h, pkfunc.h copy 到目錄下。&lt;/li&gt;&lt;li&gt;build project，發現include 不到時，把 include %lt; %gt; 改為 include " "&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2117270136732158310-4501643000487857640?l=realchecko.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realchecko.blogspot.com/feeds/4501643000487857640/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2117270136732158310&amp;postID=4501643000487857640' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/4501643000487857640'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/4501643000487857640'/><link rel='alternate' type='text/html' href='http://realchecko.blogspot.com/2010/03/build-celogflushexe-in-vs2005.html' title='build celogflush.exe in VS2005'/><author><name>Checko</name><uri>http://www.blogger.com/profile/03239306354367907990</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/blogger/669/302/320/IMGP0803.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2117270136732158310.post-6559611845545257647</id><published>2010-03-29T13:04:00.009+08:00</published><updated>2010-04-13T10:52:58.494+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WindowsCE'/><category scheme='http://www.blogger.com/atom/ns#' term='Microsoft'/><title type='text'>celogflush.exe</title><content type='html'>有關 celog，好像有source code，在&lt;br /&gt;&lt;pre&gt;C:\WINCE600\PUBLIC\COMMON\SDK\SAMPLES\CELOG\&lt;/pre&gt;&lt;br /&gt;有 celogflush.exe 的 source code。&lt;br /&gt;&lt;br /&gt;但是沒有 celogflush_lib.lib 的 source。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;要build celogflush.exe 可以到 celogflush 目錄下：&lt;br /&gt;&lt;pre&gt; sysgen -p common celogflush&lt;/pre&gt;relese directory 就會有新的 celogflush.exe&lt;br /&gt;&lt;br /&gt;從 source code 可以看出來，celog 是可以停止的，停止的方法是 set event，event name 是：&lt;br /&gt;&lt;pre&gt;"SYSTEM/CeLogFlush Quit"&lt;/pre&gt;宣告在同目錄的 transport.h&lt;br /&gt;&lt;br /&gt;停止的 ap 也寫好了，一樣在 common sdk tool celog 目錄： celogstopflush.exe&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;&lt;br /&gt;結果在 啟動 celogflush.exe 時有 error message:&lt;br /&gt;&lt;pre&gt;CeLogFlush: Failed to load CeLog DLL&lt;/pre&gt;但是 手動把 celog.dll 和 celogflush.exe copy 到 windows 目錄後，就可以手動啟動了。&lt;br /&gt;這好像是因為 multi-xip 的原因，celog.dll, celogflush.exe 要在boot kernel 的 bin part (跟nk.exe 一起)。&lt;br /&gt;所以要手動修改 %_FLATRELEASEDIR%\common.bib:&lt;br /&gt;&lt;pre&gt;IF IMGCELOGENABLE&lt;br /&gt;celog.dll       $(_FLATRELEASEDIR)\celog.dll                TINYNK  SHK&lt;br /&gt;IF IMGAUTOFLUSH&lt;br /&gt;celogflush.exe  $(_FLATRELEASEDIR)\celogflush.exe           TINYNK  SH&lt;br /&gt;ENDIF IMGAUTOFLUSH&lt;br /&gt;&lt;/pre&gt;其中 TINYNK 就是multixip 的 part I - booting 的部份。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;不然就要修改 makexip.js，把 celog.dll 和 celogflush.exe 加到filelist&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;在&lt;a href="http://groups.google.com.tw/group/microsoft.public.windowsce.platbuilder/browse_thread/thread/82b39448efb7e024"&gt;這一篇 news groupe 文章&lt;/a&gt;有說，可以改..&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;KMOS&lt;br /&gt;&lt;br /&gt;You could fix that by alter the launch sequence (LaunchXX) of CeLogFlush  in&lt;br /&gt;[HKEY_LOCAL_MACHINE\init]&lt;br /&gt;Or alter the CeLogFlush (source  can be found in&lt;br /&gt; PUBLIC\COMMON\SDK\SAMPLES\CELOG\FLUSH\CELOGFLUSH\flush.c) to delay the  file&lt;br /&gt;openning&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2117270136732158310-6559611845545257647?l=realchecko.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realchecko.blogspot.com/feeds/6559611845545257647/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2117270136732158310&amp;postID=6559611845545257647' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/6559611845545257647'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/6559611845545257647'/><link rel='alternate' type='text/html' href='http://realchecko.blogspot.com/2010/03/celogflushexe.html' title='celogflush.exe'/><author><name>Checko</name><uri>http://www.blogger.com/profile/03239306354367907990</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/blogger/669/302/320/IMGP0803.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2117270136732158310.post-3159413784667814828</id><published>2010-03-25T18:39:00.008+08:00</published><updated>2010-07-05T18:30:02.030+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WindowsCE'/><category scheme='http://www.blogger.com/atom/ns#' term='MSDN'/><title type='text'>Celog : log on local files</title><content type='html'>Enable Celog 並且log 到 localfile&lt;br /&gt;&lt;br /&gt;在 project option enable celog 和 celogflush 後，&lt;br /&gt;設定部份要參考&lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-US/library/ee481192%28v=WinEmbedded.60%29.aspx"&gt;http://msdn.microsoft.com/en-US/library/ee481192%28v=WinEmbedded.60%29.aspx&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;很好心的列出 log 在 SDCard 的方法..&lt;br /&gt;&lt;br /&gt;但是我照著作卻不會成功，有一篇在 newsgroupe 的說明好像是說 在 system/init 啟動的 celogflush 太早，常常不能正確的 access registry setting，所以會不正確...&lt;br /&gt;&lt;br /&gt;還有如果log到 localfile，又是 physical storage(不是ram)的話，要注意，當 celogflush 啟動的時候，一堆 storage都還沒mount 起來.......(唉～～)&lt;br /&gt;&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;&lt;br /&gt;另外一個，手動啟動的方法，不用 rebuild OS (所以 boot message log 不到)&lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms905191.aspx"&gt;http://msdn.microsoft.com/en-us/library/ms905191.aspx&lt;/a&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Copy CeLog.dll and CeLogFlush.exe 到 \Windows 目錄&lt;/li&gt;&lt;li&gt;在 SD 上 creatr 一個 "flush.lnk"，內容是&lt;pre&gt;83#\Windows\celogflush.exe -buf 0x100000 -time 60000 -n \celog.clg -z 0x00800000 -ui 1&lt;br /&gt;對應的reg 設定是：&lt;br /&gt;&lt;br /&gt;[HKEY_LOCAL_MACHINE\System\CeLog]&lt;br /&gt; "Transport"="LocalFile"&lt;br /&gt; "FileName"="\\celog.clg"&lt;br /&gt; "ZoneCE"=dword:"00800000"&lt;br /&gt; "BufferSize"=dword:"100000"&lt;br /&gt; "UseUI"=dword:1&lt;/pre&gt;這一個在system boots 時不能設1，因為GWES還沒起來。&lt;br /&gt;&lt;/li&gt;&lt;li&gt;插入SD card，double click flush.lnk&lt;/li&gt;&lt;/ul&gt;會有一個 dialog 顯示log 到 \celog.clg&lt;br /&gt;&lt;br /&gt;看 celog.clg 內容的方法：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;到 \ 去看(因為剛剛指定 \celog.clg)，可以找到 celog.clg，copy 到 SD card&lt;/li&gt;&lt;li&gt;開啟 VS2005 - platformbuilder -- open reslease directory&lt;/li&gt;&lt;li&gt;在 dos prompt 下command&lt;/li&gt;&lt;li&gt;readlog celog.clf output.txt&lt;/li&gt;&lt;/ul&gt;..&lt;br /&gt;&lt;br /&gt;所以為了避免麻煩，把celog.dll, celogflush.exe 放進 kernel image 好了..&lt;br /&gt;&lt;span style="color:red;"&gt;如果是XIP的話，要放在 boot 的 bin part&lt;/span&gt;&lt;br /&gt;也就是要改 makexip.js&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2117270136732158310-3159413784667814828?l=realchecko.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realchecko.blogspot.com/feeds/3159413784667814828/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2117270136732158310&amp;postID=3159413784667814828' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/3159413784667814828'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/3159413784667814828'/><link rel='alternate' type='text/html' href='http://realchecko.blogspot.com/2010/03/celog-log-on-local-files.html' title='Celog : log on local files'/><author><name>Checko</name><uri>http://www.blogger.com/profile/03239306354367907990</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/blogger/669/302/320/IMGP0803.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2117270136732158310.post-8738334732627061583</id><published>2010-03-25T17:14:00.003+08:00</published><updated>2010-03-26T11:13:44.113+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WindowsCE'/><category scheme='http://www.blogger.com/atom/ns#' term='MSDN'/><title type='text'>CeFindFirstRegChange : monitor registry changes for you</title><content type='html'>這一篇文章(&lt;a href="http://ce4all.blogspot.com/2010/03/registry-notifications-to-pass-data.html"&gt;http://ce4all.blogspot.com/2010/03/registry-notifications-to-pass-data.html&lt;/a&gt;) 提到。&lt;br /&gt;原來，可以利用CeFindFirstRegChange( ) 來幫忙 monitor registry 的變更。&lt;br /&gt;然後用 WaitForSingleObject( ) 就可以了。&lt;br /&gt;免去一直 pollig registry 的麻煩。&lt;br /&gt;&lt;br /&gt;在 MSDN 也有說明這個： &lt;a href="http://msdn.microsoft.com/en-us/library/ee488580.aspx"&gt;State and Notification Broker&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;偉大的 Bruce Eitman 有一系列文章講這個： &lt;a href="http://geekswithblogs.net/BruceEitman/archive/2009/08/25/windows-ce-cereggetnotificationinfo-works-sort-of-part-3.aspx"&gt;http://geekswithblogs.net/BruceEitman/archive/2009/08/25/windows-ce-cereggetnotificationinfo-works-sort-of-part-3.aspx&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;... 嗯，沒錯，這篇只是一篇書籤而已 XD&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2117270136732158310-8738334732627061583?l=realchecko.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realchecko.blogspot.com/feeds/8738334732627061583/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2117270136732158310&amp;postID=8738334732627061583' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/8738334732627061583'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/8738334732627061583'/><link rel='alternate' type='text/html' href='http://realchecko.blogspot.com/2010/03/cefindfirstregchange-monitor-registry.html' title='CeFindFirstRegChange : monitor registry changes for you'/><author><name>Checko</name><uri>http://www.blogger.com/profile/03239306354367907990</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/blogger/669/302/320/IMGP0803.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2117270136732158310.post-995839338949443488</id><published>2010-03-25T15:59:00.003+08:00</published><updated>2010-03-25T16:03:41.252+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WindowsCE'/><category scheme='http://www.blogger.com/atom/ns#' term='MSDN'/><category scheme='http://www.blogger.com/atom/ns#' term='Microsoft'/><title type='text'>維持Dialog 在最上面</title><content type='html'>要讓一個dialog 一直維持在最上層，不被其他AP蓋掉。&lt;br /&gt;可以在 timer 的 handler 加上：&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;RECT rect;&lt;br /&gt;GetWindowRect(hWnd,&amp;amp;rect);&lt;br /&gt;SetWindowPos(hWnd,HWND_TOPMOST,&lt;br /&gt;            rect.left,rect.top,&lt;br /&gt;            rect.right-rect.left,rect.bottom-rect.top,&lt;br /&gt;            SWP_SHOWWINDOW);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;定期的把自己 (hWnd) 設為 TOPMOST&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2117270136732158310-995839338949443488?l=realchecko.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realchecko.blogspot.com/feeds/995839338949443488/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2117270136732158310&amp;postID=995839338949443488' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/995839338949443488'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/995839338949443488'/><link rel='alternate' type='text/html' href='http://realchecko.blogspot.com/2010/03/dialog.html' title='維持Dialog 在最上面'/><author><name>Checko</name><uri>http://www.blogger.com/profile/03239306354367907990</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/blogger/669/302/320/IMGP0803.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2117270136732158310.post-6997470780729617796</id><published>2010-03-24T16:00:00.002+08:00</published><updated>2010-03-24T17:43:04.008+08:00</updated><title type='text'></title><content type='html'>用 GetSystemInfo( ) 可以取得系統 的 SYSTEM_INFO 資料。&lt;br /&gt;其中包含：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;PageSize :  在 CE 6.0, ARM 上讀出是 4096 (4k)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;AllocationGranularity : CE 6.0, ARM 上讀出是 65536 (64k)&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2117270136732158310-6997470780729617796?l=realchecko.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realchecko.blogspot.com/feeds/6997470780729617796/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2117270136732158310&amp;postID=6997470780729617796' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/6997470780729617796'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/6997470780729617796'/><link rel='alternate' type='text/html' href='http://realchecko.blogspot.com/2010/03/getsysteminfo-systeminfo-pagesize-ce-6.html' title=''/><author><name>Checko</name><uri>http://www.blogger.com/profile/03239306354367907990</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/blogger/669/302/320/IMGP0803.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2117270136732158310.post-7376936464799955634</id><published>2010-03-24T15:07:00.002+08:00</published><updated>2010-03-24T16:00:50.644+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WindowsCE'/><category scheme='http://www.blogger.com/atom/ns#' term='MSDN'/><category scheme='http://www.blogger.com/atom/ns#' term='Microsoft'/><title type='text'>CE 6.0 的不同</title><content type='html'>這一篇 (http://msdn.microsoft.com/en-us/library/bb331824.aspx) 說的.&lt;br /&gt;&lt;br /&gt;下面這些 IPC, CE 6.0 還是支援：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;RAM-backed memory-mapped files, &lt;/li&gt;&lt;li&gt;point-to-point message queues, &lt;/li&gt;&lt;li&gt;WM_COPYDATA message.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;下面這些利用 CE Memory "Slot" 特性的 API 就沒辦法支援了：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;MapCallerToProcess and &lt;/li&gt;&lt;li&gt;SetProcPermissions APIs &lt;/li&gt;&lt;/ul&gt;其中&lt;br /&gt;SetProcPermissions 可以用e ReadProcessMemory and WriteProcessMemory 來代替&lt;br /&gt;&lt;br /&gt;Process 之間也不能用直接傳遞 Handle 的方式來共用了，傳遞之前要用&lt;br /&gt;DuplicateHandle 來 clone  handle 後再傳給其他 process&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2117270136732158310-7376936464799955634?l=realchecko.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realchecko.blogspot.com/feeds/7376936464799955634/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2117270136732158310&amp;postID=7376936464799955634' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/7376936464799955634'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/7376936464799955634'/><link rel='alternate' type='text/html' href='http://realchecko.blogspot.com/2010/03/ce-60.html' title='CE 6.0 的不同'/><author><name>Checko</name><uri>http://www.blogger.com/profile/03239306354367907990</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/blogger/669/302/320/IMGP0803.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2117270136732158310.post-5267191756725800526</id><published>2010-03-24T13:40:00.002+08:00</published><updated>2010-03-24T13:46:53.387+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WindowsCE'/><category scheme='http://www.blogger.com/atom/ns#' term='MSDN'/><category scheme='http://www.blogger.com/atom/ns#' term='Microsoft'/><title type='text'>一團混亂的 *.reg 設定</title><content type='html'>platform builder 裡有一堆 registry 設定 (*.reg)&lt;br /&gt;registry 設定同一個 path 的 value 可以設定很多次，platform builder 會以最後一個為準&lt;br /&gt;(也就是說，後來設的會 overwrite 前面的)&lt;br /&gt;&lt;br /&gt;所以你要是在某 *.reg 中看到某個 key 設定，也不代表真正 build 出來的 image 的 key 會是這個值。&lt;br /&gt;或許，某個 *.reg，或是同一個 *.reg 的後面設定，又把這個 key 改了..&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0); font-weight: bold;"&gt;...真是個災難呀..&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;但是 MSDN 說(http://msdn.microsoft.com/en-us/library/ee490779.aspx)&lt;br /&gt;&lt;blockquote&gt;Platform.reg 會 overwrite Project.reg 和 Common.reg。&lt;br /&gt;Project.reg 會 overwrite Common.reg&lt;/blockquote&gt;要看最後build 出來的 reg ，可以到 %_FLATRELEASEDIR% 的 reginit.ini 去看&lt;br /&gt;.. 當然，這要在 build 出 image 後才會有&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2117270136732158310-5267191756725800526?l=realchecko.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realchecko.blogspot.com/feeds/5267191756725800526/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2117270136732158310&amp;postID=5267191756725800526' title='2 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/5267191756725800526'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/5267191756725800526'/><link rel='alternate' type='text/html' href='http://realchecko.blogspot.com/2010/03/reg.html' title='一團混亂的 *.reg 設定'/><author><name>Checko</name><uri>http://www.blogger.com/profile/03239306354367907990</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/blogger/669/302/320/IMGP0803.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2117270136732158310.post-6982778598086048832</id><published>2010-03-09T10:33:00.002+08:00</published><updated>2010-03-09T10:35:33.938+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WindowsCE'/><title type='text'>Clean build include public folder</title><content type='html'>在 CE 6.0 的 Build -Advance Build Commands - Rebuild and clean sysgen&lt;br /&gt;連 public folder 都會重 build。&lt;br /&gt;所以執行時會出現 prompt message。&lt;br /&gt;&lt;br /&gt;實際執行的 command 是&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;blddemo clean cleanplat -c&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;附：&lt;br /&gt;只做 bsp 部份的 clean build 是&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;blddemo clean  -c&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2117270136732158310-6982778598086048832?l=realchecko.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realchecko.blogspot.com/feeds/6982778598086048832/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2117270136732158310&amp;postID=6982778598086048832' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/6982778598086048832'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/6982778598086048832'/><link rel='alternate' type='text/html' href='http://realchecko.blogspot.com/2010/03/clean-build-include-public-folder.html' title='Clean build include public folder'/><author><name>Checko</name><uri>http://www.blogger.com/profile/03239306354367907990</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/blogger/669/302/320/IMGP0803.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2117270136732158310.post-3759333214744636418</id><published>2010-02-24T17:04:00.003+08:00</published><updated>2010-02-24T17:28:05.395+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WindowsCE'/><category scheme='http://www.blogger.com/atom/ns#' term='MSDN'/><title type='text'>Change Disk Cluster Size in CE</title><content type='html'>MSDN的這一篇：&lt;a href="http://msdn.microsoft.com/en-us/library/aa912080.aspx"&gt;Register Setting for FAT Format&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span msxsl="urn:schemas-microsoft-com:xslt"&gt;&lt;span id="src11" class="srcSentence"&gt;&lt;b&gt;  FormatClusterSize&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;可以設定 format 時的 ClusterSize。&lt;br /&gt;例如：&lt;br /&gt;&lt;pre&gt;FormatClusterSize"=dword:200&lt;br /&gt;&lt;/pre&gt;就是設定 cluster size = 2k.&lt;br /&gt;&lt;br /&gt;&lt;hr /&gt;改 Cluster Size 有什麼好處？&lt;br /&gt;好像可以加快 disk Read/Write Speed.. ... 好像.&lt;br /&gt;&lt;br /&gt;這個設定只有在 partition formate 時才會參考到。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2117270136732158310-3759333214744636418?l=realchecko.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realchecko.blogspot.com/feeds/3759333214744636418/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2117270136732158310&amp;postID=3759333214744636418' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/3759333214744636418'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/3759333214744636418'/><link rel='alternate' type='text/html' href='http://realchecko.blogspot.com/2010/02/change-disk-cluster-size-in-ce.html' title='Change Disk Cluster Size in CE'/><author><name>Checko</name><uri>http://www.blogger.com/profile/03239306354367907990</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/blogger/669/302/320/IMGP0803.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2117270136732158310.post-463052757999903009</id><published>2010-02-22T14:39:00.003+08:00</published><updated>2010-02-22T14:59:34.639+08:00</updated><title type='text'></title><content type='html'>&lt;a href="http://geekswithblogs.net/BruceEitman/archive/2008/05/09/windows-ce--using-the-debug-serial-port-for-input.aspx"&gt;這一篇&lt;/a&gt;   說 debug serial port 除了可以用來 output debug message 外，也可以用來 input data。&lt;br /&gt;但是 OEM vendor 要提供  &lt;a href="http://msdn.microsoft.com/en-us/library/ms904935.aspx"&gt;OEMReadDebugByte( ) &lt;/a&gt;的實作。&lt;br /&gt;&lt;br /&gt;照他的方法，在 private code 中找 OEMReadDebugByte( ) 最後可以找到在 printf.c 中InputDebugCharW ( ) 為最上層..&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2117270136732158310-463052757999903009?l=realchecko.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realchecko.blogspot.com/feeds/463052757999903009/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2117270136732158310&amp;postID=463052757999903009' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/463052757999903009'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/463052757999903009'/><link rel='alternate' type='text/html' href='http://realchecko.blogspot.com/2010/02/debug-serial-port-output-debug-message.html' title=''/><author><name>Checko</name><uri>http://www.blogger.com/profile/03239306354367907990</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/blogger/669/302/320/IMGP0803.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2117270136732158310.post-596918121814080426</id><published>2010-02-22T14:36:00.002+08:00</published><updated>2010-02-22T14:38:44.020+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WindowsCE'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><category scheme='http://www.blogger.com/atom/ns#' term='MSDN'/><title type='text'>format printf - I64</title><content type='html'>link : MS 特殊的 printf format:&lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms860371.aspx"&gt;http://msdn.microsoft.com/en-us/library/ms860371.aspx&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;由於 printf 是用 valist，所以 format 裡的 size 特別重要。&lt;br /&gt;&lt;br /&gt;MS 比較特殊的有.. I64 - 指定 long long 的 variable&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;0x%016I64X&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;就是印出 long long 的 variable.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2117270136732158310-596918121814080426?l=realchecko.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realchecko.blogspot.com/feeds/596918121814080426/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2117270136732158310&amp;postID=596918121814080426' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/596918121814080426'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/596918121814080426'/><link rel='alternate' type='text/html' href='http://realchecko.blogspot.com/2010/02/format-printf-i64.html' title='format printf - I64'/><author><name>Checko</name><uri>http://www.blogger.com/profile/03239306354367907990</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/blogger/669/302/320/IMGP0803.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2117270136732158310.post-8468956784318311776</id><published>2010-02-08T11:04:00.003+08:00</published><updated>2010-02-08T16:19:49.684+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Software'/><title type='text'>Code Reading - Gabest - mplayer : mpeg4 (?) demux 部份</title><content type='html'>到 &lt;a href="http://sourceforge.net/projects/guliverkli/develop"&gt;http://sourceforge.net/projects/guliverkli/develop&lt;/a&gt; 拿 source code.&lt;br /&gt;在 http_proxy 後的，只要 export https_proxy="http://192.168.147.242:3128" 就可以 (你的 proxy server address, port)&lt;br /&gt;&lt;br /&gt;search 0x47 在：&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;guliverkli\trunk\guliverkli\src\filters\parser\basesplitter\BaseSplitterFileEx.cpp&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;果然出現一堆..&lt;br /&gt;&lt;br /&gt;衍生的class 有：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;class CMP4SplitterFile : public CBaseSplitterFileEx&lt;br /&gt;&lt;/li&gt;&lt;li&gt;class CMpaSplitterFile : public CBaseSplitterFileEx&lt;/li&gt;&lt;li&gt;class CMpegSplitterFile : public CBaseSplitterFileEx&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;從上次的 post，class id 來search..&lt;br /&gt;&lt;br /&gt;MPEG [IN] Input:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;pre&gt;Filter : MPC - Mpeg Splitter (Gabest) - CLSID : {DC257063-045F-4BE2-BD5B-E12279C464F0}&lt;br /&gt;&lt;br /&gt;- Connected to:&lt;br /&gt;&lt;br /&gt;CLSID: {E436EBB5-524F-11CE-9F53-0020AF0BA770}&lt;br /&gt;Filter: G:\log.trp&lt;br /&gt;Pin: Output&lt;br /&gt;&lt;br /&gt;- Connection media type:&lt;br /&gt;&lt;br /&gt;Unknown&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Class ID : DC257063-045F-4BE2-BD5B-E12279C464F0&lt;br /&gt;是  guliverkli\src\filters\parser\mpegsplitter\MpegSplitter.h&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2117270136732158310-8468956784318311776?l=realchecko.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realchecko.blogspot.com/feeds/8468956784318311776/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2117270136732158310&amp;postID=8468956784318311776' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/8468956784318311776'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/8468956784318311776'/><link rel='alternate' type='text/html' href='http://realchecko.blogspot.com/2010/02/code-reading-gabest-mplayer-mpeg4-demux.html' title='Code Reading - Gabest - mplayer : mpeg4 (?) demux 部份'/><author><name>Checko</name><uri>http://www.blogger.com/profile/03239306354367907990</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/blogger/669/302/320/IMGP0803.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2117270136732158310.post-2730699317310885356</id><published>2010-02-05T19:00:00.002+08:00</published><updated>2010-02-05T19:06:58.598+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Others'/><category scheme='http://www.blogger.com/atom/ns#' term='MEMO'/><category scheme='http://www.blogger.com/atom/ns#' term='Software'/><category scheme='http://www.blogger.com/atom/ns#' term='PC'/><title type='text'>音訊檔案處理軟體 Audacity</title><content type='html'>&lt;a href="http://audacity.sourceforge.net/"&gt;Audacity &lt;/a&gt;很不錯喔。&lt;br /&gt;&lt;br /&gt;原來是 音訊檔的 &lt;b&gt;調整&lt;/b&gt;軟體。&lt;br /&gt;可以切割/合併，增大/縮小聲音檔。&lt;br /&gt;&lt;br /&gt;也可以產生特定的tone，波形，頻率可以自己產生。&lt;br /&gt;&lt;br /&gt;支援 wave, mp3, flac.... 等檔案格式。&lt;br /&gt;&lt;br /&gt;而且還是 open source 的喔&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2117270136732158310-2730699317310885356?l=realchecko.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realchecko.blogspot.com/feeds/2730699317310885356/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2117270136732158310&amp;postID=2730699317310885356' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/2730699317310885356'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/2730699317310885356'/><link rel='alternate' type='text/html' href='http://realchecko.blogspot.com/2010/02/audacity.html' title='音訊檔案處理軟體 Audacity'/><author><name>Checko</name><uri>http://www.blogger.com/profile/03239306354367907990</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/blogger/669/302/320/IMGP0803.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2117270136732158310.post-6566887189092357017</id><published>2010-02-05T10:24:00.007+08:00</published><updated>2010-02-05T13:12:10.745+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Hardware'/><category scheme='http://www.blogger.com/atom/ns#' term='Notes'/><category scheme='http://www.blogger.com/atom/ns#' term='Others'/><category scheme='http://www.blogger.com/atom/ns#' term='MEMO'/><title type='text'>ISDB-T TRP file content info</title><content type='html'>日本 ISDB-T (13 seg) 的 streamming file : *.trp。&lt;br /&gt;&lt;br /&gt;由 property 來看：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Video : Mpeg4 Video (H264) 320x172 , 14.99fps&lt;/li&gt;&lt;li&gt;Audio : AAC 48000Hz sterro 37Kbps&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;可以用 K lite Codec Pack 新版來看。&lt;br /&gt;&lt;br /&gt;* 最新的版本還可以看到：&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;General&lt;br /&gt;Complete name                    : G:\log.trp&lt;br /&gt;Format                           : MPEG-TS&lt;br /&gt;Format profile                   : No PAT/PMT&lt;br /&gt;File size                        : 17.8 MiB&lt;br /&gt;&lt;br /&gt;Video&lt;br /&gt;ID                               : 1024 (0x400)&lt;br /&gt;Format                           : AVC&lt;br /&gt;Format/Info                      : Advanced Video Codec&lt;br /&gt;Format profile                   : Baseline@L1.2&lt;br /&gt;Format settings, CABAC           : No&lt;br /&gt;Format settings, ReFrames        : 1 frame&lt;br /&gt;Width                            : 320 pixels&lt;br /&gt;Height                           : 180 pixels&lt;br /&gt;Display aspect ratio             : 16:9&lt;br /&gt;Frame rate                       : 29.970 fps&lt;br /&gt;Resolution                       : 8 bits&lt;br /&gt;Colorimetry                      : 4:2:0&lt;br /&gt;Scan type                        : Progressive&lt;br /&gt;&lt;br /&gt;Audio&lt;br /&gt;ID                               : 1280 (0x500)&lt;br /&gt;Format                           : MPEG Audio&lt;br /&gt;Video delay                      : -899ms&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;再詳細用 Play -- Filter --Audio Filte -- Proerties -- [IN]log.trp/Audio 看：&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Filter : Audio Switcher - CLSID : {18C16B08-6497-420E-AD14-22D21C2CEAB7}&lt;br /&gt;&lt;br /&gt;- Connected to:&lt;br /&gt;&lt;br /&gt;CLSID: {0F40E1E5-4F79-4988-B1A9-CC98794E6B55}&lt;br /&gt;Filter: ffdshow Audio Decoder&lt;br /&gt;Pin: Out&lt;br /&gt;&lt;br /&gt;- Connection media type:&lt;br /&gt;&lt;br /&gt;Audio: PCM 48000Hz stereo 1536kbps&lt;br /&gt;&lt;br /&gt;AM_MEDIA_TYPE:&lt;br /&gt;majortype: MEDIATYPE_Audio {73647561-0000-0010-8000-00AA00389B71}&lt;br /&gt;subtype: MEDIASUBTYPE_PCM {00000001-0000-0010-8000-00AA00389B71}&lt;br /&gt;formattype: FORMAT_WaveFormatEx {05589F81-C356-11CE-BF01-00AA0055595A}&lt;br /&gt;bFixedSizeSamples: 1&lt;br /&gt;bTemporalCompression: 0&lt;br /&gt;lSampleSize: 1&lt;br /&gt;cbFormat: 18&lt;br /&gt;&lt;br /&gt;WAVEFORMATEX:&lt;br /&gt;wFormatTag: 0x0001&lt;br /&gt;nChannels: 2&lt;br /&gt;nSamplesPerSec: 48000&lt;br /&gt;nAvgBytesPerSec: 192000&lt;br /&gt;nBlockAlign: 4&lt;br /&gt;wBitsPerSample: 16&lt;br /&gt;cbSize: 0 (extra bytes)&lt;br /&gt;&lt;br /&gt;pbFormat:&lt;br /&gt;0000: 01 00 02 00 80 bb 00 00 00 ee 02 00 04 00 10 00 ....€.........&lt;br /&gt;0010: 00 00                                           ..&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;用 一樣的 MPC MPEG Filter 來看&lt;br /&gt;[IN] input:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Filter : MPC - Mpeg Splitter (Gabest) - CLSID : {DC257063-045F-4BE2-BD5B-E12279C464F0}&lt;br /&gt;&lt;br /&gt;- Connected to:&lt;br /&gt;&lt;br /&gt;CLSID: {E436EBB5-524F-11CE-9F53-0020AF0BA770}&lt;br /&gt;Filter: G:\log.trp&lt;br /&gt;Pin: Output&lt;br /&gt;&lt;br /&gt;- Connection media type:&lt;br /&gt;&lt;br /&gt;Unknown&lt;br /&gt;&lt;br /&gt;AM_MEDIA_TYPE:&lt;br /&gt;majortype: MEDIATYPE_Stream {E436EB83-524F-11CE-9F53-0020AF0BA770}&lt;br /&gt;subtype: MEDIASUBTYPE_MPEG2_TRANSPORT {E06D8023-DB46-11CF-B4D1-00805F6CBBEA}&lt;br /&gt;formattype: TIME_FORMAT_NONE {00000000-0000-0000-0000-000000000000}&lt;br /&gt;bFixedSizeSamples: 1&lt;br /&gt;bTemporalCompression: 0&lt;br /&gt;lSampleSize: 1&lt;br /&gt;cbFormat: 0&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;[OUT] Video&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Filter : MPC - Mpeg Splitter (Gabest) - CLSID : {DC257063-045F-4BE2-BD5B-E12279C464F0}&lt;br /&gt;&lt;br /&gt;- Connected to:&lt;br /&gt;&lt;br /&gt;CLSID: {04FE9017-F873-410E-871E-AB91661A4EF7}&lt;br /&gt;Filter: ffdshow Video Decoder&lt;br /&gt;Pin: In&lt;br /&gt;&lt;br /&gt;- Connection media type:&lt;br /&gt;&lt;br /&gt;Video: MPEG4 Video (H264) 320x192 14.99fps&lt;br /&gt;&lt;br /&gt;AM_MEDIA_TYPE:&lt;br /&gt;majortype: MEDIATYPE_Video {73646976-0000-0010-8000-00AA00389B71}&lt;br /&gt;subtype: Unknown GUID Name {31435641-0000-0010-8000-00AA00389B71}&lt;br /&gt;formattype: FORMAT_MPEG2_VIDEO {E06D80E3-DB46-11CF-B4D1-00805F6CBBEA}&lt;br /&gt;bFixedSizeSamples: 1&lt;br /&gt;bTemporalCompression: 0&lt;br /&gt;lSampleSize: 1&lt;br /&gt;cbFormat: 159&lt;br /&gt;&lt;br /&gt;VIDEOINFOHEADER:&lt;br /&gt;rcSource: (0,0)-(0,0)&lt;br /&gt;rcTarget: (0,0)-(0,0)&lt;br /&gt;dwBitRate: 0&lt;br /&gt;dwBitErrorRate: 0&lt;br /&gt;AvgTimePerFrame: 667333&lt;br /&gt;&lt;br /&gt;VIDEOINFOHEADER2:&lt;br /&gt;dwInterlaceFlags: 0x00000000&lt;br /&gt;dwCopyProtectFlags: 0x00000000&lt;br /&gt;dwPictAspectRatioX: 320&lt;br /&gt;dwPictAspectRatioY: 192&lt;br /&gt;dwControlFlags: 0x00000000&lt;br /&gt;dwReserved2: 0x00000000&lt;br /&gt;&lt;br /&gt;MPEG2VIDEOINFO:&lt;br /&gt;dwStartTimeCode: 0&lt;br /&gt;cbSequenceHeader: 27&lt;br /&gt;dwProfile: 0x00000042&lt;br /&gt;dwLevel: 0x0000000c&lt;br /&gt;dwFlags: 0x00000004&lt;br /&gt;&lt;br /&gt;BITMAPINFOHEADER:&lt;br /&gt;biSize: 40&lt;br /&gt;biWidth: 320&lt;br /&gt;biHeight: 192&lt;br /&gt;biPlanes: 0&lt;br /&gt;biBitCount: 0&lt;br /&gt;biCompression: AVC1&lt;br /&gt;biSizeImage: 0&lt;br /&gt;biXPelsPerMeter: 0&lt;br /&gt;biYPelsPerMeter: 0&lt;br /&gt;biClrUsed: 0&lt;br /&gt;biClrImportant: 0&lt;br /&gt;&lt;br /&gt;pbFormat:&lt;br /&gt;0000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................&lt;br /&gt;0010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................&lt;br /&gt;0020: 00 00 00 00 00 00 00 00 c5 2e 0a 00 00 00 00 00 ...............&lt;br /&gt;0030: 00 00 00 00 00 00 00 00 40 01 00 00 c0 00 00 00 ........@......&lt;br /&gt;0040: 00 00 00 00 00 00 00 00 28 00 00 00 40 01 00 00 ........(...@...&lt;br /&gt;0050: c0 00 00 00 00 00 00 00 41 56 43 31 00 00 00 00 .......AVC1....&lt;br /&gt;0060: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................&lt;br /&gt;0070: 00 00 00 00 1b 00 00 00 42 00 00 00 0c 00 00 00 ........B.......&lt;br /&gt;0080: 04 00 00 00|00 13 67 42 e0 0c b6 81 41 9f 9e 10 ......gB.A.&lt;br /&gt;0090: 00 00 3e 90 00 07 53 08 40 00 04 68 ce 3c 80    ..&gt;..S.@..h&lt;€  - Enumerated media type 0:  Set as the current media type  &lt;/pre&gt;&lt;br /&gt;&lt;hr /&gt;以上的 demuxer 是用 Gabest 的 MPEG Splitter。&lt;br /&gt;這個是 open source project, Wiki :  &lt;a href="http://en.wikipedia.org/wiki/Media_Player_Classic"&gt;Media Player Classic&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;相關的Link&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/ISDB"&gt;ISDB Wiki&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Advanced_Audio_Coding#Japanese_ISDB-T"&gt;AAC Wiki &lt;/a&gt;- 內含 Japan 1seg&lt;/li&gt;&lt;li&gt;&lt;a href="http://wiki.multimedia.cx/index.php?title=TRP"&gt;TRP 是  h.264  stream 的專屬附檔名&lt;/a&gt;？&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2117270136732158310-6566887189092357017?l=realchecko.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realchecko.blogspot.com/feeds/6566887189092357017/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2117270136732158310&amp;postID=6566887189092357017' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/6566887189092357017'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/6566887189092357017'/><link rel='alternate' type='text/html' href='http://realchecko.blogspot.com/2010/02/isdb-t-13-seg-streamming-file.html' title='ISDB-T TRP file content info'/><author><name>Checko</name><uri>http://www.blogger.com/profile/03239306354367907990</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/blogger/669/302/320/IMGP0803.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2117270136732158310.post-8642741617400099993</id><published>2010-02-04T13:47:00.001+08:00</published><updated>2010-02-04T13:49:44.831+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WindowsCE'/><category scheme='http://www.blogger.com/atom/ns#' term='MEMO'/><title type='text'>memo : timeGetTime in windows ce</title><content type='html'>有時後 kernel driver 要用 timeGetTime( ) 取得 system tick (雖然說比較準，但是實際上code 跟 gettickcount( ) 是一樣的)&lt;br /&gt;&lt;br /&gt;source code 要 include windows.h&lt;br /&gt;還有要 link mmtimer.lib&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2117270136732158310-8642741617400099993?l=realchecko.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realchecko.blogspot.com/feeds/8642741617400099993/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2117270136732158310&amp;postID=8642741617400099993' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/8642741617400099993'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/8642741617400099993'/><link rel='alternate' type='text/html' href='http://realchecko.blogspot.com/2010/02/memo-timegettime-in-windows-ce.html' title='memo : timeGetTime in windows ce'/><author><name>Checko</name><uri>http://www.blogger.com/profile/03239306354367907990</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/blogger/669/302/320/IMGP0803.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2117270136732158310.post-4242683806644381102</id><published>2010-02-02T15:30:00.004+08:00</published><updated>2010-02-02T15:41:32.678+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WindowsCE'/><category scheme='http://www.blogger.com/atom/ns#' term='MSDN'/><category scheme='http://www.blogger.com/atom/ns#' term='Microsoft'/><title type='text'>Get Powe Notification  : AP</title><content type='html'>AP 要收到 suspend/wakeup 的通知，可以用 &lt;a href="http://msdn.microsoft.com/en-us/library/aa932427.aspx"&gt;RequestPowerNotifications&lt;/a&gt;&lt;br /&gt;Sample Code 在 google groupe 上： &lt;a href="http://groups.google.com/group/microsoft.public.windowsce.platbuilder/msg/a9b58a9e96342ef3"&gt;PowerChange Notifications : Resume&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;很好心的把 code 都貼出來，但是我用起來有一點問題，就是 Notification Thread 沒有辦法terminate 掉，&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;/ John Baik: Sample code for Power Notification&lt;br /&gt;&lt;br /&gt;#include &amp;lt;windows.h&amp;gt;&lt;br /&gt;#include &amp;lt;PM.h&amp;gt;&lt;br /&gt;// from pmimpl.h file.&lt;br /&gt;#ifndef QUEUE_ENTRIES&lt;br /&gt;#define QUEUE_ENTRIES       3&lt;br /&gt;#endif&lt;br /&gt;#ifndef MAX_NAMELEN&lt;br /&gt;#define MAX_NAMELEN         128&lt;br /&gt;#endif&lt;br /&gt;&lt;br /&gt;#ifndef QUEUE_SIZE&lt;br /&gt;#define QUEUE_SIZE          (QUEUE_ENTRIES * (sizeof(POWER_BROADCAST) + \\&lt;br /&gt;                         (MAX_NAMELEN * sizeof(TCHAR))))&lt;br /&gt;#endif&lt;br /&gt;&lt;br /&gt;int WINAPI PMNotifyThread(LPVOID pvParam);&lt;br /&gt;void PMNotification(HANDLE hMsgQ);&lt;br /&gt;&lt;br /&gt;HANDLE ghPMNotifyQ = NULL;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;int WINAPI WinMain(HINSTANCE hInstance,&lt;br /&gt;      HINSTANCE hPrevInstance,&lt;br /&gt;      LPTSTR    lpCmdLine,&lt;br /&gt;      int       nCmdShow)&lt;br /&gt;{&lt;br /&gt;MSGQUEUEOPTIONS msgQpm = {0};&lt;br /&gt;HANDLE hPwrNotify=NULL; // Power manager handle&lt;br /&gt;HANDLE hPMThread=NULL;&lt;br /&gt;&lt;br /&gt;// create a message queue for Power Manager notifications&lt;br /&gt;msgQpm.dwSize = sizeof(MSGQUEUEOPTIONS);&lt;br /&gt;msgQpm.dwFlags = 0;&lt;br /&gt;msgQpm.dwMaxMessages = QUEUE_ENTRIES;&lt;br /&gt;msgQpm.cbMaxMessage = sizeof(POWER_BROADCAST) + MAX_NAMELEN;&lt;br /&gt;msgQpm.bReadAccess = TRUE;&lt;br /&gt;&lt;br /&gt;ghPMNotifyQ= CreateMsgQueue(NULL, &amp;amp;msgQpm);&lt;br /&gt;&lt;br /&gt;if (ghPMNotifyQ == NULL)&lt;br /&gt;{&lt;br /&gt; DWORD dwErr = GetLastError();&lt;br /&gt; RETAILMSG(1, (TEXT(" PMNotify:CreateMessageQueue ERROR:%d \r\n"), dwErr));&lt;br /&gt; return 1;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// request Power notifications&lt;br /&gt;hPwrNotify = RequestPowerNotifications(ghPMNotifyQ, PBT_TRANSITION |&lt;br /&gt; PBT_RESUME);&lt;br /&gt;&lt;br /&gt;if (hPwrNotify == NULL)&lt;br /&gt;{&lt;br /&gt; DWORD dwErr = GetLastError();&lt;br /&gt; RETAILMSG(1, (TEXT(" PMNotify:RequestPowerNotifications ERROR:%d\r\n"), dwErr));&lt;br /&gt;  return 2;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// Create PMNotifyThread&lt;br /&gt;hPMThread = CreateThread(NULL, 0,&lt;br /&gt; (LPTHREAD_START_ROUTINE )PMNotifyThread, NULL, 0, NULL);&lt;br /&gt;&lt;br /&gt;if(hPMThread)&lt;br /&gt;{&lt;br /&gt; // wait for PMNotifyThread done&lt;br /&gt; WaitForSingleObject(hPMThread, INFINITE);&lt;br /&gt; CloseHandle(hPMThread);&lt;br /&gt;&lt;br /&gt; if(hPwrNotify)&lt;br /&gt; {&lt;br /&gt;  StopPowerNotifications(hPwrNotify);&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;return 0;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// PMNotifyThread: Wait for Message from PM Driver.&lt;br /&gt;//&lt;br /&gt;int WINAPI PMNotifyThread(LPVOID pvParam)&lt;br /&gt;{&lt;br /&gt;DWORD dwStatus;&lt;br /&gt;&lt;br /&gt;while (TRUE)&lt;br /&gt;{&lt;br /&gt; dwStatus = WaitForSingleObject(ghPMNotifyQ, INFINITE);&lt;br /&gt;&lt;br /&gt; if(dwStatus == WAIT_OBJECT_0)&lt;br /&gt; {&lt;br /&gt;  PMNotification(ghPMNotifyQ);&lt;br /&gt; }&lt;br /&gt; else&lt;br /&gt; {&lt;br /&gt;  RETAILMSG(1,&lt;br /&gt;  (TEXT(" PMNotify: WaitForSingleObject returned %d (error %d)\r\n"),&lt;br /&gt;  dwStatus, GetLastError()));&lt;br /&gt;   break;&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;return 0;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void PMNotification(HANDLE hMsgQ)&lt;br /&gt;{&lt;br /&gt;UCHAR pmbuf[QUEUE_SIZE];&lt;br /&gt;int nBytesRead=0;&lt;br /&gt;DWORD dwFlags = 0;&lt;br /&gt;int dwCount = 0;&lt;br /&gt;&lt;br /&gt;memset(pmbuf, 0, sizeof(pmbuf));&lt;br /&gt;&lt;br /&gt;if ( !ReadMsgQueue(hMsgQ,&lt;br /&gt; pmbuf,&lt;br /&gt; QUEUE_SIZE,&lt;br /&gt; (LPDWORD)&amp;amp;nBytesRead,&lt;br /&gt; INFINITE,    // Timeout&lt;br /&gt; &amp;amp;dwFlags))&lt;br /&gt;{&lt;br /&gt; DWORD dwErr = GetLastError();&lt;br /&gt; RETAILMSG(1,&lt;br /&gt; (TEXT(" ProcessPowerNotification: ReadMsgQueue:ERROR:%d\n"), dwErr));&lt;br /&gt;}&lt;br /&gt;else if(nBytesRead &amp;gt;= sizeof(POWER_BROADCAST))&lt;br /&gt;{&lt;br /&gt; // process power notifications&lt;br /&gt; //-----------------------------&lt;br /&gt; PPOWER_BROADCAST pPB = (PPOWER_BROADCAST) pmbuf;&lt;br /&gt;&lt;br /&gt; switch (pPB-&amp;gt;Message)&lt;br /&gt; {&lt;br /&gt; case PBT_RESUME:&lt;br /&gt;  RETAILMSG(1, (TEXT(" PMNotify:PBT_RESUME \r\n")));&lt;br /&gt;  break;&lt;br /&gt;&lt;br /&gt; case PBT_POWERSTATUSCHANGE:&lt;br /&gt;  RETAILMSG(1, (TEXT(" PMNotify:PBT_POWERSTATUSCHANGE: \r\n")));&lt;br /&gt;  break;&lt;br /&gt;&lt;br /&gt; case PBT_POWERINFOCHANGE:&lt;br /&gt;  RETAILMSG(1, (TEXT(" PMNotify:PBT_POWERSTATUSCHANGE: \r\n")));&lt;br /&gt;  break;&lt;br /&gt;&lt;br /&gt; case PBT_TRANSITION:&lt;br /&gt;  {&lt;br /&gt;   switch (POWER_STATE(pPB-&amp;gt;Flags))&lt;br /&gt;   {&lt;br /&gt;   case POWER_STATE_ON:&lt;br /&gt;    break;&lt;br /&gt;   case POWER_STATE_OFF:&lt;br /&gt;    break;&lt;br /&gt;   case POWER_STATE_CRITICAL:&lt;br /&gt;    break;&lt;br /&gt;   case POWER_STATE_BOOT:&lt;br /&gt;    break;&lt;br /&gt;   case POWER_STATE_IDLE:&lt;br /&gt;    break;&lt;br /&gt;   case POWER_STATE_SUSPEND:&lt;br /&gt;    break;&lt;br /&gt;   case POWER_STATE_RESET:&lt;br /&gt;    break;&lt;br /&gt;   default:&lt;br /&gt;    break;&lt;br /&gt;   }&lt;br /&gt;   break;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt; default:&lt;br /&gt;  break;&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;} &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;實際上用要稍微修改一下..&lt;br /&gt;&lt;ul&gt;&lt;li&gt;PMThread 要有 Exit 的機制 - 在 WaitForSingleObject 加 Timeout check flag 或是用 WaitForMultipleObject 代替&lt;/li&gt;&lt;li&gt;WinMain 的 code 其實要分兩部份： InitPowerHandler, ClosePowerHandler. 放在 Dialog Proc 的 WM_INITDIALOG 和 WM_CLOSE&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2117270136732158310-4242683806644381102?l=realchecko.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realchecko.blogspot.com/feeds/4242683806644381102/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2117270136732158310&amp;postID=4242683806644381102' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/4242683806644381102'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/4242683806644381102'/><link rel='alternate' type='text/html' href='http://realchecko.blogspot.com/2010/02/get-powe-notification-ap.html' title='Get Powe Notification  : AP'/><author><name>Checko</name><uri>http://www.blogger.com/profile/03239306354367907990</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/blogger/669/302/320/IMGP0803.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2117270136732158310.post-4329682220757043088</id><published>2010-02-01T17:58:00.003+08:00</published><updated>2010-02-01T18:00:55.631+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Hardware'/><category scheme='http://www.blogger.com/atom/ns#' term='Others'/><category scheme='http://www.blogger.com/atom/ns#' term='Embedded'/><title type='text'>pid and contunuity code in Transport Stream</title><content type='html'>雖然 Wiki 上寫的 pid 是在 high byte，continuity code 也是在 high byte。&lt;br /&gt;但是實際上做起來：&lt;br /&gt;byte 0 : sync 0x47&lt;br /&gt;byte 1 : pid high and xxx bit&lt;br /&gt;byte 2 : pid low and &lt;br /&gt;byte 3 : continuity code and xxx&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;pid = ((byte1 &lt;&lt; 8) | byte2) &amp; 0x1FFF&lt;br /&gt;cnt = byte3 % 0x0F&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2117270136732158310-4329682220757043088?l=realchecko.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realchecko.blogspot.com/feeds/4329682220757043088/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2117270136732158310&amp;postID=4329682220757043088' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/4329682220757043088'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/4329682220757043088'/><link rel='alternate' type='text/html' href='http://realchecko.blogspot.com/2010/02/pid-and-contunuity-code-in-transport.html' title='pid and contunuity code in Transport Stream'/><author><name>Checko</name><uri>http://www.blogger.com/profile/03239306354367907990</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/blogger/669/302/320/IMGP0803.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2117270136732158310.post-2486769088079718243</id><published>2010-01-22T15:02:00.003+08:00</published><updated>2010-02-26T11:21:20.129+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WindowsCE'/><category scheme='http://www.blogger.com/atom/ns#' term='MSDN'/><title type='text'>combine 2 .lib into one - or add .obj into .lib</title><content type='html'>要用 LIB.EXE (不是 AR)&lt;br /&gt;&lt;br /&gt;command 就是：&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;C:\XXX&amp;gt; lib one.obj two.lib /OUT:newname.lib&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;這樣就可以把 one.obj 跟 two.lib 合併成 newname.lib&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;在 platform buidler 裡，static library 的專案。&lt;br /&gt;就可以把 上面的 command 寫在 postlink.&lt;br /&gt;&lt;br /&gt;這樣就要這注意最後 libraryname ，要改 sources 中的 TARGETNAME，然後 postlink 中的 command 才用真正的 library name。&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;在 VS2005 里，要在&lt;br /&gt;LIB ".\SDKV0.0.0.8 (ARMV4I)\Debug\mycode.obj" additional.lib /OUT:finalLIB.lib&lt;br /&gt;&lt;br /&gt;但是 正式的作法大概是把 additional.lib 寫在 project property 的 Librian -- Additional Dependencies 里&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2117270136732158310-2486769088079718243?l=realchecko.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realchecko.blogspot.com/feeds/2486769088079718243/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2117270136732158310&amp;postID=2486769088079718243' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/2486769088079718243'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/2486769088079718243'/><link rel='alternate' type='text/html' href='http://realchecko.blogspot.com/2010/01/combine-2-lib-into-one-or-add-obj-into.html' title='combine 2 .lib into one - or add .obj into .lib'/><author><name>Checko</name><uri>http://www.blogger.com/profile/03239306354367907990</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/blogger/669/302/320/IMGP0803.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2117270136732158310.post-7892377735483941938</id><published>2010-01-21T16:36:00.004+08:00</published><updated>2010-03-02T17:44:30.184+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WindowsCE'/><category scheme='http://www.blogger.com/atom/ns#' term='MSDN'/><title type='text'>CeDebugX</title><content type='html'>msdn &lt;a href="http://msdn.microsoft.com/en-us/library/aa934364.aspx"&gt;有寫&lt;/a&gt; cedebugx60.dll 在&lt;br /&gt;C:\Program Files\Microsoft Platform Builder\6.00\cepb\bin\Extensions&lt;br /&gt;&lt;br /&gt;可以用 platform buidler (in VS2005 mode) 的 load extension load 進來。&lt;br /&gt;&lt;br /&gt;貼一下 help:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Error resolving expression &lt;{,,kernel.dll}g_pprcNK-&gt;dwId&gt;&lt;br /&gt;ERROR in ReadStruct, can't read {,,kernel.dll}g_pprcNK-&gt;dwId&lt;br /&gt;&lt;br /&gt;Unable to resolve NK.EXE symbols.&lt;br /&gt;&lt;br /&gt;Is the debugger in a break state?&lt;br /&gt;&lt;br /&gt;If not, you must first break into the debugger before attempting to use&lt;br /&gt;debugger extension commands.&lt;br /&gt;&lt;br /&gt;If so, make sure that valid symbols are loaded.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;CEDEBUGX&lt;br /&gt;&lt;br /&gt;File Version    : 6.00.2217.1&lt;br /&gt;Product Version : 6.00.2217.1&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;COMMANDS:&lt;br /&gt;&lt;br /&gt;To see detailed help type the command followed by /?&lt;br /&gt;&lt;br /&gt;Extension Information and Control:&lt;br /&gt;&lt;br /&gt; help                      - display this list&lt;br /&gt; version                   - display version information for this extension&lt;br /&gt; refresh                   - refresh cached info (must call after any run/break cycle).&lt;br /&gt; xml                       - capture debug info in an xml file and display formatted data.&lt;br /&gt; save                      - prompts the user for a location in which to save all files generated in the session.&lt;br /&gt; getworkingpath            - display the path to the debugger extension's current working folder.&lt;br /&gt; setworkingpath            - specify a path to use as a new destination for saved files (working folder)&lt;br /&gt;&lt;br /&gt;General Information:&lt;br /&gt;&lt;br /&gt; exception                 - exception info and current call stack&lt;br /&gt; kinfo                     - prints the UserKInfo table&lt;br /&gt; toc                       - prints ROM table of contents&lt;br /&gt; oat                       - prints OEM Address Table&lt;br /&gt; disasm                    - retrieve disassembly for a given address&lt;br /&gt; getsym                    - list nearest symbol at addr&lt;br /&gt; checksymbols              - validate that correct symbols are in use.&lt;br /&gt; dd                        - dump data at given address&lt;br /&gt; ll                        - prints linked lists generically&lt;br /&gt; expr                      - evaluate an expression&lt;br /&gt; getsizeof                 - get the size, in bytes, of a type or expression&lt;br /&gt; d2x                       - convert a decimal integer to a hex value.&lt;br /&gt; x2i                       - convert a hex value to a singed integer.&lt;br /&gt; x2u                       - convert a hex value to an unsigned integer.&lt;br /&gt; ms2t                      - display a value in milliseconds as hours, minutes, and seconds.&lt;br /&gt;&lt;br /&gt;Diagnostics:&lt;br /&gt;&lt;br /&gt; diagnose                  - provide detailed information about hangs or crashes&lt;br /&gt;&lt;br /&gt;Threads:&lt;br /&gt;&lt;br /&gt; thread                    - prints thread information from thread ptr&lt;br /&gt; threadh                   - prints thread information from thread handle&lt;br /&gt; threadlist                - enumerate all threads (basic info). use "threadlist ?" for more options&lt;br /&gt; allthreads                - enumerate all threads (extended info)&lt;br /&gt; runlist                   - enumerate threads on the scheduler's run list.&lt;br /&gt; sleeplist                 - enumerate threads on the scheduler's sleep list.&lt;br /&gt; context                   - print context information for a given thread.&lt;br /&gt; stackeval                 - prints all values on a thread's stack, looking for potential symbols and known objects&lt;br /&gt; stacktrace                - prints stack ptr and frame ptrs with PC and ret addr for a given thread&lt;br /&gt;&lt;br /&gt;Processes and Modules:&lt;br /&gt;&lt;br /&gt; proc                      - prints process information&lt;br /&gt; proclist                  - lists all processes&lt;br /&gt; module                    - prints module information&lt;br /&gt; modlist                   - lists all loaded modules&lt;br /&gt;&lt;br /&gt;Handles:&lt;br /&gt;&lt;br /&gt; handlelist                - prints active handle list&lt;br /&gt; handle                    - evaluates a handle to determine type&lt;br /&gt; h2p                       - get kernel object ptr from a handle&lt;br /&gt; p2h                       - get a handle from a kernel object ptr&lt;br /&gt;&lt;br /&gt;Blocked Threads:&lt;br /&gt;&lt;br /&gt; proxy                     - prints detailed information about a particular proxy (i.e. blocking object)&lt;br /&gt; proxylist                 - lists all of the proxies in the system or owned by a particualr process&lt;br /&gt; blocked                   - prints list of blocking objects (proxies) and the threads they are blocking&lt;br /&gt; cslist                    - prints a list of critical sections that are currently blocking threads&lt;br /&gt; eventlist                 - prints a list of events that are currently blocking threads&lt;br /&gt; sending                   - prints a list of threads blocked in SendMessage calls&lt;br /&gt;&lt;br /&gt;Memory:&lt;br /&gt;&lt;br /&gt; heaplist                  - prints summary information about all heaps in the system&lt;br /&gt; heapwalk                  - print extended heap information&lt;br /&gt; walkthisheap              - print heap information for specific heap&lt;br /&gt; meminfo                   - prints system memory information&lt;br /&gt; heapitem                  - finds a heap item spanning an address and dumps item contents&lt;br /&gt; dumpitem                  - prints contents of a heap item&lt;br /&gt; valist                    - prints virtual allocations associated with a process&lt;br /&gt; fsmaplist                 - prints summary information about all memory-mapped files&lt;br /&gt; fsmap                     - prints information about a memory-mapped file&lt;br /&gt; fsviewlist                - prints summary information about all memory-mapped views&lt;br /&gt; fsview                    - prints information about a memory-mapped view&lt;br /&gt; pgpool                    - prints information about the page pools&lt;br /&gt;&lt;br /&gt;GWES:&lt;br /&gt;&lt;br /&gt; win                       - enumerate all windows (use it without arguments for more options)&lt;br /&gt; winh                      - prints the window information for a handle (can use p|c|n|d|a) for navigation&lt;br /&gt; gditable                  - enumerate all GDI entries&lt;br /&gt; gdih                      - prints the information of the GDI entity related to the provided handle&lt;br /&gt; gdiobj                    - prints the information of the GDI entity related to the provided gdi object&lt;br /&gt; screenshot                - creates and shows a screenshot of the current UI state of the device&lt;br /&gt; msgqueues                 - lists active message queues&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;allthreads 功能真強大.. 會列出所有 thread 的 runstate 和 call stack。&lt;br /&gt;&lt;br /&gt;配上 runlist - 列出 scheduler 的 runlist ，可以看出哪個 thread 太糟糕，站住cpu time.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2117270136732158310-7892377735483941938?l=realchecko.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realchecko.blogspot.com/feeds/7892377735483941938/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2117270136732158310&amp;postID=7892377735483941938' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/7892377735483941938'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/7892377735483941938'/><link rel='alternate' type='text/html' href='http://realchecko.blogspot.com/2010/01/cedebugx.html' title='CeDebugX'/><author><name>Checko</name><uri>http://www.blogger.com/profile/03239306354367907990</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/blogger/669/302/320/IMGP0803.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2117270136732158310.post-3424014266417353293</id><published>2010-01-18T17:47:00.006+08:00</published><updated>2010-01-18T18:24:54.239+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WindowsCE'/><category scheme='http://www.blogger.com/atom/ns#' term='MSDN'/><title type='text'>糟糕的： CeRunAppAtEvent</title><content type='html'>只能說這真是一個/組莫名奇妙的api呀....&lt;br /&gt;&lt;br /&gt;CE 可以用&lt;pre&gt;CeRunAppAtEvent(_T("\\\\.\\Notifications\\NamedEvents\\MYWAKEUPEVENT"),&lt;br /&gt;              NOTIFICATION_EVENT_WAKEUP&lt;/pre&gt;要求 kernel (GWES) 把 OS內部 的 EVENT_WAKEUP 轉成 Signal  MYWAKEUPEVENT。&lt;br /&gt;&lt;br /&gt;但是...這個 funciton 被 call 幾次， wakeup 時，那個 event 就會被 signal 幾次。&lt;br /&gt;&lt;blockquote&gt;也就是說，即使你的 ap 已經結束，但是event 已經 create 起來，OS也註冊了，所以即使你的 Ap 已經結束了，OS 還是會依照註冊的內容執行..&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;所以，要 記得 un-register...就是把那個 event 改對應到 NOTIFICATION_EVENT_NONE 就可以：&lt;pre&gt;CeRunAppAtEvent(_T("\\\\.\\Notifications\\NamedEvents\\MYWAKEUPEVENT"),&lt;br /&gt;              NOTIFICATION_EVENT_NONE)&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;附上測試的 code :&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;// SYSWAKEUPEVENT.cpp : Defines the entry point for the application.&lt;br /&gt;//&lt;br /&gt;&lt;br /&gt;#include "stdafx.h"&lt;br /&gt;&lt;br /&gt;#include &amp;lt;notify.h&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;HWND MainWnd;&lt;br /&gt;int rcvcnt=0;&lt;br /&gt;&lt;br /&gt;DWORD WINAPI WaiterThread(PVOID pArg)&lt;br /&gt;{&lt;br /&gt; HANDLE WakeUpEvent;&lt;br /&gt;&lt;br /&gt; WakeUpEvent = CreateEvent(NULL,FALSE,FALSE,_T("MYWAKEUPEVENT"));&lt;br /&gt; if(WakeUpEvent == NULL){&lt;br /&gt;     RETAILMSG(1,(TEXT("CreateEvent Failed\r\n")));&lt;br /&gt;     ExitThread(0);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; if(!CeRunAppAtEvent(_T("\\\\.\\Notifications\\NamedEvents\\MYWAKEUPEVENT"),&lt;br /&gt;     NOTIFICATION_EVENT_NONE)){&lt;br /&gt;     RETAILMSG(1,(TEXT("CeRunAppAtEvent NONE Failed\r\n")));&lt;br /&gt;     ExitThread(0);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; if(!CeRunAppAtEvent(_T("\\\\.\\Notifications\\NamedEvents\\MYWAKEUPEVENT"),&lt;br /&gt;     NOTIFICATION_EVENT_WAKEUP)){&lt;br /&gt;     RETAILMSG(1,(TEXT("CeRunAppAtEvent Failed\r\n")));&lt;br /&gt;     ExitThread(0);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; while(1){&lt;br /&gt;     DWORD EventGot;&lt;br /&gt;&lt;br /&gt;     EventGot = WaitForSingleObject(WakeUpEvent,INFINITE);&lt;br /&gt;     if(EventGot==WAIT_OBJECT_0){&lt;br /&gt;         rcvcnt++;&lt;br /&gt;         RETAILMSG(1,(TEXT("received! %d\r\n"),rcvcnt));&lt;br /&gt;         InvalidateRect(MainWnd,NULL,TRUE);&lt;br /&gt;     }else{&lt;br /&gt;         RETAILMSG(1,(TEXT("receive not object 0 : %d\r\n"),EventGot));&lt;br /&gt;     }&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;HANDLE hWaiterThread;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;LRESULT CALLBACK MainWndProc(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam)&lt;br /&gt;{&lt;br /&gt; PAINTSTRUCT ps;&lt;br /&gt; RECT rect;&lt;br /&gt; HDC hdc;&lt;br /&gt;&lt;br /&gt; switch(wMsg){&lt;br /&gt;     case WM_PAINT:&lt;br /&gt;         {&lt;br /&gt;             TCHAR outtext[50];&lt;br /&gt;&lt;br /&gt;             GetClientRect(hWnd,&amp;amp;rect);&lt;br /&gt;             hdc = BeginPaint(hWnd, &amp;amp;ps);&lt;br /&gt;&lt;br /&gt;             swprintf(outtext,TEXT("Received WAKEUP EVENT: %d"),rcvcnt);&lt;br /&gt;&lt;br /&gt;             DrawText(hdc, outtext,-1,&amp;amp;rect,DT_CENTER | DT_CENTER | DT_SINGLELINE);&lt;br /&gt;             EndPaint(hWnd,&amp;amp;ps);&lt;br /&gt;         }&lt;br /&gt;         return 0;&lt;br /&gt;     case WM_DESTROY:&lt;br /&gt;         if(hWaiterThread)&lt;br /&gt;             CloseHandle(hWaiterThread);&lt;br /&gt;         PostQuitMessage(0);&lt;br /&gt; }&lt;br /&gt; return DefWindowProc(hWnd, wMsg, wParam, lParam);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int WINAPI WinMain(HINSTANCE hInstance,&lt;br /&gt;                  HINSTANCE hPrevInstance,&lt;br /&gt;                  LPTSTR     lpCmdLine,&lt;br /&gt;                  int       nCmdShow)&lt;br /&gt;{&lt;br /&gt;WNDCLASS wc;&lt;br /&gt;MSG msg;&lt;br /&gt;&lt;br /&gt;// register the main windows class&lt;br /&gt;wc.style = 0;&lt;br /&gt;wc.lpfnWndProc = MainWndProc;&lt;br /&gt;wc.cbClsExtra = 0;&lt;br /&gt;wc.cbWndExtra = 0;&lt;br /&gt;wc.hInstance = hInstance;&lt;br /&gt;wc.hIcon = NULL;&lt;br /&gt;wc.hCursor = LoadCursor(NULL,IDC_ARROW);&lt;br /&gt;wc.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);&lt;br /&gt;wc.lpszMenuName = NULL;&lt;br /&gt;wc.lpszClassName = TEXT("SYSWAKEUPEVENT");&lt;br /&gt;&lt;br /&gt;if(RegisterClass(&amp;amp;wc) == NULL){&lt;br /&gt;    RETAILMSG(1,(TEXT("RegisterClass Failed\r\n")));&lt;br /&gt;    return -1;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;MainWnd = CreateWindowEx(WS_EX_NODRAG,TEXT("SYSWAKEUPEVENT"),TEXT("SYSWAKEUPEVENT"),&lt;br /&gt;                     WS_VISIBLE | WS_CAPTION | WS_SYSMENU,&lt;br /&gt;                     CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,&lt;br /&gt;                     NULL, NULL, hInstance, NULL);&lt;br /&gt;if(!IsWindow(MainWnd)){&lt;br /&gt;    RETAILMSG(1,(TEXT("CreateWindowsEx Failed\r\n")));&lt;br /&gt;    return -2;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;ShowWindow(MainWnd,nCmdShow);&lt;br /&gt;UpdateWindow(MainWnd);&lt;br /&gt;&lt;br /&gt;hWaiterThread = CreateThread(NULL,0,WaiterThread,NULL,0,NULL);&lt;br /&gt;if(hWaiterThread == NULL){&lt;br /&gt;    RETAILMSG(1,(TEXT("CreateThread Failed\r\n")));&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;while(GetMessage (&amp;amp;msg,NULL,0,0) ) {&lt;br /&gt;    TranslateMessage(&amp;amp;msg);&lt;br /&gt;    DispatchMessage(&amp;amp;msg);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;return msg.wParam;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; return 0;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;reference &lt;a href="http://social.msdn.microsoft.com/Forums/en-US/vssmartdevicesvbcs/thread/11c91a9f-9626-4db5-afaa-233ad514e6a3"&gt;這一個&lt;/a&gt; (http://social.msdn.microsoft.com/Forums/en-US/vssmartdevicesvbcs/thread/11c91a9f-9626-4db5-afaa-233ad514e6a3) 討論串。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2117270136732158310-3424014266417353293?l=realchecko.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://realchecko.blogspot.com/feeds/3424014266417353293/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2117270136732158310&amp;postID=3424014266417353293' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/3424014266417353293'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2117270136732158310/posts/default/3424014266417353293'/><link rel='alternate' type='text/html' href='http://realchecko.blogspot.com/2010/01/cerunappatevent.html' title='糟糕的： CeRunAppAtEvent'/><author><name>Checko</name><uri>http://www.blogger.com/profile/03239306354367907990</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photos1.blogger.com/blogger/669/302/320/IMGP0803.jpg'/></author><thr:total>1</thr:total></entry></feed>
