Hu’s Blog

Just a blog

Archive for the ‘Windows CE’ Category

替换 Windows CE 的桌面

Thursday, March 13th, 2008
  1. 将自己写的程序拷贝到生成平台目录,如:拷贝 Myshell.exe 到
    D:\WINCE500\PBWorkspaces\SHELL_demo\RelDir\Emulator_x86_Release 下
  2. 修改 bib 文件,使程序加入到 最后生成的 bin中
  3. Platform Builder 5.0 下点击菜单 “Build OS” -> “Open Release Directory”,在弹出的 console 中 输入:
    notepad shell.reg

    也就是用记事本打开D:\WINCE500\PBWorkspaces\SHELL_demo\RelDir\Emulator_x86_Release 下的shell.reg 文件,进行编辑

  4. 编辑下面的一行,把 explorer.exe 修改成自己添加的程序。
    即把
  5. [HKEY_LOCAL_MACHINEinit]
     
    "Launch50"="explorer.exe"
     
    "Depend50"=hex:14,00, 1e,00

    改为:

    [HKEY_LOCAL_MACHINEinit]
     
    "Launch50"="MyShell.exe"
     
    "Depend50"=hex:14,00, 1e,00
  6. 保存 shell.reg 文件,回到 pb5,点击菜单
    “Build OS” -> “Make Run-Time Image”,即重新生成镜像文件,然后下载到模拟器或设
    备,这样就启动了自己的MyShell.exe,而没有桌面,任务栏等等

注意:1) MyShell 不能关闭,一点击退出按钮或菜单,就会死掉…

by  Zhanghu
2007/04/26

nk.bin 与 nk.nb0 的区别

Monday, March 10th, 2008

http://msdn.microsoft.com/chats/transcripts/mobileembedded/06_1129_msdn_wince.aspx

David Kelley [MS] (Expert):
Q: Which is the difference between the nk.nb0 and nk.bin image created by PB5.0?
A: .nb0 files is a raw file format suitable for flashing ROM via a ROM programmer while the .bin file is a MS format we use to download images to the device via the bootloader. In the end, same information, different formats.

要产生NK.NBx文件,你必须在Config.bib中设置ROMSIZE参数。
如ROMSIZE=02000000,设置NK.NB0的大小为32M,若Image的大小超过32M,则还会产生NK.NB1,NK.NB2……

Windows CE 的多语言支持 MUI(Multilingual User Interface)

Tuesday, January 8th, 2008

Windows CE 提供了 MUI(Multilingual User Interface),用于开发多语言系统和程序

详细见 Wince帮助
Windows CE Features\International\Multilingual User Interface(MUI)

系统方面
———
PB 中创建一个工程后,菜单 Platform -> Settings,选择需要的 Locale 和 语言,
并设置默认语言,要注意的是,如果选择了东亚语言,需要把东亚语言设置为默认。

在 Catalog 窗口添加MUI、相关字体、输入法等等

sysgen 后,Open Release Directory,执行 createmui 0409 (创建英语语言的资源文
件,默认不是英语的情况下)。打开文件生成目录Emulator_X86Release,复制 multiui.bib 中的所有内容到 common.bib 的最后。然后,Make Run-Time Image

最后下载到模拟器中,记得在 Target Device Connectivity Options  中取消选中
Clear memory on soft reset。这样语言才能切换。

模拟器中wince起来以后,在控制面板的区域设置中设置语言和Locale,也可以自己调
用API,如下:

1
2
3
4
5
unsigned short SLANGID = MAKELANGID(LANG_CHINESE,SUBLANG_CHINESE_SIMPLIFIED);
SetUserDefaultLCID(SLANGID);
SetSystemDefaultLCID(SLANGID);
SetUserDefaultUILanguage(SLANGID);
PostMessage(HWND_BROADCAST, WM_WININICHANGE,0, INI_INTL);
1
// EnumUILanguages 列出系统支持的语言

最后 Soft reset,系统界面的语言就改变了

