天天看點

WinCE下開發程式常見問題

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++智能裝置項目,解決方法如下: 

  1. Start RegEdit.exe
  2. Find the following registry entry:

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Ext\PreApproved

  3. Add a new entry and name it 

    {D245F352-3F45-4516-B1E6-04608DA126CC}

  4. Close RegEdit
  5. Start VS
  6. 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