如何修改Windows CE的平臺類型(下)
如果使用SPI_GETOEMINFO參數,我們可以獲得OEM信息,如果返回字符串中包括“Microsoft DeviceEmulator”,則表示當前應用程序運行在模擬器中。
CheckPlatform 程序編譯好后,會自動加入到NK.bin 中。我們可以通過Command Shell,運行應用程序。調用Attach Device啟動Windows CE操作系統后,選擇Target菜單中的Target Control(快捷鍵Alt+1),輸入”s chekplatform”,就可以運行CheckPlatform程序。
好了,***看一下運行結果:
修改操作系統的類型
上面的話題其實很多文章都討論過了。但是在實際工作中,我們會遇到一些平臺遷移的工作。我們會首先將 Windows Mobile的軟件在Windows CE上運行,以驗證功能。不過有些軟件檢測了操作系統類型,在不修改軟件代碼的情況下,我們是否可以在Windows CE上運行檢測平臺類型的應用程序呢?
Windows CE操作系統的Platform Type類型值是在BSP中被指定的,我們可以通過修改BSP中的Platform Type來改變系統的Platform Type。注意:這種情況只能出現在測試時,不應該修改實際產品的平臺類型,否則會引起很多安全性的問題。
我們打開Windows CE 6.0 R2的源代碼,位置在:
x:\WINCE600\PLATFORM\DEVICEEMULATOR\SRC\INC
我們修改的是DEVICEEMULATOR的代碼,如果是其他平臺的代碼,則去相應BSP文件夾中的指定位置。在BSP的INC文件夾中,我們會找到一個ioctl_cfg.h文件。
在ioctl_cfg.h文件中,我們會找到下面的代碼:
- #if defined( project_smartfon )
- #define IOCTL_PLATFORM_TYPE (L"SmartPhone\0")
- #elif defined( project_wpc )
- #define IOCTL_PLATFORM_TYPE (L"PocketPC\0SSDK\0")
- #else
- #define IOCTL_PLATFORM_TYPE (L"DeviceEmulator")
- #endif
- #define IOCTL_PLATFORM_OEM (L"Microsoft DeviceEmulator")
Device Emulator的BSP通過編譯選項區分了不同的平臺類型,如果是Windows CE系統,則Platform Type為DeviceEmulator。好了,我們可以通過修改IOCTL_PLATFORM_TYPE的值,來“欺騙”操作系統,讓應用程序認為自己運行在Pocket PC或Smartphone上。注意:因為Windows Mobile和Windows CE的函數庫存在巨大差異,Windows Mobile的應用程序在Windows CE上未必能夠直接運行。
修改IOCTL_PLATFORM_TYPE之后,我們需要重新編譯BSP,才能夠完成Platform Type的修改。在Build菜單中選擇Advanced Build Commands中的Rebuild Current BSP and Subprojects。
我們可以編譯BSP和Subporject后,調用BuildRel和Makeimg生成新的NK.bin。這樣,我們就可以節省大量的重新編譯的時間。在我的機器上大概幾分鐘就完成了BSP的編譯,如果是重新Build操作系統的話,需要二十分鐘左右。
NK編譯成功后,選擇Attach Device,重新運行系統和CheckPlatform程序,會得到下面的運行結果:
***還需要提示一下,這種方法只對通過SystemParametersInfo API檢測Platform Type的應用程序有效。如果軟件使用了其他方法檢測Platform Type的話,那就需要具體問題具體分析了。
更多關于Windows Embedded CE開發的文章,請參考“Windows Embedded CE 中國研發團隊”的中文博客:http://blogs.msdn.com/wincechina/
【編輯推薦】