应用程序方面
————
创建一个应用程序工程,把自带的资源改成中文,生成 Myapp.exe

创建一个dll工程,纯资源的。setting里link 选项加上 /NOENTRY,编译出dll文件,
改名为 Myapp.exe.0409.mui(以美国英语为例),放在myapp.exe同目录下。

这样就OK了,假设系统默认语言是中文,按前面的方法切换系统Locale和语言为英语
,soft reset后,Myapp.exe会变成英语界面,如果 Myapp.exe.0409.mui不存在,依然为中
文界面。

其他
—-
MUI的缺点是要重启程序才能改变界面,因为要重新加载资源

Soft reset 模拟器是可以,具体设备不知是否支持

Windows CE Platform Builder 补丁网址

Friday, November 16th, 2007

重做了系统,PB也要重新安装了,更新补丁是必要的

http://msdn2.microsoft.com/zh-cn/embedded/aa731256.aspx

[zz]在VS2005使用WinCE模拟器

Wednesday, November 14th, 2007

需要下载模拟器:

http://www.microsoft.com/downloads/details.aspx?FamilyID=474b03a6-e87d-455d-bc16-b8cf18ef39b4&displaylang=en

详细操作可查看:

http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=468594&SiteID=1

[zz]WINCE 建立快捷方式、内核添加文件

Thursday, October 11th, 2007

1.WINCE快捷方式结构

WINCE的快捷方式和WIN2K,XP的不同,只是一个后缀名为.LNK的文本文件.


其格式如下:

数字#路径

比如,有个快捷方式写法如下:

23#\Windows\ToolViewer.exe

指的是指向WINDOWS文件夹下的Toolviewer.exe可执行文件.数字究竟代表的是什么意思,我也不太清楚;有一说法是#后的ACSII字符 的数量,但如果把上述例子改为1#\Windows\ToolViewer.exe也可正常运行,但去掉数字则系统无法识别.虽然可以正常使用,但建议还 是按照文档#之后的ACSII字符数量填写.

2.如何把快捷方式加到内核中


假设我们有一快捷方式EnglishExp.lnk,要将其加到内核中.

在PB环境中打开工程,在project.bib文件的FILES字段中添加:

EnglishExp.lnk $(_WINCEROOT)\PLATFORM\MyAPPC\EnglishExp.lnk NK H

其中 $(_WINCEROOT)指的是PC机子上PB安装的根目录,H指的是文件属性,意义代表如下:

S:系统
H:隐藏
R:压缩的资源文件
C:压缩文件
U:非压缩文件

3.如何把快捷方式放到桌面

语法如下:Directory(”欲拷贝至的文件夹”):-File(”更改的名称”,”要拷贝的文件”)

假设我们有一快捷方式EnglishExp.lnk,要将其放到桌面,并把快捷方式的名称改为”英语”
在PB的project.dat文件加入此句:

Directory(”\Windows\LOC_DESKTOP_DIR”):-File(”英语.lnk”,”\Windows\CEnglishExp.lnk”)

包含在内核里面的文件全部释放到”\Windows”文件夹下.

LOC_DESKTOP_DIR指的是本地桌面.在PB中,常用的还有如下宏定义:
LOC_DESKTOP_DIR: 桌面
LOC_MYDOCUMENTS_DIR: My Documents
LOC_PROGRAMFILES_DIR: Program Files
LOC_FAVORITES_DIR: Favorites
LOC_RECENT_DIR: Recent
LOC_MYDOCUMENTS_DIR: My Documents
LOC_HELP_DIR: Help

更多的定义可以在ceshellfe.str文件中找到

4.消除快捷方式的小箭头

在PC机的操作系统中可以通过修改注册表来取消快捷方式左下角的小箭头,但在WINCE中注册表没有关于取消小箭头的键值(可能我没找到^_^).在这里我采用的是直接修改资源文件的做法.
打开shcore.res文件,其中文的路径在 $(_WINCEROOT)\PUBLIC\COMMON\OAK\LIB\ARMV4I\RETAIL\0804\,然后将1205的ICO的小箭头删 掉即可.注意,不是删除ID为1205的ICO图标,是删除ICO图标中的内容.

