WinCE下开发程序常见问题

11 篇文章 0 订阅

一. 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.dlllink里面写入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.tabfreepysys.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@@YAXPAG@Z) 
wzctool.lib(wzctool.obj) : error LNK2019: unresolved external symbol _WZCQueryInterfaceEx referenced in function "void __cdecl DoQueryCache(unsigned short *)" (?DoQueryCache@@YAXPAG@Z)
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@@0@Z)
wzctool.lib(wzctool.obj) : error LNK2019: unresolved external symbol _WZCRefreshInterfaceEx referenced in function "void __cdecl DoRefreshWzc(int,unsigned short * * const)" (?DoRefreshWzc@@YAXHQAPAG@Z)
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.bibMODULES段移到FILES段即可解决该问题。

FILES

; Name            Path                                          Memory Type

; --------------  --------------------------------------------- -----------

 

十五、去除explorer界面WINCE LOGO下有行WINCE版本信息

修改如下:

在文件C:/WINCE500/PUBLIC/SHELL/OAK/HPC/CESHELL/UI/desktopview.cpp中屏蔽以下这些代码

/*  #ifndef SHIP_BUILD

  WCHAR wszVersion[256];

  OSVERSIONINFO VerInfo;

  VerInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);

 

  ::GetVersionEx(&VerInfo);

  ::wsprintf(wszVersion, L"Microsoft Windows CE v%d.%02d (Build %d on %s) ",

             VerInfo.dwMajorVersion, VerInfo.dwMinorVersion, VerInfo.dwBuildNumber, TEXT(__DATE__));

  if (m_hbmpDesktop && !fTileBackgroundImage)

  {

    rc.top = rcBlt.bottom + 5;

  }

  else

  {

    rc.top = rc.top + (rc.bottom - rc.top) / 2 - 8;

  }

  ::DrawText(hdc, wszVersion, -1, &rc, DT_SINGLELINE | DT_CENTER | DT_TOP);

  #endif*/

 

十六、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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值