Wince下定制开机自启动程序
Wince下定制開機自啟動程序
上網查了一下,發現相關的貼子還真是不少. 最近因公司的項目需要,我做了個簡單的程序則試該功能. 用網上的很多方法發現是行不通的, 估計最初應該是可以用的, 然后大家都是互相轉載, 轉來轉去有些東西漏了或轉錯了,因為很少有人真正去測試過,看到就直接轉. 我在這里根據自己的實際測試,整理出整個過程,并對一些步驟的原理做了解釋
假設應用程序為:
方法一:主要思想:將應用程序及其快捷方式也添加到映像里,再將快捷方式添加到StartUp目錄下,這樣當系統運行后應用程序就能自動運行。這種方法不能覆蓋wince的桌面, 只是開機的時候加載一個應用程序啟動.
步驟:
1先保證原工程文件是可以編譯成功的。 并且內核映像是可以運行的.
2創建快捷方式文件,文件內容如下: 10#”\Windows\”(注意引號一定要) 其中草藥10表示#后所有字符的個數,包括引號, 要根據自己的應用程序的名字修改. (試過這個數字即使不是#后的字符的個數也可以正常啟動, 這個我就搞不懂了)把該文件和復制到xxx_Relase所在的目錄(所在目錄).
3在pb中修改文件,在FILES Section添加(FILES區哉可以包含不是就地執行的可執行文件):?????? $(_FLATRELEASEDIR)\ NK H?????? $(_FLATRELEASEDIR)\? NK H (注:$(_FLATRELEASEDIR)表示xxx_Relase文件夾;NK后面的H表明加入到中的文件為隱藏屬性)
4 把快捷方式添加到StartUp目錄下,具體為:修改工程的文件,添加如下內容: Directory("\Windows\Startup"):-File("","\Windows\") 由于wince ROM 映像默認將所有文件放到windows目錄下, 某些文件在系統引導時必須被移動到特定的位置, .dat文件可以實現移動的功能. 比如上面就是把位于windows下的移動到windows\startup下面. Startup目錄決定了程序可以自啟動.
5進入build os 菜單, 選擇build and sysgen(clean before buiding要打勾),編譯完成,會有錯誤提示你未在你的磁盤上找到(因為我們在編譯的時候選擇了clean before building,原來放在xxx_Relase目錄下的文件都被clean了) . 這時把和文件重新拷貝到xxx_Relase文件夾下,然后MakeImage一下. 這樣就把應用程序寫進了內核(會在windows目錄下). 把生成的或燒寫到flash里,這樣就可以看到你的應用程序自啟動了. 到這里可能有人會問, 既然和編譯的時候會被clean掉,第二步不就可以不用先復制,而到第五步時再復制過來? 這個問題我也想過,但實際測試發現這樣的話并沒有把和兩個文件寫進內核(系統啟動后,windows下找不到). Bib文件和dat文件都是在make image階段在用到的,沒理由會出現這個問題. 這個問題一直想不通,希望高手解答.
方法二:將應用程序添加到映像里,然后用你的應用程序直接替換Wince的桌面程序,這種方法其實就是自己的應用程序做為wince的shell
步驟:
1. 首先執行方法一的1~3步把應用程序燒進內核.
2. 進入build os 菜單, 選擇build and sysgen(clean before buiding要打勾,這里不打勾有時會出現編譯的內核不能運行),編譯完成,會有錯誤提示你未在你的磁盤上找到(因為我們在編譯的時候選擇了clean before building,原來放在xxx_Relase目錄下的文件都被clean了) . 這時把和文件重新拷貝到xxx_Relase文件夾下, 然后修改(若在pb里找不到,可以到xxx_Relase文件夾下找):[HKEY_LOCAL_MACHINE\init]"Launch50"="""Depend50"=hex:14,00, 1e,00把這個改成你的應用程序(比如:)。當wince系統啟動時, 它會順序執行launchxx, xx是一個十進制數, dependxx指出在當前應用程序運行之前launch20(十六進制是14),lanuch30(十六進制是1e)必須先運行. 打開可以看到. Lanuch20對應的是, launch30對應的是. 我們自己的shell應該在這兩個進程加載完成之后才能正常運行. 另外,wince幫助文檔里有一段話: This function must be called by all applications that the kernel starts at startup through the HKEY_LOCAL_MACHINE\Init registry key.
看來我們的源程序里應該加上signalStarted函數了. 對于mfc的程序我們可以在initinstance的return 以前. 加上這行代碼SignalStarted(_wtol(GetCommandLine())); 其實如果一個應用程序要從init里加載,那么肯定有一個unicode字符串作為命令行參數,這個參數被轉化為整型后傳給signalStarted函數. 通過這種方式通知操作系統它本身運行完畢. 建議任何通過init啟動的應用程序都應該加上signalStarted函數.
3. MakeImage一下, 把生成的燒寫到flash里,這樣就可以看到你的應用程序自啟動了.? 而且wince的桌面程序都不會啟動了,你的程序就是wince的shell,但有個問題,就是當你把應用程序關閉的時候由于原wince桌面程序的丟失而會使機器死機。
方法三:主要思想:將應用程序添加到映像里,然后修改注冊表,讓應用程序自啟動。這回不替換wince的桌面程序,而是讓wince像加載桌面一樣加載你的應用程序,效果跟方法一是一樣的。
跟方法二是一樣的,稍有不同:在文件中[HKEY_LOCAL_MACHINE\init]之下添加如下語句:"Launch80"="" "Depend80"=hex:1E,00跟方法2的區別是沒有換掉.
當然,前面三個方法的前提肯定是你的這個程序,在當前的PB工程編譯的內核里有可以正常運行的. 這一句看起來是廢話,其實很重要. 我這在調試的時候,一度程序不能啟動, 我一直認為是注冊表或bib文件出錯了, 調了很久都不行. 最后才發現,我這個應用程序是在之前的SDK下編譯的, 在當前的系統一根本不能運行. 于是我又在可用的系統下重新編譯了一個新的SDK, 問題解決.
轉載于:https://www.cnblogs.com/xilentz/archive/2010/04/22/1717848.html
總結
以上是生活随笔為你收集整理的Wince下定制开机自启动程序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 由oschina.neT了解到博客备份的
- 下一篇: 我们工作到底为了什么?