5.微软应用程序的快捷方式

如果在PB中添加了微软的应用软件,便会在桌面和程序中添加其快捷方式;如果觉得快捷方式碍眼,可以将其注释掉再编译即可.

现在列出一些dat文件中定义的微软应用软件的快捷方式:

wceappsfe.dat (C:\WINCE420\PUBLIC\WCEAPPSFE\OAK\FILES\),内含:pmail,wordpad
wceshellfe.dat (C:\WINCE420\PUBLIC\WCESHELLFE\OAK\FILES\),内含:iexplore,帮助文档在”help”文件夹的快捷方式
viewers.dat (C:\WINCE420\PUBLIC\VIEWERS\OAK\FILES\), 内含:pdfviewer,imageviewer,Presviewer,Docviewer
directx.dat (C:\WINCE420\PUBLIC\DIRECTX\OAK\FILES\),内含:Media Player,DVD Player

6. 修改默认shell

其实让一个程序在wince里启动和windows里差不多,直接设置其为启动项,这个有几个方法。一个就是制作一个快捷方式,指向我们的应用程序如app.exe,然后将快捷方式放到\windows\startup下面。

步骤如下:(假设app.exe已经拷贝到windows下面)

在pb中创建一个文件,文件类型选txt,然后命名为.lnk后缀,假设名字为test.lnk
编辑其内容为: 16#\windows\app.exe

备注:前面的16是# 后面所有字符的总和,包括空格。Wince的帮助文档上说这么定义就行,但是我尝试后,最后down到目标机上面时提示找不到文件,在wince里查看这 么创建的test.lnk的属性,发现其指向\windows\app.exe后面还有两个方框,因此不对,我的解决方法是修改test.lnk的内容为 16#”\Windows\app.exe”

编辑好lnk文件内容后在pb中修改project.bib

在files段后面添加下面一行:(和添加别的文件到image中类似,也要在pb的flatform菜单的setting下添加build语句,同上,不再赘述)

test.lnk $(_FLATRELEASEDIR)\test.lnk NK S

project.dat

增加下面一行:

Directory(”\Windows\startup”):-File(”test.lnk”,”\Windows\test.lnk”)

这样后系统启动后就会自动启动我们的程序了。

另外一种方法是编辑注册表:在project.reg中添加如下内容

[HKEY_LOCAL_MACHINE\init]
“Launch80″=”app.exe”
“Depend80″=hex:14,00,1e,00

这个是设定启动顺序,launch后面的数字越大的越是后启动,Depend80后面的指定依赖项,为16进制,上面的语句表明依赖项为launch20 定义的device.exe和launch30中定义的gwes.exe, 注意Launch后面的数字范围为0到99 ,此范围之外的将不会有效果。

这样两种方法的效果都是系统都是系统先启动资源管理器explorer.exe(就是看到的默认桌面),然后启动我们的程序,(如果利用 taskman shell然后去掉任务栏那么效果更好)但是这样还不够,我们如何不显示桌面,直接显示我们的程序呢?

网上有人介绍的方法是去掉standard shell,但是我编译总是报错。我采用的方法是替换注册表中lauch50中的explorer.exe为我的app.exe,即搞定。

修改注册表的方法:先把带KITL的系统跑起来,在PB的TOOLS->Remote registry editor里修改,验证有效后,再去修改platfrom.reg, 或者自己写个REG文件,然后在platform.reg里INCLUDE进来 SYSGEN后确认PBWORKSPACE里相关项目的REL目录里reginit.ini文件里包含了自己做的修改后make image然后DOWNLOAD下去就OK了。

