日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

WinCE自啟動(dòng)Shell的問(wèn)題

系統(tǒng) 2405 0

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)意想不到的情況,如下圖所示:

WinCE自啟動(dòng)Shell的問(wè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 也能正常工作,如下圖所示:

WinCE自啟動(dòng)Shell的問(wèn)題

在實(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

http://files.cnblogs.com/we-hjb/WinCE_Shell.rar

WinCE自啟動(dòng)Shell的問(wèn)題


更多文章、技術(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ì)您有幫助就好】

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 晋城| 蓝田县| 叙永县| 靖西县| 于都县| 孝昌县| 广汉市| 临颍县| 上蔡县| 增城市| 金湖县| 大石桥市| 成安县| 天水市| 波密县| 田阳县| 贵溪市| 巴楚县| 蒙阴县| 平度市| 梁河县| 闽侯县| 扶绥县| 黔西县| 军事| 民权县| 六盘水市| 疏勒县| 密山市| 岳西县| 邵武市| 建宁县| 苏尼特右旗| 广昌县| 临朐县| 桓台县| 龙海市| 博乐市| 安吉县| 承德市| 息烽县|