WinCE下開發程式常見問題
一. wince中,如何根據程序名稱獲得該程序ID
DWORD GetProcessID(CString name)
{
HANDLE procSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if(procSnap == INVALID_HANDLE_VALUE)
{
printf("CreateToolhelp32Snapshot failed, %d ",GetLastError());
return NULL;
}
//
DWORDprocessid = NULL;
PROCESSENTRY32 procEntry = { 0 };
procEntry.dwSize = sizeof(PROCESSENTRY32);
BOOL bRet = Process32First(procSnap,&procEntry);
while(bRet)
{
if(name.Compare(procEntry.szExeFile)==0) //這裡做比較就可以了
{
processid = procEntry.th32ProcessID;
break;
}
bRet = Process32Next(procSnap, &procEntry);
}
CloseHandle(procSnap);
return processid;
}
加載toolhelp.dll和link裡面寫入toolhelp.lib,包含頭檔案 <tlhelp32.h>
二.關閉程序
// 擷取程序ID
DWORD dwProcessId = GetProcessID(_T("explorer.exe"));;
// 從程序ID打開程序句柄
if(dwProcessId==NULL)
return;
HANDLE handle=OpenProcess(0,FALSE,dwProcessId);
if(handle==NULL)
{
LPVOID lpMsgBuf;
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
GetLastError(),
0, // Default language
(LPTSTR) &lpMsgBuf,
0,
NULL);
// Process any inserts in lpMsgBuf.
// ...
// Display the string.
::MessageBox( NULL, (LPCTSTR)lpMsgBuf, L"Error", MB_OK | MB_ICONINFORMATION );
// Free the buffer.
LocalFree( lpMsgBuf );
return;
}
// 強制終止程序
if(handle!=NULL)
TerminateProcess(handle,0);
三.顯示關閉工作列
1.顯示
void ShowTaskBar()
{
HWND hwnd = ::FindWindow(_T("HHTaskBar"), NULL);
::ShowWindow(hwnd, SW_SHOW);
}
2.隐藏工作列
void HideTaskBar()
{
HWND hwnd = ::FindWindow(_T("HHTaskBar"), NULL);
::ShowWindow(hwnd, SW_HIDE);
}
四.打開和關閉資源浏覽器explorer.exe
1.打開explorer.exe,有以下2種方法
①CreateProcess
LPCTSTR strPath = _T("\\windows\\explorer.exe");
PROCESS_INFORMATION processInfo;
if(!CreateProcess(strPath,NULL,NULL,NULL,NULL,
CREATE_NEW_CONSOLE,NULL,NULL,NULL,
&processInfo))
{
return FALSE;
}
CloseHandle(processInfo.hThread);
CloseHandle(processInfo.hProcess);
②ShellExecuteEx
SHELLEXECUTEINFO shinfo;
memset(&shinfo, 0, sizeof(SHELLEXECUTEINFO));
shinfo.fMask = SEE_MASK_NOCLOSEPROCESS | SEE_MASK_FLAG_NO_UI;
shinfo.cbSize = sizeof(SHELLEXECUTEINFO);
shinfo.lpVerb = _T("Open");
shinfo.hwnd = NULL;
shinfo.lpFile = _T("\\windows\\explorer.exe");
shinfo.lpParameters = _T("");
shinfo.nShow = SW_SHOW;
BOOL bRet = ShellExecuteEx(&shinfo);
return bRet;
2.關閉explorer.exe
// 擷取程序ID
DWORD dwProcessId = GetProcessID(_T("explorer.exe"));
// 從程序ID打開程序句柄
if(dwProcessId==NULL)
return FALSE;
HANDLE handle=OpenProcess(PROCESS_ALL_ACCESS,FALSE,dwProcessId);
if(handle==NULL)
return FALSE;
// 強制終止程序
::TerminateProcess(handle, 0);
五.啟動微軟輸入法啊
//#include <Sipapi.h>
void CDialog::OnSetfocusEditmsg()
{
SipShowIM(SIPF_ON); //當焦點在編輯框時觸發軟鍵盤啟動
//SHSipPreference(hWnd, SIP_UP); //Pocket PC}
void CDialog::OnKillfocusEditmsg()
{
SipShowIM(SIPF_OFF);
//SHSipPreference(hWnd, SIP_FORCEDOWN); //Pocket PC
}
1. 枚舉輸入法
int SipEnumIM( IMENUMPROC pEnumIMProc);
int SipEnumIMProc( IMENUMINFO *pIMInfo);
struct_IMENUMINFO{
TCHAR szName[MAX_PATH];
CLSID clsid;
}IMENUMINFO;
2. 設定目前輸入法
BOOL SipSetCurrentIM(CLSID *pClsid);
六.WinCE中添加微軟拼音輸入法 MSPY3
1.添加相應元件
- GB18030 Data Converter SYSGEN_GB18030
- MSPY 3.0 for Windows CE SYSGEN_MSPY3_SC
·
-
- Double Spelling (Shuang Pin) soft keyboard - Large SYSGEN_SPIM_MSPY_LARGE (Option)
- Double Spelling (Shuang Pin) soft keyboard - Small SYSGEN_SPIM_MSPY(Option)
- MSPY 3.0 for Windows CE Database (Choose 1)
·
-
- 1.1 MB - Minimal Database SYSGEN_MSPY3_DB_1
- 1.3 MB - Compact Database SYSGEN_MSPY3_DB_3
- 1.7 MB - Standard Database SYSGEN_MSPY3_DB_7
2.系統資料庫
在Platform.reg中加入
; Simplified Chinese Intelligent IME (MSPY3)
[HKEY_CURRENT_USER/Keyboard Layout/Preload/1]
@="e0010804"
3.重新編譯後即加入微軟簡體中文輸入法3.0 MSPY3
七.字元型轉換成整型
wcstoi,wcstof, wcstol和wcstod
八.移動系統軟鍵盤位置
SIPINFO SipInfo;
memset(&SipInfo,0,sizeof(SIPINFO));
SipInfo.cbSize = sizeof( SipInfo );
BOOL bResult = SipGetInfo(&SipInfo);
if(bResult)
{
CRect rc;
GetDlgItem(IDC_PILEID)->GetWindowRect(rc);
CRect rc0(SipInfo.rcSipRect);
SipInfo.rcSipRect.left = rc.left;
SipInfo.rcSipRect.right = rc.left+rc0.Width();
SipInfo.rcSipRect.top = rc.bottom;
SipInfo.rcSipRect.bottom = rc.bottom+rc0.Height();
bResult = SipSetInfo(&SipInfo);
}
九.讓程式在Windows CE系統啟動時自動運作
①.讓程式在Windows CE系統啟動時自動運作(方法一)
1.假定Windows CE.NET目标工程目錄為E:/ SMDK2440,并且工程已經Build成功,
假定Windows CE.NET的應用程式為MyApp.exe并存放在本地硬碟 E 盤下;
2.修改MyWinCE工程的project.bib檔案,在MODULES添加如下内容:
MyApp.exe E:/MyApp.exe NK H
3.建立快捷方式檔案MyApp.lnk,檔案内容如下:
10#/Windows/MyApp.exe
MyApp.lnk檔案也放入E:/目錄下;
4.修改MyWinCE工程的project.bib檔案,在FILES 添加如下内容:
MyApp.lnk E:/MyApp.lnk NK H
5.修改MyWinCE工程的project.dat檔案,添加如下内容:
Directory("/Windows/Startup"):-File("MyApp.lnk","/Windows/MyApp.lnk")
8. Platform Builder IDE:【Build】->【Make Image】(記得千萬不要Build或者Rebuild)
9.成功後,得到的NK.bin(或NK.nb0)就包含了應用程式MyApp.exe和MyApp.lnk,當把相應的核心燒入開發闆MyApp程式就會在系統啟動時自動運作。
②關于系統程式的啟動順序(自啟動方法二)
采用這種方法的前提是你要啟動的應用程式已經編譯進了NK.nb0或者NK.bin中了。具體方法及說明如下:
platform.reg或者common.reg,在[HKEY_LOCAL_MACHINE/init]段添加如下類似内容:
"LaunchXX"="<你的程式>"
"DependXX"=hex:YY,ZZ,...
其中XX是十進制的數字,表示<你的程式>的啟動順序辨別;YY,ZZ是Least Significant的十六進制數字,表示<你的程式>所依賴(先于<你的程式>運作)的程式的啟動順序辨別。
來看兩個系統的例子:
[HKEY_LOCAL_MACHINE/init]
; @CESYSGEN IF CE_MODULES_SHELL
"Launch10"="shell.exe"
; @CESYSGEN ENDIF
IF IMGTINY !
; @CESYSGEN IF CE_MODULES_DEVICE
"Launch20"="device.exe"
; @CESYSGEN ENDIF
; @CESYSGEN IF CE_MODULES_GWES
IF NOGUI !
"Launch30"="gwes.exe"
"Depend30"=hex:14,00
ENDIF
Launch10、Launch20、Launch30表示了系統在啟動時會先加載“shell.exe”,然後再加載“device.exe”和”gwes.exe”,而且可以看到”gwes.exe”的啟動還有依賴“device.exe”,即隻有在“device.exe”完全啟動後“gwes.exe”才能啟動。如果我們要在系統啟動時候也啟動自己的程式可以像如下設定:
例如:
"Launch80"="MyApp.exe"
"Depend80"=hex:1E,00
語意為程式MyApp.exe的啟動順序辨別是80,它依賴辨別為30(即001E)的程式。
如果<你的程式>不依賴其他程式,那麼不需要添加"DependXX"=hex:YY,zz,...訓示;
如果<你的程式>依賴多個程式,那麼在"DependXX"訓示中指明;
eg.
"Launch80"="MyApp.exe"
"Depend80"=hex:0A,00,1E,00
語意為MyApp.exe程式的啟動依賴辨別為10和30的程式。注意Launch後面的數值不能和系統預設的某個程式的值一樣,不然在編譯的時候就會報錯。
修改完後隻要 PlatformBuilder IDE->Build->MakeImage,生成新的NK.bin就可以了,不用重新編譯。
③去掉系統啟動 explorer項
Windows CE.NET的桌面确實漂亮,但是如果我們的嵌入式系統使用微軟的桌面,總讓我感覺不倫不類。是以,要想個辦法,讓我們的程式開機啟動,把微軟的那個桌面給替換掉。其中使用startup的快捷方式再加上隐藏工作列的方法,效果非常的好,但是每次啟動的時候,總是微軟的桌面先出來,再啟動我們的程式,感覺還是不爽。
有一種方法如下:
1)首先建立工程,把你的應用程式放到核心裡面去(前面介紹了如何做);
2)編譯平台;
3)修改E:/SMDK2440/RelDir/SAMSUNG_SMDK2440_ARMV4IRelease/shell.reg的檔案 :
在檔案中有這樣一行:
[HKEY_LOCAL_MACHINE/init]
"Launch50"="explorer.exe"
"Depend50"=hex:14,00, 1e,00
把這個explorer.exe改成你的應用程式(比如:MyApp.exe)就可以了;
4) Platform Builder IDE:【Build】->【Make Image】(記得千萬不要Build或者Rebuild)否則就前功盡棄了。
5)成功後,得到的NK.bin(或NK.nb0)就包含了應用程式MyApp.exe和MyApp.lnk,當把相應的核心燒入開發闆MyApp程式就會在系統啟動時自動運作。
至此,随心所欲的讓自己的程式在Windows CE系統啟動時自動運作了。
原理說明:
1.将自定義的檔案打包進NK.bin中的方法有兩種
一種是編輯project.bib檔案。
在FILES Section描述檔案的名稱,源檔案的路徑,檔案在目标系統中的屬性。在上面,
MyApp.exe $(_FLATRELEASEDIR)/MyApp.exe NK H
表示将你所建工程如:E:/SMDK2440/RelDir/SAMSUNG_SMDK2440_ARMV4IRelease目錄下的檔案MyApp.exe檔案打包進NK.bin,并且此檔案将處在Kernel記憶體區,檔案屬性類型為隐藏。
第二種方法是添加User Feature。
PlatformBuilder IDE->FeatureView->在"MyWinCE Features"上Right Click滑鼠->Insert User Feature->指向想打包的檔案。
無論采用哪種打包方法,在啟動的Windows CE系統中,檔案都在/Windows目錄下。下一步就是根據需要重新組織檔案系統的目錄結構。
2.組織檔案系統的目錄結構的途徑在于修改project.dat檔案
添加檔案目錄結構的描述。描述的文法如下:
root:-Directory("<目錄名>") 表示在root目錄(/)下建立目錄
Directory("/<目錄名>"):-Directory("<子目錄名>") 表示在指定目錄下建立子目錄
Directory("/("<目錄名>/<子目錄名>"):-File("<檔案名>.<擴充名>","/Windows/<檔案名>.<擴充名>") 表示在指定目錄下建立/Windows目錄下檔案的拷貝,顯示名稱是<檔案名>.<擴充名>。
3.應用程式并不一定需要打包進NK.bin
假定程式在硬碟的某個位置,如/硬碟/MyApp/MyApp.exe,那麼隻需建立快捷方式檔案,連結指向/硬碟/MyApp/MyApp.exe就是了。
整個過程簡單來說就是,想清楚應用程式将會出現在哪個目錄下,建立正确的快捷方式檔案,修改目标系統目錄組織配置,最後将應用程式和相應的快捷方式檔案打包進NK.bin。
十.freepCE--移植的winCE下的中文輸入法源代碼http://blog.csdn.net/backstrokefish/archive/2006/11/04/1365873.aspx
一.下載下傳位址:
1.項目首頁 http://gforge.osdn.net.cn/projects/freepyce
可以用:svn checkouthttp://gforge.osdn.net.cn/svn/freepyce獲得最新的源碼。
2.驅動開發網http://bbs.driverdevelop.com/htm_data/48/0610/118681.html
二安裝及調試說明
1.用ActiveSync連接配接系統嵌入式闆。
用Remote Register Editor連接配接系統嵌入式闆的系統資料庫:
找到HKEY_LOCAL_MACHINE/System/CurrentControlSet/Control/Layouts/e0010804修改,把Ime File鍵值從chsime03.dll改為freepy.dll。
2.拷貝library目錄下的詞庫檔案freepy.tab,freepysys.dic到嵌入式闆/Windows目錄下
3.用EVC下載下傳工程到嵌入式闆/Windows目錄下,設定斷點可以調試。
十一.CEdit編輯框中輸入中文不彈出中文輸入面闆
設定CEdit的屬性Multiline。
關閉explorer.exe浏覽器軟體。
十二. WinCE裝置盤符的修改
HKEY_LOCAL_MACHINE/System/StorageManager/Profiles
十三.Sysgen出錯
wzctool.lib(wzctool.obj) : error LNK2019: unresolved external symbol _WZCDeleteIntfObjEx referenced in function "void __cdecl DoQueryCache(unsigned short *)" (?DoQueryCache@@[email protected])
wzctool.lib(wzctool.obj) : error LNK2019: unresolved external symbol _WZCQueryInterfaceEx referenced in function "void __cdecl DoQueryCache(unsigned short *)" (?DoQueryCache@@[email protected])
wzctool.lib(wzctool.obj) : error LNK2019: unresolved external symbol _WZCSetInterfaceEx referenced in function "void __cdecl AddToPreferredNetworkList(unsigned short *,struct WZC_WLAN_CONFIG &,unsigned short *)" (?AddToPreferredNetworkList@@YAXPAGAAUWZC_WLAN_CONFIG@@[email protected])
wzctool.lib(wzctool.obj) : error LNK2019: unresolved external symbol _WZCRefreshInterfaceEx referenced in function "void __cdecl DoRefreshWzc(int,unsigned short * * const)" (?DoRefreshWzc@@[email protected])
C:/WINCE500/PBWorkspaces/cn_simu/WINCE500/Emulator_x86/cesysgen/oak/target/x86/retail/wzctool.exe : fatal error LNK1120: 4 unresolved externals
NMAKE : fatal error U1077: 'link' : return code '0x460'
Stop.
NMAKE : fatal error U1077: 'C:/WINCE500/sdk/bin/i386/nmake.exe' : return code '0x2'
Stop.
去掉Wireless的元件即可。
十四、Makeimg Error with E32 type Images
把編譯出錯的檔案從project.bib的MODULES段移到FILES段即可解決該問題。
FILES
; Name Path Memory Type
; -------------- --------------------------------------------- -----------
十五、去除explorer界面WINCE LOGO下有行WINCE版本資訊
修改如下:
在檔案C:/WINCE500/PUBLIC/SHELL/OAK/HPC/CESHELL/UI/desktopview.cpp中屏蔽以下這些代碼
十六、PB5.0試用期過期的破解方法
"在PB安裝目錄下有個C:/Program Files/Windows CE Platform Builder/5.00/etkremov.inf,試用期是以此檔案的建立日期來計算的。将其删除,然後在其他目錄建立一個檔案,再重命名為etkremov.inf,再拷貝過來,不要直接建立這個檔案,否則由于filesystem tunnel,會導緻建立的檔案總是沿用老檔案的建立時間。
十七、“無法顯示microsoft文檔資料總管,因為指定的幫助集合“ms-help://ms.msdnqtr.v90.chs”無效”
不是因為msdn出現問題,而是因為系統關于幫助檔案.chm檔案出現錯誤,windows中打開chm檔案的程式是”hh.exe“,但是負責建立幫助檔案全文檢索的是以下幾個元件,隻要重新注冊這幾個元件,就可以使用msdn了。其他的一切關于系統資料庫的說法都不管用。解決方法:在開始菜單-->運作裡運作:
regsvr32 hhctrl.ocx
regsvr32 itss.dll
regsvr32 itircl.dll
十八、VS2005編譯動态庫失敗,去掉預處理器定義宏_USRDLL即可
1>mfcs80u.lib(dllmodul.obj) : error LNK2005: _DllMain已經在Keyboard.obj中定義
1>mfcs80u.lib(oleexp.obj) : error LNK2005: _DllGetClassObject已經在Keyboard.obj中定義
1> mfcs80u.lib(oleexp.obj) : error LNK2005: _DllCanUnloadNow已經在Keyboard.obj中定義
十九、關于如何在WIN7下運作PB5
做一個bat 批處理
@ehco
start cepb.exe
exit
@ehco
并放到\Windows CE Platform Builder\5.00\CEPB\BIN\ 下,輕按兩下來運作PB5
二十、“無法顯示microsoft文檔資料總管,因為指定的幫助集合“ms-help://ms.msdnqtr.v90.chs”無效”
不是因為msdn出現問題,而是因為系統關于幫助檔案.chm檔案出現錯誤,windows中打開chm檔案的程式是”hh.exe“,但是負責建立幫助檔案全文檢索的是以下幾個元件,隻要重新注冊這幾個元件,就可以使用msdn了。其他的一切關于系統資料庫的說法都不管用。解決方法:在開始菜單-->運作裡運作:
regsvr32 hhctrl.ocx
regsvr32 itss.dll
regsvr32 itircl.dll
二十一、使用Visul Studio 2005開發VC++智能裝置應用程式,如果你的浏覽器是IE7.0,如果發生無法建立VC++智能裝置項目,解決方法如下:
- Start RegEdit.exe
-
Find the following registry entry:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Ext\PreApproved
-
Add a new entry and name it
{D245F352-3F45-4516-B1E6-04608DA126CC}
- Close RegEdit
- Start VS
- Try and create a Smart Device C++ project
二十二、在VS2005中建立或打開“智能裝置”項目時,提示以下錯誤: “從使用者資料存儲中檢索資訊時出錯。系統未找到指定的對象。” 和 “由于資料存儲中不存在項目引用的裝置平台,是以無法打開項目。”
在打開VS2005的”工具“-”裝置仿真器管理器“時,提示以下錯誤: ”未能正确加載包“Smart Device Configuration Package”( GUID = {D245F354-3F45-4516-B1E6-04608DA126CC} )。請與包供應商聯系以獲得幫助。由于可能會發生環境損壞,建議重新啟動應用程式。要禁止将來加載此包嗎? 可以使用“devenv /resetskippkgs”重新啟用包加載。“
解決方法如下: 1. 關閉VS2005 2. 重命名檔案夾"c:\Documents and Settings\<user>\Local Settings\Application Data\Microsoft\CoreCon\1.0",這将删除所有關于裝置配置屬性的定制, 3. 重新開機VS2005,重建上述配置。
二十三、IP位址設定
[HKEY_LOCAL_MACHINE\Comm\PCI\R60401\Parms\TcpIp]
"EnableDHCP"=dword:0
"DefaultGateway"="192.168.0.1"
"UseZeroBroadcast"=dword:0
"IpAddress"="192.168.0.178"
"Subnetmask"="255.255.255.0"
二十四、FAT32的U盤識别速度慢
WinCE5更新檔網站: http://www.microsoft.com/windowsembedded/en-us/downloads/download-windows-embedded-ce-5.aspx