值得补充的是,我们前面介绍的步骤中那个修改平台setting,添加语句的,是因为我每次都是重新sysgen和build,如果只是简单的 make image的话(都是pb中的build OS菜单下的命令),那么将直接用release中的内容,因此也可以直接将文件放到release文件夹,然后改project.bib等实现往 image中添加文件。 同样,也可以直接修改release中的shell.reg中的launch50值为我们自己的程序(或者类似修改reginit.ini文件, reginit.ini文件存放有所有wince的静态注册表,来达到去掉桌面,直接启动我们程序的效果)。

注意,这么启动的程序,如果点击关闭,就会死机的,因为没有窗口运行了。实际运用中,当然不会让用户关闭我们的程序,除非他一起关闭系统。

如果也需要build的话,可以通过往image中添加文件的方法将我们改好的shell.reg添加到release目录。

总之,今天是把定制shell算是基本完成了。

STL for EVC

Friday, September 7th, 2007

http://www.syncdata.it/stlce/index.html

[zz]把代码移植成UNICODE

Tuesday, August 21st, 2007

动机 : 在没有装中文字体的机器上显示中文
如果不是unicode,某些中文字符会在不同的codepage上出现乱码;如果当前codepage为韩文时,某些中文字会变成韩文的样子,奇怪.

Step1: define _UNICODE, undefine _MBCS
宏定义UNICODE, _UNICODE定义两个也可以,定义一个也可以,windows的头文件会保证两个都会被定义.

#ifdef _UNICODE
 
#ifndef UNICODE
 
#define  UNICODE  //  UNICODE is used by Windows headers
 
#endif
 
#endif#ifdef UNICODE
 
#ifndef _UNICODE
 
#define  _UNICODE         //  _UNICODE is used by C-runtime/MFC headers
 
#endif
 
#endif

Step2: 更改变量类型
比如 char -> TCHAR

但是 ,并不是说所有的char类型都不能用了.如果需要用,并且函数的参数/返回值什么的都不冲突,char类型还是可以用的.

Step3: 更改常量字符串形式
” abc ” -> _T(” abc “)

因为开始写程序时没有注意 ,造成这样的常量字符串形式非常多,一个个改起来很烦,我写了个小插件,可以讲 ” abc ” 选中后点一下 button就能变成_T( “ abc ” ),有点用,代码也非常的短.

Step4: 替换某些函数
比如atoi -> _ttoi

在这里遇到一个问题,就是atof的替换.

按照msdn, atof应该被_ttof替换

TCHAR.H routine _UNICODE& _MBCS not defined _MBCS defined _UNICODE defined
_tstof atof atof _wtof

但是奇怪的是,VC6里面不认识_tstof这个函数,VC.net 2003就可以.有两个解决的办法:

  1.  因为atof只是替换为浮点数,所以这里用WideCharToMultiByte转化一下之后再调用atof也是可行的
  2.  呵呵,用strtod的替换函数_tcstod,哈哈,当然参数要变一下,我觉得这个方法不错,不要被msdn限制死了

Step5: 检查一下调用其他 dll 的接口函数
因为项目还用了另外一个dll,其中有些接口需要char*参数,这个时候就必须用WideCharToMultiByte转换一下了.

VC里面的设置:

  1. 等把所有的编译error改完了之后一编译,除了个link错误,不过msdn有解释:If you are using Unicode and MFC, you will get an unresolved external on _WinMain@16 if you don’t create an entrypoint to wWinMainCRTStartup. Use the /ENTRY option or type this value in the Project Settings dialog box. (To find this option in the development environment, click Settings on the Project menu, then click the Link tab, and click Output in the Category box.)port2unicode.gif
  2. 终于编译成功了,调试的时候却发现CString的值不能在QuickWatch窗口中显示了

tools->option->
in the debug tab u can find a check box Labeled “Display unicode strings”
Check it.

问题 : 直接用 ANSI 的 dll 中的 CString
在使用dll的时候,需要直接使用dll中的一个变量,是CString类型,因为这个dll还没有改为unicode,所以在直接使用其变量时有点问题,使得值不对.(是不是这个原因还没有完全验证,应该是的)

