WinCE 開(kāi)機(jī)即運(yùn)行定制的 Shell 是很多系統(tǒng)的基本要求,有時(shí)還需要屏蔽 WinCE 自帶的 Shell 。 WinCE 中程序的自啟動(dòng),一般有兩個(gè)實(shí)現(xiàn)方法,修改注冊(cè)表和添加自啟動(dòng)快捷方式。修改注冊(cè)表比較方便,如下:
[HKEY_LOCAL_MACHINE/init]
"Launch70"="MyApp.exe"
"Depend70"=hex:14,00,1e,00
只要將 MyApp.exe 打包到 NK ,并在 platform.reg 中加入上面的注冊(cè)表信息,這樣 WinCE 啟動(dòng)時(shí)便會(huì)自動(dòng)運(yùn)行該程序。但這時(shí) WinCE 自帶的 Shell 總是先出來(lái),然后才運(yùn)行 MyApp.exe ,為了避免這種情況,我們可以將注冊(cè)表設(shè)置修改如下:
[HKEY_LOCAL_MACHINE/init]
"Launch50"="MyApp.exe"
"Depend50"=hex:14,00,1e,00
即將原來(lái)啟動(dòng) explorer.exe 的值換為 MyApp.exe 。這樣 WinCE 啟動(dòng)時(shí)直接進(jìn)入定制的 Shell ,而不啟動(dòng) explorer.exe 。但這時(shí)有可能引入了新問(wèn)題,如果定制的 Shell 是基于 MFC 編寫(xiě)的,并且其中用到了如 CFileDialog 等類(lèi)庫(kù)時(shí),就會(huì)出現(xiàn)意想不到的情況,如下圖所示:
上圖是在不啟動(dòng) Explorer.exe 時(shí),嘗試導(dǎo)入注冊(cè)表文件出現(xiàn)的狀況截圖,而在啟動(dòng) explorer.exe 時(shí)是沒(méi)有問(wèn)題的。這說(shuō)明 CFileDialog 在某種程度上依賴(lài)于 explorer.exe ,具體細(xì)節(jié)沒(méi)研究。但說(shuō)明不啟動(dòng) explorer.exe ,基于 MFC 的 Shell 運(yùn)行時(shí)就可能會(huì)出問(wèn)題。所以 explorer.exe 必須啟動(dòng),但又不能出現(xiàn) WinCE 界面。要解決這個(gè)問(wèn)題自然就想到修改 explorer.exe 了。 WinCE5.0 和 WinCE6.0 中,這一部分的代碼都是公開(kāi)的,在 WinCE6.0 中 Shell 的相關(guān)代碼在 C:/WINCE600/PUBLIC/SHELL/OAK/HPC/EXPLORER/MAIN 目錄下。
大致看了一下這一部分的代碼,發(fā)現(xiàn)只需修改如下兩個(gè)文件,就應(yīng)該能實(shí)現(xiàn)需求。
C:/WINCE600/PUBLIC/SHELL/OAK/HPC/EXPLORER/MAIN/desktop.cpp

bool CDesktopWnd::Create()
{
IShellFolder *pSHF;
FOLDERSETTINGS fs;
RECT rc;
HRESULT hr = E_FAIL;
// Get a shell folder for the desktop
hr = SHGetDesktopFolder( &pSHF );
if(hr || !pSHF)
goto Cleanup;
// create a shell view for it
hr = pSHF->CreateViewObject(NULL, IID_IShellView, (LPVOID *) &_psv );
if(hr || !_psv)
goto Cleanup;
fs.ViewMode = FVM_ICON;
fs.fFlags = FWF_DESKTOP | FWF_ALIGNLEFT | FWF_NOSCROLL;
//++changed by hjb
//將Desktop的窗口大小設(shè)為0
//SetRect( &rc , 0, 0, GetSystemMetrics(SM_CXVIRTUALSCREEN), GetSystemMetrics(SM_CYVIRTUALSCREEN));
SetRect( &rc , 0, 0, 0, 0);
//--changed by hjb
// create the desktop's view window (no need to AddRef since CreateViewWindow does it)
hr = _psv->CreateViewWindow(NULL, &fs , (IShellBrowser *)this, &rc , &_hWnd );
if(hr || !_hWnd)
{
Release();
goto Cleanup;
}
RegisterDesktop(_hWnd);
Cleanup:
if(pSHF)
pSHF->Release();
return (hr == S_OK);
}
C:/WINCE600/PUBLIC/SHELL/OAK/HPC/EXPLORER/MAIN/explorer.cpp

DWORD WINAPI CreateTaskBar(LPVOID pEvent)
{
HANDLE hSyncEvent = *((HANDLE *) pEvent);
CTaskBar *pTaskBar = NULL;
HWND hwndTB = NULL;
pTaskBar = new CTaskBar;
//++added by hjb
//在創(chuàng)建任務(wù)欄時(shí)強(qiáng)制終止
if(pTaskBar)
{
delete pTaskBar;
SetEvent(hSyncEvent);
return 0;
}
//--added by hjb
if(!pTaskBar)
{
SetEvent(hSyncEvent);
return 0;
}
g_TaskBar = pTaskBar;
if(!pTaskBar->Register(g_hInstance))
{
g_TaskBar = NULL;
delete pTaskBar;
SetEvent(hSyncEvent);
return 0;
}
RegisterTaskBar(pTaskBar->GetWindow());
SetEvent(hSyncEvent);
DWORD dwRet = pTaskBar->MessageLoop();
delete pTaskBar;
return dwRet;
}
修改完這兩處后,先編譯該目錄,然后再重新編譯整個(gè)系統(tǒng) ( 執(zhí)行 Sysgen) 應(yīng)該就可以了。 Explorer.exe 依然啟動(dòng),依然可以聽(tīng)到 WinCE 啟動(dòng)的聲音,但 WinCE 的界面已經(jīng)屏蔽掉了。此時(shí),基于 MFC 的 Shell 也能正常工作,如下圖所示:
在實(shí)際操作時(shí),我沒(méi)有通過(guò)修改源代碼編譯來(lái)完成這個(gè)測(cè)試。因?yàn)樵诰幾g C:/WINCE600/PUBLIC/SHELL/OAK/HPC/EXPLORER/MAIN 目錄時(shí),發(fā)現(xiàn)它只生成了 explorer.lib 。考慮到重新編譯整個(gè)系統(tǒng)的時(shí)間太長(zhǎng),所以直接修改了工程目錄下的 explorer.exe 的文件, MakeImg 后測(cè)試的。這里應(yīng)該有快速編譯的方法,但目前不知怎么弄。
修改后,在 WinCE6.0 的模擬器中測(cè)試,達(dá)到了預(yù)想的效果。這樣就大概解決了基于 MFC 的 Shell 和 Explorer.exe 之間的矛盾,是不是有隱患還不清楚,目前看來(lái)沒(méi)問(wèn)題。
另外需要注意,修改 public 和 private 目錄下的文件時(shí),一定先做好備份,以免后患。
修改后的 WinCE6.0 的 explorer.exe 及演示視頻的下載地址 :
http://www.cnblogs.com/we-hjb/archive/2008/12/28/1364070.html
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
