使用PB建立一個wince image之前先要建立一個workspace來控制除OEM BSP之外的所有的image的屬性,包括的內容等等。這些內容主要是通過PB的catalog來管理的,通過PB的vIEwàcatalog打開的視窗,我們從全部的window ce的可選組件中選擇我們需要的加入到workspace中,這樣的話我們sysgen出來的image就具備了相應的功能。從catalog的視窗中,我們可以通過查詢任意一個組件的屬性來獲得它唯一對應的一個sysgen_開頭的變量。但是這些變量並不能直接用來在runtime的情況下用於判斷image具備哪些組件。在實際的運用中,AP可以#include一個名為“ceconfig.h”的頭文件,這個頭文件裡面都是類似”CE_MOULDLE_*** SHELL_MODULES_*** COREDLL_****”之類的宏定義,這些宏定義可以直接被AP用來判定image內是否具備其需要的一些組件,比如MFC,AYGSHELL等等。Ceconfig.h是在sysgen的階段自動由系統的批處理生成的,由於ceconfig.h的重要性,所以有必要搞清楚通過PB的catalog生成的sysgen_環境變量是如何和ceconfig.h內部的宏對應起來的。
首先從PB開發環境的OSDesignVIEw中修改的feature將直接反映到以sysgen_開頭的環境變量中,為了驗證有哪些sysgen_已經被設置,可以執行Build OSàOpen release directory進入命令行模式,然後執行“set sysgen”命令,就可以看到所有的sysgen_XXX的環境變量了。這些環境變量是屬於桌面Windows的,可以DOS下或是bat批處理文件中使用。由於DOS下的命令也是支持一些條件判斷語法,如IF ELSE等指令,所以利用DOS批處理文件就可以根據既有的環境變量做進一步的處理了。
現在來介紹微軟是如何利用bat批處理對sysgen_環境變量做轉換,變成cecongfig.h中的宏定義的。
首先來看cesysgen.bat,這個批處理文件每次在Build OsàSysgen的時候會被調用,其位於“D:\WINCE500\PUBLIC\CEBASE\OAK\MISC”(假設wince500安裝在D盤)。
在這個目錄下你可以看到很多bat文件:
D:\WINCE500\PUBLIC\CEBASE\OAK\MISC 的目錄
2004-07-01 12:00 744 cebase.bat
2007-10-31 11:25 7,362 cesysgen.bat
2004-07-01 12:00 3,743 datasync.bat
2004-07-01 12:00 6,081 dcom.bat
2004-07-01 12:00 26,594 directx.bat
2004-07-01 12:00 4,091 gdIEx.bat
2004-07-01 12:00 13,610 IE.bat
2004-10-15 07:15 2,841 netcf.bat
2006-05-04 13:48 9,245 netcfv2.bat
2004-07-01 12:00 5,133 rdp.bat
2004-07-01 12:00 2,632 script.bat
2004-07-01 12:00 20,954 servers.bat
2004-07-01 12:00 2,253 shell.bat
2004-07-01 12:00 1,721 shellsdk.bat
2004-07-01 12:00 1,136 speech.bat
2004-07-01 12:00 1,730 sqlce.bat
2005-12-15 02:20 1,762 sqlmobile.bat
2004-07-01 12:00 3,906 vIEwers.bat
2004-07-01 12:00 5,242 voip.bat
2004-07-01 12:00 3,025 wceaPPSfe.bat
2004-07-01 12:00 15,167 wceshellfe.bat
2006-08-31 15:26 100,533 winceos.bat
後面我們會知道,其他的bat批處理文件都會被cesysgen.bat調用到的。
調用“D:\WINCE500\PUBLIC\CEBASE\OAK\MISC >cesysgen report”的時候,你可以看到一些類似ceconfig.h中的宏定義的字符串:
Report:
SYSGEN_ASYNCMac=1
SYSGEN_AS_BASE=1
SYSGEN_AUDIO=1
…….. 省略
CE_MODULES=coredll nk msim commctrl commdlg rsaenh ….. 省略 (和ceconfig.h中的CE_MODULES_XXX一一對應——config.hmctrl commdlg rsaenh ...)
COREDLL_COMPONENTS=coremain lmem showerr thunks correct ….. 省略(和ceconfig.h中的COREDLL _XXX一一對應——config.hmctrl commdlg rsaenh ...)
…&hellip
這說明,在這個批處理裡面已經有了sysgen->宏定義的轉換了。
用ultraedit打開cesysgen.bat,跟蹤report參數,可以走到113行,看到下面的命令:
113 :doReport #標號
114 echo Report: #語句顯示Report
115 set SYSGEN #顯示所有的sysgen_環境變量
116 if "%__IN_BLD_RECURS%"=="1" set SYSGEN >%_WINCEROOT%\__BLD_RECURS_DEP.txt
117 set SYSGEN >%_WINCEROOT%\public\%_TGTPROJ%\__CEBASE_FEATURES.txt
117 for %%f in (%_DEPTREES%) do call :CallProjFile %%f report
主要看117行,這裡是一個for循環,f是變量,%_DEPTREES%是f可以取值的范圍,這個語句將%_DEPTREES%中的每個字符串作為參數傳遞給CallProjFile子函數(批處理標號)。為了了解%_DEPTREES%中有那些字符串,可以執行echo %_DEPTREES%,你會看到類似下面的一串字符:
winceos dcom gdiex ie script servers shellsdk shell rdp wceshellfe wceaPPSfe vIEwers directx voip datasync netcf SQLCE ostest speech NETCFV2 SQLMOBILE PROJECTNAME
基本上,上面的字符串和D:\WINCE500\PUBLIC\CEBASE\OAK\MISC目錄下的每一個bat文件是一一對應的。 而且大致可以看出,它們的名字就是wince所有組件歸類之後的組名。
跟蹤到:CallProjFile標號,大概在156行,有如下內容:
:CallProjFile
if not exist %__CESYSGEN_PATH%\%1.bat goto :CPF_NotCE
call %__CESYSGEN_PATH%\%1.bat %2 %3 %4 %5 %6 %7 %8 %9
goto :EOF
:CPF_NotCE
if not exist %_PUBLICROOT%\cebase\oak\misc\%1.bat goto :CPF_NotCE2
call %_PUBLICROOT%\cebase\oak\misc\%1.bat %2 %3 %4 %5 %6 %7 %8 %9
goto :EOF
:CPF_NotCE2
if not exist %_PUBLICROOT%\%1\cebasecesysgen.bat goto :CPF_Unknown
call %_PUBLICROOT%\%1\cebasecesysgen.bat %2 %3 %4 %5 %6 %7 %8 %9
goto :EOF
:CPF_Unknown
if /i "%___PUBLICPROJECT%"=="common" if "%_ECHOON%"=="1" echo WARNING: Unable to find project file %1, args %2 %3 %4 %5 %6 %7 %8 %9
goto :EOF
大致的功能就是到三個路徑去尋找 “參數1.bat“ 的批處理文件,如果找到並執行之,首先根據%_DEPTREES%可知,第一個參數是winceos,所以我們在D:\WINCE500\PUBLIC\CEBASE\OAK\MISC下面的winceos.bat會被執行。依次類推,dcom.bat gdiex.bat IE.bat script.bat servers.bat ….這些批處理會順序執行。
接下來就到了揭開謎底的時候了,打開winceos.bat. 你可以發現有很多類似
if "%SYSGEN_XXX%"=="1" set CE_MODULES=%CE_MODULES% YYY的語句,這XXX和YYY的對應關系就是sysgen_和ceconfig的宏定義之間的關系。
所以類似的,打開其他的.bat文件可以分析其他類別的XXXàYYY的對應了。
這樣你可以search到所有的,你想知道的對應關系。