到这里 , 宣布移植失败 !
/*补充:
结果是失败,但是基本移植代码的所有步骤都有了。而且,也指出了如果需要调用的dll不是unicode,每次调用/传递参数时,都要转换,很烦。
后来我把dll的代码也移植了下,现在运行的很好,韩文、中文都可以显示,不管你当前语言是什么。
*/

还有一篇讲移植步骤的,更全面,适合更复杂的情况:
Cheat Sheet:Unicode-enabling Microsoft C/C++ Source Code (http://www.i18nguy.com/unicode/c-unicode.html)

来源:http://blog.csdn.net/tuwen/archive/2007/08/13/1740237.aspx

[zz]定制一个eVC上的中文模拟器

Saturday, July 28th, 2007

中文模拟器这个问题实在被问得太多了,eVC自带的STANDARDSDK_500 Emulator用起来显然不顺手,存在以下缺点:

(1) 不支持中文的,只支持英文。中文显示上去一堆框框。

(2) 不支持Folder Sharing。模拟器开起来后,菜单里的Emulator->Floder Sharing是灰的,点不了。导致要用到的所有文件都得用Remote File Viewer传上去,不仅麻烦,而且上传的大小总量还有限制。比如你打算用模拟器上的播放器,放个100M的视频文件,这在STANDARDSDK_500 Emulator上就不可能了

(3) 组件有限。想用的API没有。比如计划的最终产品上有IE和WMP,你想用Internet Client接口,但标准模拟器上就是没有。

自己定制模拟器的前提是安装了Platform Builder for Windows CE 5.0。定制步骤如下:

一、建立PBWorkspace,定制语言和组件,编译run-time image

(1) 打开Platform Builder, 从菜单File->New Platform新建一个PBWorkspace, 注意在 New Platform Wizard - step 3 选BSP时要钩选EMULATOR:X86。在step 4的Design Template我选了Mobile Handheld,带的组件比较多,省事。一路NEXT下去。

(2) 在step 4选完Design Template后,别点Finish, 要点Next进到下一步。在这里把Standard SDK for Windows CE都选上, 再下一步把网络都勾上。ActiveSync和TCP/IP都是连接模拟器的调试手段,多勾点没什么坏处。在eVC里我比较郁闷的是用ActiveSync作Transport的话,连不上模拟器;而用TCP/IP连接模拟器时有个不好,就是网卡不能处于断开状态,得随便找个路由或者MODEM连上,程序才能下载到模拟器上。这个是后话了。

(3) NEXT到头后,PBWorkspace建好了,自己点菜,往里头加组件吧,应用开发比较常用到的也就是Applications and Services Development,Graphics and Multimedia Technologies, Shell and User Interface三个目录下面的东东,还有里我的建议是在产开发初期就把所需的组件定好,然后定制模拟器给应用开发人员用,BSP开发好后,同样也加上模拟器上用的那些组件来编译产品的IMAGE,这样应用开发才不会走样。

(4) 大家最关心的一步,中文。从PB菜单的Platform->Settings点进去,选择Locale页,然后在Locales:下面的复选框里慢慢找中文吧。其实就在最后一个:中文(中国)。加好后,在Default Language下拉菜单里就可以选“中文(中国)”了。 默认的拉丁文国家是在太多了,我一般先点Clear All,然后再找英文(美国)和中文(中国)就够了。

(5) 选完语言后,顺便拜访一下Build Options页。Full Kernel Mode我是比较喜欢,可惜据说运行起来会不稳定,还是别勾了;Enable KITL勾上,多个调试通路也好。

(6) 编译生成一个run-time image. 从菜单里Build OS->Sysgen. 等半个小时吧。从编译和SDK的原理来说,这步不是必须的。但是如果不SYSGEN而直接BUILD SDK,会弹出下图这个警告框。怕怕,还是SYSGEN一下好了

build_sdk.jpg

二、编译SDK

(1) 终于等完SYSGEN,现在可以导出SDK了,从PB菜单里点Platform -> SDK -> New SDK. 出来个对话框,如下图。这里面的Locale只能选U.S.English和Japanese,这步和SDK的语言没关系,我们选English. 点NEXT
sdk_wizard.jpg

(2) 第二步选编程支持,eMedded Visual C++ 4.0 support是必选的,其他看开发规划了。然后就FINISH了

(3) 别急着点Build SDK, 在Configure SDK里还很多好玩的。从PB菜单里点Platform->SDK->Configure SDK, 出来个N多内容的对话框。

A) 比较重要的,切到Emulation页,在Configuration里默认的可能是None, 选成Emulator: x86_Release,然后就可以配置内存大小、分辨率和色深了,这点比较重要,以前我还不懂自己定制模拟器时,就在分辨率和色深上吃过亏,模拟器上作好的东西,放到板子上跑完全走了样

