6.29.2010

The master makefile of Windows CE

真是太感謝 Kun-Yi 啦!

從我進來這裡,RBT 就展示他sysgen XXX 的能力,讓我門少build 一些 code,少浪費一些時間。
但是我問他,怎麼知道 改 OOO 時要用 XXX ?
他也說不出個所以然來
不然就是他不願意說...
所以我就不斷的在找這個謎.....(找了好幾年..)

後來,上一篇,偉大而又無私的 資深 Windows CE 專家 Kun-Ki 直接給出答案:
就是 PUBLIC\COMMON\CESYSGEN\makefile

打開來看,果然有所有 target 的 name 和 dependency..

真是令人感動!!

終於看到 CE 的 master makefile ....

6.28.2010

output message on device on/off - sysgen and private

在查 system poweron/off 時,有時要列印出所以 driver 的 on/off message。
一個一個加很麻煩,可以直接在 device manger 加:
C:\WinCE600\PRIVATE\WINCEOS\COREOS\DEVICE\DEVCORE\Devapi.c
裡面的 DevMgrPowerOffHandler:
原來的
                DEBUGMSG(ZONE_PNP,(TEXT("Calling \'%s\' PowerDown at 0x%x\r\n"),
改為強制輸出的 RETAILMSG 就可以。


在該 folder build 完後,下 sysgen -p common devmgr 後,就可以makeimg 了。



-p common 的意思是 "在 wince600\public\common 下"
-p option 好像是指 public 下的 folder。
所以 sysgen -p common devmgr 的意思是要 sysgen public\common\ 下的 devmgr
-- 雖然不知道怎麼看出common folder 里有 devmgr 這個 target @_@..

可以測試一下:
sysgen -p directx 會 build 出 public\direct 下所有的 directx example
如果只要 build mosquito:
sysgen -p directx mosquito



sysgen 也是一個 batch 檔...

只是我一直找不到那些 sysgen 的 "target" 到底在哪裡...

關於 sysgen 的target ..大概可以到 retail folder 去找,, dll 或是 exe。
用 cesysgen_capture,會產生 該 project 的 sources file,然後去找該 target 是由哪些
library build 出來的。
cesysgen_capture -p common devmgr 
會產生一個 sources.devmgr

sysgen_capture device

會產生一堆 (相依?) 的 source 檔:
  • sources.ceddk -- ceddk.lib
  • sources.devmgr -- devmgr.lib
  • sources.pm -- pm.lib
  • sources.udevice -- udevice.exe
  • sources.device -- device.exe

6.24.2010

operator overwrite : conversion function

在WTL 的source code 看到:
operator HBITMAP() const { return m_hBitmap; }
所以不知道是哪一個 operator 被 overwrite。

有 HBITMAP 這個 operator 嗎?

的確,就是 conversion function

自動型別轉換.
CBitmap theBitmap;
HBITMAP hBitmap;

hBitmap = theBitmap; // 等於是 hBitmap = (HBITMAP)theBitmap;

這個就是 conversion
上面的 example 會讓 hBitmap = theBitmap.m_hBitmap;

... 好像也是為了好看...好吧,還有方便..

smart_ptr in WTL CBitmap

看到 WTL 的 AtlCopyBitmap ( ) 中,有:
CBitmap bmNew = NULL;
..
bmNew.CreateCompatibleBitmap( ..
覺得很奇怪。
所以看一下 CBitmap 的 implement (在 atlgdi.h),, 有這一段:
CBitmapT<t_bManaged>& operator =(HBITMAP hBitmap)
{
Attach(hBitmap);
return *this;
}

void Attach(HBITMAP hBitmap)
{
if(t_bManaged && m_hBitmap != NULL&& m_hBitmap != hBitmap)
::DeleteObject(m_hBitmap);
m_hBitmap = hBitmap;
}

HBITMAP Detach()
{
HBITMAP hBitmap = m_hBitmap;
m_hBitmap = NULL;
return hBitmap;
}

所以是 CBitmap overwrite 了 operator "="
配合 attach, detach 來看,這有點像 smart_ptr 的作法。... 雖然他是handle wrapper,不是 pointer wrapper..

typedef CBitmapT CBitmap;
true 代表 memory management 由 class 自己 handle。


所以那個 CBitmap bmNew = NULL 代表將 bmNew 的 member m_hBitmap 設為 NULL。
這應該只是為了好看吧..否則寫兩行也可以呀:
CBitmap bmNew;
bmNew.m_hBitmap = NULL;

6.23.2010

GDI - SelectObject

DC (Device Context) 是畫布
一堆 GDI 物件:Pen, Brush, Font, Bitmap, ..都是可以畫在畫布(DC)上的物件。


所以要用這些 GDI 畫圖時,要用 SelectObject(DC_A,Object_A) ,告訴kernel 我要 DC_A上用Object_A 畫圖了。

SelectObject( ) 會傳回那個 DC 原來的 Object 內容,讓你畫完後,可以 Select 回來原來物件。
例如原來是 12 點字,後來用 14 點字寫幾個字後,選回原來的 12點字


... 希望這個想法可以用....

6.17.2010

show progress bar when booting - CE

這一篇 說道如何作 開機動畫。

他的作法是在 CE driver 中作,他選 backlight driver。
-- 應該要把 backlight driver 放在前面一點。

在 backlight driver 啟動(Init or PowerOn ?)的時候 create 一個 thread,定時的 update lcd buffer。一直到 Stopflash 的 event 送達。

Stop event 可以由 shell 送出。代表開機完成了。


問題: Driver PowerUp/Down 時好像是 single thread,可以create thread 嗎?

auto_ptr

auto_ptr 是 smart_ptr 的一種。

利用 auto variable 在離開 scope 會自動被 delete 的特性。
讓 一般的 pointer variable 在 new object 後,也有這樣的特性。
這樣,就不必特地在 function return 前 手動 call delete 了。

參考 http://ootips.org/yonat/4dev/smart-pointers.html

原來 pointer 的寫法:
void foo()
{
MyClass* p(new MyClass);
p->DoSomething();
delete p;
}

改用 auto_ptr 後,可以這樣寫:
void foo()
{
auto_ptr<MyClass> p(new MyClass);
p->DoSomething();
}

針對 memory 管理這一點,auto_ptr 還提供一些其他的功能:
  • 指定;當一個 ptr = 另一個 ptr,原來 ptr 的 object 會先 delete 掉。
  • exception handling : 在所有動作作try-catch,這樣當 exception 時,還可以正常 free 掉 object