B) 首先选Transports页,看看TCP/IP, ActiveSync, KITL三种调试手段都勾上没,选个自己喜欢的作默认。

C) 然后切到Splash Screen页, 可以弄张BMP图片作为SDK安装包启动时的广告界面。我原来以为是可以替换掉每次WINCE模拟器启动时显示的Windows CE那张LOGO图片,看来还没那么好玩。

(4) 编译SDK了。Platform->SDK->Build SDK。这个很快,两三分钟就搞定了。

三、安装SDK,开始爽吧

在WINCE500\PBWorkspaces\%your_workspace%\SDK\ 里面可以找到刚才编译出来的SDK。先关闭eVC再安装它。安装完后,重新打开eVC,就可以选择这个模拟器了,用法和STANDARDSDK_500模拟器一样,但是功能强多了,有自己定制的组件、分辨率和色深、可以Folder Sharing。我自己弄的一个,发张PP
power_emu.jpg

来源:http://www.cnblogs.com/walzer/archive/2007/04/15/713880.aspx

[zz]如何在预编译时判断WinCE的版本?

Friday, June 29th, 2007

作者:Daric 来源:BIPLIP.com 时间:2004年7月8日 4:15 阅读3262次

问:在写WinCE程序时,经常要针对不同的版本写不同的代码,如何在预编译时判断WinCE的版本呢?

答:可使用如下语句判断

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
//===============
//判断WinCE版本号
#if (_WIN32_WCE == 211)
      //Your code;
#endif
 
#if (_WIN32_WCE >= 200)
      //Your code;
#endif
 
#if (_WIN32_WCE < 300)
      //Your code;
#endif
 
//=============
//判断WinCE与PC
#if defined(_WIN32_WCE)
      //Your code;
#endif
 
//==============
//判断Palm Size PC
#if defined(_WIN32_WCE_PSPC)
      //Your code;
#endif
 
//=============
//判断Pocket PC
 #if defined(WIN32_PLATFORM_PSPC)
        // Pocket PC or Palm Size PC
 #if (WIN32_PLATFORM_PSPC == 1)
        // Pocket PC 2000
 #elif (WIN32_PLATFORM_PSPC == 310)
        // Pocket PC 2002
 #else
        // Some other Pocket PC
#endif
 
//=============
//判断模拟器
#ifdef _WIN32_WCE_EMULATION
      //Your code;
#endif
 
//=============
//判断HPC
#if defined(WIN32_PLATFORM_HPC2000)
        // H/PC 2000
#elif defined(WIN32_PLATFORM_HPCPRO)
        // H/PC Pro
#endif
 
//=============
//判断SmartPhone
#if defined(WIN32_PLATFORM_WFSP)
        // Smartphone
#endif
 
//=============
//判断CPU类型
#if defined(ARM)
        // ARM processor
#elif defined (MIPS)
        // MIPS processor
#elif defined (SH3)
        // SH3 processor
#elif defined (SH4)
        // SH4 processor
#elif defined (x86)
        // x86 processor - emulator version
#else
        // 其它
#endif