- devices -setdefault @UIQ_21:com.symbian.UIQ
- abld makefile vc6
- 用VC6打开的生成在 \epoc32\build\\UIQEXAMPLES\HELLOWORLD\HELLOWORLD\WINS目录下的HelloWorld.dsw目文g?
- 讑֮Debug用的宿主E序为\EPOC32\RELEASE\WINS\UDEB\EPOC.EXE
- Debugq行E序Q就可以调适程序单步执行,或者在断点上定位?
??xml version="1.0" encoding="utf-8" standalone="yes"?>
]]>
]]>
Series 60 v0.9 | 0x101F6F88 | |
Series 60 v1.0 | 0x101F795F | |
Series 60 v1.1 | 0x101F8201 | |
Series 60 v1.2 | 0x101F8202 | |
Series 60 v2.0 | 0x101f7960 | |
Series 60 2nd Edition FP1 | 0x101F9115 | |
Series 60 2nd Edition FP2 | 0x10200BAB | |
Series 60 2nd Edition FP3 | 0x102032BD | |
Nokia 3650 | 0x101F7962 | |
Nokia 6600 | 0x101F7963 | |
Nokia 6620 | 0x1020216B | |
Nokia 6630 | 0x101F7964 | |
Nokia 6680 | 0x10200f99 | |
Nokia 7610 | 0x101FD5DB | |
Nokia 7650 | 0x101F6F87 | |
Nokia N-Gage | 0x101F8A64 | |
Siemens SX1 | 0x101F9071 |
Series 80 v2.0 | 0x101F8ED2 | |
Nokia 9300 | 0x101F8ED1 | |
Nokia 9500 | 0x101F8DDB |
UIQ v2.0 | 0x101F617B | |
UIQ v2.1 | 0x101F61CE | |
SonyEricsson P80x | 0x101F80BE | |
SonyEricsson P90x | 0x101FBB35 |
Series5mx | 0x1000118a | |
Brutus board | 0x10005f60 | |
Cogent board | 0x10005f61 | |
Win32Emulator | 0x10005f62 | |
WinC | 0x10005f63 | |
CirrusLogic 7211 board | 0x1000604f |
These UIDs shall be used in your PKG file to specify on which platform (or phone) your application will work. As an example, an application running on UIQ 2.0 platform will have the following line in its PKG:
(0x101F617B), 2, 0, 0, {"UIQ20ProductID"}
It is generally preferable to use the Series 60 vX.X UIDs unless your application is only targeted at a very specific phone. It is also preferable to use the lowest possible UID (ex: do not use the Series 60 v2.0 UID if you do not use the Series 60 v2.0 specific APIs, even if you use the corresponding SDK).
The following are specific UIDs you should not need unless you are working on a specific development board:
Series 60 3rd edition (OS9.1)
[0x101F7961], 0, 0, 0, "S60ProductID"Series 90 / Nokia 7710
(0x101FBE05), 0, 0, 0, "Series90ProductID"
Nokia 6680 - 0x10200f99
0x101F61CE - UIQ21ProductID and 0x101Fbb35 - SonyEricssonP90xPlatformProductID
W二?开发环境的选择
一旦确定了q_Q就要选择合适的SDK工具包和IDE集成开发环境?br />目前有三U主要的选择Q?br />Visual Studio .NET
CodeWarrior
C++ Builder
选择开发环境的原则是选择你最熟悉的,当然Q如果你已经在用CodeWarriorQ那么l用,q个开发环境可以面向所有的q_Q包括诺Z的S60和UIQ?br />如果在诺Z的S60q_上开发,那么Borland的C++ Builder是个不错的选择。可以让你得到完全免费的开发环境?br />如果你还有Visual Studio 6.0的IDEQ开发S60上的应用可能会受C些限制。用这个开发环境的好处在于Q?br />可以配合使用诺基亚最新的SDK
拥有最好的应用E序向导Q对开发小的应用很有帮?br />比CodeWarrior?/p>
W三步,你需要什么样的PC
大多数的PC都满Symbian的开发要求。只需要有_的内存和Windows NT?000或者XP的系l?/p>
W四步,下蝲和安装SDK
下面的链接帮助你扑ֈ合适的IDE和SDK:
在命令行下用abld可以直接~译Symbian的程序,但是abld同时提供了命令行开兛_以用来生成vc6的项目文件。用abld生成的vc6的工E文Ӟ我们可以在vc6中调试symbian的程序了。步骤如?/p>
一、HellowordCZQ?/p>
首先查SDK是否能够正常q行Q?br />q入一个DOS界面
输入"NMAKE"Q如果得到Microsoft Error message U1064的错误提C,查你的\径配|是否正。如果提CNMAKE is not a recognised commandQ需要运行\径ؓC:\Program Files\Microsoft Visual Studio\VC98\Bin 下的VCVARS32.BAT脚本?/p>
在DOS下进入HellowWorldQ\径ؓC:\Symbian\6.1\Series60\Epoc32Ex\Basics\HelloWorld
q个目录下包?个文Ӟ
bid.inf
helloworld.mmp
helloworld.c
Bid.inf文g是主要的Project文g
HelloWorld.mmp是一个project makefile.包括所有源文g和库的列?
HelloWord.cpp是C++代码
CommonFramework.h是一个头文gQThe CommonFramework.h set up a basic console environment and calls a doExampleL() primitive: this is an extremely useful file to begin playing Symbian C++ without the burden of NS60 specific code (you can also read A simple text console if you want to know more about this console).
二、命令行~码Q?br />
在DOS环境下输?bldmake bldfiles.会在Project目录下创Z个ABLD.BAT文gQ这是编译程序的入口文g?/p>
输入abld build wins udebq行~译。编辑后的结果存在C:\Symbian\6.1\Series60\Epoc32\Release\wins\UDEB目录下。输入Helloworld可以在epoc模拟器下q行"Hello world"E序了?/p>
三、用Visual C++
你也可以用C++~译和执行应用程序?br />回到C:\Symbian\6.1\Series60\Epoc32Ex\Basics\HelloWorld
用命令生成一个Visual C++ workspaceQabld makefile vc6
在下面的目录可以扑ֈC:\Symbian\ 6.1\ Series60\ Epoc32\ BUILD\ SYMBIAN\ 6.1\ SERIES60\ EPOC32EX\ BASICS\ HELLOWORLD\ HELLOWORLD\ WINS
打开q个workspaceq新编译,用CTRL-F5开始运行?/p>
四、目标编?br />现在需要在你的Ud讑֤上运行这个程序,回到DOS下,q入C:\Symbian\6.1\Series60\Epoc32Ex\Basics\HelloWorld
用abld命o~译abld build thumb urel
ZSymbian UIQ 2.1的系l的开发环境安装?/p>
1描述
Symbian不仅仅是一个操作系l的名称Q而是一个公司、一个阵营、一个手机垄断联盟的代名词?SPAN lang=EN-US>Symbian是由诺基?/SPAN>、摩托罗拉、松下、爱立信?SPAN lang=EN-US>Psion共同创办q拥有的公司。该公司的命是为移动无U操作系l制订标准,q无线信息讑֤大规模投入市场?SPAN lang=EN-US>Symbianq_是迄今ؓ止最令h振奋?SPAN lang=EN-US>CQ+~程pȝ之一Q它使用?SPAN lang=EN-US>EPOCq种最初由Psion开发的软g架构。这U具有面向对象设计的操作pȝ融合了手持设备所需的多U功能,包括集成于内怸的电源管理功能、尖端的存储理能力、事件处理机制、高效的多Q务能力等。ؓ了有效地利用q些Ҏ,q引入了一l与此相关的原始CQ+形式?SPAN lang=EN-US>API。此外,该系l的设计q保证能适用于不同的CPU和硬仉|。此举得基?SPAN lang=EN-US>EPOC的系l能与无U信息设备、便携式计算机和PC{多cM品集成?/FONT>
2市场前景
诺基?/FONT>与烦爱立信Ud通信公司2003q达成一_通过整合UIT?SPAN lang=EN-US>Series60l端软gq_工具Q以及创Z个应用认证程序来增强Symbian操作pȝ(Symbian OS)的潜能。这实质性地帮助开发商开发、认证和采用Symbian OS电话应用E序Q从而加?SPAN lang=EN-US>Symbian OSC代彩信手机的新应用的诞生?/FONT>
诺基?/FONT>、烦爱立信?SPAN lang=EN-US>Symbian之间的这一合作Q将使开发商能够通过使用一套统一的工h为基?SPAN lang=EN-US>UIT?SPAN lang=EN-US>Series60l端软gq_的品开?SPAN lang=EN-US>Symbian OS应用E序。开发商q将由此得益于更方便的认证过E和更短的市场准入时间?/FONT>
Symbian有限公司首席执行?SPAN lang=EN-US>David Levin先生_“随着Symbian OS电话到全球市场,更多的开发商正在利用q一q猛发展的商机来?SPAN lang=EN-US>Symbian OS电话创造应用程序和服务。这与诺基?/SPAN>和烦爱立信之间的新合作驱?SPAN lang=EN-US>Symbian OS电话的创新应用及服务的更快发展和投入使用。?/FONT>
?SPAN lang=EN-US>UIT技术开发,q在索尼q?SPAN lang=EN-US>P800电话中用的UIQQؓ型W式电话提供了一个灵zȝ、大屏幕用户界面?SPAN lang=EN-US>UIT用户q_设计独到Q可以帮助用戯松用企业应用程序、无~信息、强大的互联|、多媒体功能Q以及实现简单同步,该同步则可以借助普通桌面应用程序以?SPAN lang=EN-US>SyncML服务器,通过U外Uѝ蓝牙以及序列端口来实现?/FONT>
Series60q_是ؓ诺基?/SPAN>授权其它Ud电话生厂商所生的智能电话而设计的软g产品。生产厂商会?SPAN lang=EN-US>Series60q_整合C们自p行在Symbian OS上的电话设计中?SPAN lang=EN-US>Series60q_包括Ud览、彩信、内容下载以及一pd个h信息理和技术应用。此外,该Y件^台还包含了一整套可变更的用户选择界面?/FONT>
Z在多媒体高端手机市场抢占地盘Q英?SPAN lang=EN-US>Symbian公司于本周推Z其最新版本的手机操作pȝSymbian OS v7.0s?/FONT>
?SPAN lang=EN-US>SymbianUͼ新系l拥有更多全新功能,其中包括多媒体结构、支?SPAN lang=EN-US>W-CDMA、支?SPAN lang=EN-US>Java MIDP 2.0和又向文?SPAN lang=EN-US>(例如泰语、阿拉伯语和希伯来语){。其多媒体结?SPAN lang=EN-US>(MMF)可以?SPAN lang=EN-US>Symbian OS应用E序提供改进型录韟뀁回放、音频流和图像功能,它包括一个通用多媒体接入系l,开发h员可以用抽象的和具体的cd~写插gQ其中具体类别包括文件、描q符、插座、音频和视频输入与输出等?SPAN lang=EN-US>MMF支持WAV?SPAN lang=EN-US>AV?SPAN lang=EN-US>RAW?SPAN lang=EN-US>PCM?SPAN lang=EN-US>uLaw?SPAN lang=EN-US>aLaw?SPAN lang=EN-US>GSM6.10{格式?/FONT>
此次新添的支?SPAN lang=EN-US>3GPP W-CDMA的功能是Symbian在支?SPAN lang=EN-US>GSM?SPAN lang=EN-US>GPRS?SPAN lang=EN-US>EDGE?SPAN lang=EN-US>CDMA?SPAN lang=EN-US>3GPP2 cdma2000 1X之后又一ơ技术突破。通过多模?SPAN lang=EN-US>API的提供,Symbian帮助手机制造商们更村֜?SPAN lang=EN-US>Symbian OS从一U手机标准{换到另外一U之中?SPAN lang=EN-US>Java MIDP2.0可以使基?SPAN lang=EN-US>Symbian OS的手机更加支持游戏与蓝牙技术,?SPAN lang=EN-US>Symbian在新pȝ中加入了Sun公司的新Java虚拟?SPAN lang=EN-US>(JVM)Q可以提供更高的性能和有利于Java应用E序的下载?/FONT>
Symbian公司负责产品开发管理的副总裁摩顿-格劳巴尔Uͼ?SPAN lang=EN-US>Symbian OS v7.0中新加的功能ؓ应用开发商和网l运营商提供更ؓ先进的、富有娱乐性的和更L产效能的应用、内容与服务Q采用Symbian OS的手机更具吸引力”。目前市Z使用Symbian操作pȝ的手机制造商有很多,摩托|拉?SPAN lang=EN-US>诺基?/SPAN>、三星、西门子和烦爱立信{业内巨头均包括其中
英国Symbian日前推出了手机操作系l最新版?SPAN lang=EN-US>Symbian OS v8.0”。特Ҏ实时性更强,支持SDIO。采用该版本的手?SPAN lang=EN-US>2004q下半年推出。这是在2004q?SPAN lang=EN-US>2?SPAN lang=EN-US>23日于法国戛纳开q的手机相关技术展——?SPAN lang=EN-US>3GSM World Congress 2004”上宣布的?/FONT>
Symbian OS v8.0通过提高实时性,更容易在应用处理器中集成通信CPU内核的处理功能。通过减少微处理器数量Q能够降低手机成本。该版本支持SDIOQ能够连接微波数字电视调谐器和指U认证电路?/FONT>
Symbian OS已经被富士通、摩托罗拉?SPAN lang=EN-US>诺基?/SPAN>、三星电子和襉K子等公司采用?SPAN lang=EN-US>2003q获得新授权的厂商包括三q机和英国Sendo{公司。另外,2004q松下电器业将推出首次安装该操作系l的手机?SPAN lang=EN-US>X700?/FONT>
3上网方式
GSM?SPAN lang=EN-US>GPRS?SPAN lang=EN-US>EDGE?SPAN lang=EN-US>CDMA?SPAN lang=EN-US>3GPP2 cdma2000 1XQ?/FONT>3GPP W-CDMA
4理论上网速度
GSM(9.6Kbps)?SPAN lang=EN-US>GPRS(2.5G技?SPAN lang=EN-US>168Kbps)?SPAN lang=EN-US>EDGEQ?SPAN lang=EN-US>384KbpsQ?/FONT>
CDMA2000(284Kbps or 144Kbps、视不同厂商),W-CDMA(3G技?/FONT>)
5收费标准
联?/FONT>
Ud
6手机介绍
Symbian OS v6.0-Nokia 9210 Communicator(The world's first open
Symbian OS phone)
Symbian OS v6.0-Nokia 9290 Communicator
Symbian OS v6.1-Nokia 7650
Symbian OS v6.1-Nokia 3650
Symbian OS v6.1-Nokia N-Gage
Symbian OS v6.1-Siemens SX1
Symbian OS v6.1-Fujitsu F2102V(3G FOMA)
Symbian OS v6.1-Fujitsu F2051
Symbian OS v6.1-Samsung SGH-D700
Symbian OS v7.0-Sony Ericsson P800
Symbian OS v7.0s-Nokia 6600
Symbian OS v7.0-Sony Ericsson P900
{等
7开发环?/FONT>
如果?SPAN lang=EN-US>WAP上网Q服务器E序可以以java servlet 利用wap协议q行开?/FONT>
如果?SPAN lang=EN-US>手机应用E序Q可以采用开发工具基?SPAN lang=EN-US>Series60?SPAN lang=EN-US>Visual C++?SPAN lang=EN-US> Metrowerks?/FONT> Code Warrior
对于索尼q信其手机采用Metrowerks?SPAN lang=EN-US> Code Warrior做ؓ开发工?/FONT>
因ؓ有些手机加入?SPAN lang=EN-US>JVMQ所以也可以利用J2ME(Java MIDP2.0)
Symbian OS v6.0 开发应用程序的主要语言?SPAN lang=EN-US>C++Q?SPAN lang=EN-US>Java?SPAN lang=EN-US>OPLQ可以从Symbian |页上下?SPAN lang=EN-US>SDK后,?SPAN lang=EN-US>Series 60 SDK 0.9 for Symbian OS,安装后就可以看到一?SPAN lang=EN-US>Quartz的仿真器Q另外一?SPAN lang=EN-US>AIF Builder是集成开发环境,可以讑֮开发语a与^収ͼ工程理?SPAN lang=EN-US>ICON~辑{功能?/FONT>
8优缺?/FONT>
8.1优点
׃其“出w”好Q?SPAN lang=EN-US>Symbian?SPAN lang=EN-US>*?SPAN lang=EN-US>Symbian OS成ؓ了智能手机领域的领头?SPAN lang=EN-US>Symbian是由q信?SPAN lang=EN-US>诺基?/SPAN>、摩托罗拉、西门子{手机重量厂商?SPAN lang=EN-US>1998q?SPAN lang=EN-US>6月䆾成立的,三星公司不久前收购了Symbian 5%的股份,它们都在不同E度上支持该q_。上个月末,中国台湾的电子品厂商明基(BenQQ公司公布了生?SPAN lang=EN-US>2.5?SPAN lang=EN-US>3G手机的计划,q计划在W三季度推出ZSymbianq_的手机。微软则一直在忙着争取q营商对其手机^台的支持
Symbian与微软操作系l相比ƈ不占很大的优势,皆因Symbian本来是一个手机的操作pȝQ能够完成通话的基本功能,再加上一些辅助的功能Q比如电话本、短信编辑即可,开发者ƈ没有指望在手Z加入更多的功能。但Symbian的优势也在于它的单,对于g要求不高Q只需要几?SPAN lang=EN-US>K的内存,速度很慢?SPAN lang=EN-US>CPU可以把单的dq行得很好。硬件的要求低意味着成本的降低,因此在低端这一块,微Y与之相比是没有什么竞争优势的?/FONT>
不过Q随着Z对于手机功能需求的逐渐多样化,Symbian也在努力攚w自w,不断地在其中加入PDA、多媒体的功能。比如烦爱立信推出?SPAN lang=EN-US>P800Q摩托罗?SPAN lang=EN-US>388Q以?SPAN lang=EN-US>诺基?/SPAN>?SPAN lang=EN-US>9210{,都是ZSymbianpȝQ具备部?SPAN lang=EN-US>PDA功能的手机?
8.2~点
受到诺基?/SPAN>、西门子、烦爱立信{大厂支持的SymbianQ目前虽然独领风骚,不过Q?SPAN lang=EN-US>Symbian产品开发难度不逊于微YQ包括烦爱立信、西门子与明基等大厂Q其Symbian手机开发进度都曾严重落后,对于Symbianl持怸C也有不良影响?/FONT>
Symbian操作pȝ虽然较微软简单许多,但相对于系公司Q如微Y重视客户支援Q欧pȝSymbian却不时兴q套Q都?SPAN lang=EN-US>Symbian手机开发难度向上攀升。以索尼q信第一?SPAN lang=EN-US>Symbian手机P800ZQ在开发接q完成阶D|Q只是因为应新力的要求增加新力知名的JoystickQ摇杆)功能Q就让品g后将q半q才上市?/FONT>
而西门子旗下W一?SPAN lang=EN-US>Symbian手机SX1Q原定去q九月上枉售,不过在高开发难度与Symbian支持度有限下Q?SPAN lang=EN-US>SX1一直g后至十二月底才上市,不仅整整延后一季,几乎已错q圣诞节销售旺季。相对于Orange热卖摩托|拉微Y手机MPx200Q对Symbian在智能手机气势与市场占有率的l持Q都有不利媄?/FONT>
此外Q?SPAN lang=EN-US>Symbian以往最Zh所诟病的就是缺乏开放性。手机的应用不够丰富QY件有多少全看手机生商往里面加了多少?SPAN lang=EN-US>Symbian也意识到了这个缺点,在其新版之后加入了对Java的支持,推出了基?SPAN lang=EN-US>Java的开发工具包QɽW三方开发者可以自行开发基?SPAN lang=EN-US>Symbian的YӞ而手机用户也可以在网l上下蝲一些新游戏、Y件等应用E序了?/FONT>
9资源
支持厂商
合作内容
Borland软g
?SPAN lang=EN-US>诺基?/SPAN>合作为移动应用程序开发h员推出新?SPAN lang=EN-US>Java技术工P适用?/FONT>Symbian OS
推出支持Symbian Os Series 60 q_的移动应用开发工?SPAN lang=EN-US>Borland Series 60 C++ 工具?/FONT>
AppForge
Ud应用开发Y?SPAN lang=EN-US>AppForge MobileVB上市Q应用Y件开发商可用来将应用软gUL?SPAN lang=EN-US>Symbian OS{?SPAN lang=EN-US>AppForge支持的^?/FONT>
AppForge 开发者到2000q年底ؓ Symbian OS 开?SPAN lang=EN-US> 500 多个新的应用E序
日本ACCESS公司
优化其下一代互联网览?SPAN lang=EN-US>NetFront v3.0使得以用?SPAN lang=EN-US>Symbian OSq可针对不同的硬件自定义配置
Adobe
推出新款ZAdobe GoLive 6.0软g技术的无线~写模块以支?SPAN lang=EN-US>MMS服务
Hantro
展示了可?SPAN lang=EN-US>Symbian OS q_上运行的可录制视频的应用E序
Symantec
?SPAN lang=EN-US>Symbian OS手机提供|络安全解决Ҏ
RealNetworks
提供ZSymbian OS?SPAN lang=EN-US> RealOne Player{Y件。用?SPAN lang=EN-US>诺基?/SPAN> 7650 ?SPAN lang=EN-US> RealOne Mobile可按?SPAN lang=EN-US>诺基?/SPAN> 7650 昄寸自动~放
Metrowerks
?SPAN lang=EN-US> CodeWarrior 开发工P专业版)作ؓ集成开发环境可用于 Symbian OSQ该工具带有Symbian 集成目标~译环境
Voice Signal
其Y件可?SPAN lang=EN-US>Symbian Series 60 q_上运行语韌别和文本语音应用
Intel
Symbian OS 7.0已被优化用于Intel?SPAN lang=EN-US>XScale?/FONT>PCA
双方q将发布一个开发板支持?/FONT>
TI
?SPAN lang=EN-US>诺基?/SPAN>合作推出了一整套应用开发工?SPAN lang=EN-US>-Innovator开发套Ӟ专用于支持采?SPAN lang=EN-US>TI OMAP?SPAN lang=EN-US>Symbian Series 60q_
印度 Sasken 公司
其多媒体解决Ҏ可用?/FONT>Symbian OS
NeoMagic 公司
?SPAN lang=EN-US> Symbian 授权许可商提供可扩展?SPAN lang=EN-US> Symbian OS g解决Ҏ及其未来多媒体规根{?/FONT>
Infineon
Infineon 在?SPAN lang=EN-US> GOLD 产品pd GPRS/EDGE/UMTS 带宽调制解调器和应用处理器中引入 Symbian OSQƈ提供Ud多媒体应用的优化技术方?/FONT>
ARM
Symbian ?SPAN lang=EN-US> Symbian OS 中提?SPAN lang=EN-US> ARMv6 架构底层支持?/FONT>
10末来手机发展方向
对于手机的发展方向,我想能够如下q行描述Q三大阵营两大方向,一个方向是PDA加上手机的功能,另一个是手机加上PDA的功能。总而言之,q两 个方向肯定会l合hQ?SPAN lang=EN-US>Smart Phone手机是它的一U体玎ͼ现在已经有这L手机问世。如SonyEricsson P800?SPAN lang=EN-US>P900,Nokia7650{。在SmartPhone 领域Q目前最主要的^台就?SPAN lang=EN-US> Symbian ?SPAN lang=EN-US> EPOCQ当?SPAN lang=EN-US>Microsoft也不可小看?/FONT>
另外支持JAVA功能也是另外一个发展的方向Q?SPAN lang=EN-US>Symbian 亦是W一?SPAN lang=EN-US>SmartPhone q_支持 JavaQ由 OS 5开始已l加?SPAN lang=EN-US> J2EE 的阵营?SPAN lang=EN-US>OS 6 加入?SPAN lang=EN-US> Personal Java 以及 Java Phone 的功能,OS 7 更开始支?SPAN lang=EN-US> CLDC?SPAN lang=EN-US> MIDPQ可以说是最为完备支?SPAN lang=EN-US> Java 的手机^収ͼPalm 以及 Pocket PC 相对下只是刚h。加?SPAN lang=EN-US> Java 的结果是Q马上就有一大堆現成的程序、游戏可以用,q样也 Symbian 的普及度更加快?/FONT>
通过以下两款手机我们可以看一?SPAN lang=EN-US>Smart phone 的媄?SPAN lang=EN-US>(具体囄)
P800
2002q烦爱立信压u王牌机型---P800Q具?SPAN lang=EN-US>4,096色彩色触摸屏q。内|数码摄像头Q可以直接在手机上进行调节明暗、解析度和白q{。特大的屏幕用来上网和预览相片最好不q。此ZNOKIA 3650一P使用Symbian 7.0操作pȝQ用家可以下载不同的应用E序和游戏,也可插入Memory Stick记忆卡存储资料和相片。内|的MP3播放器,更手机变成随n听?/FONT>
?寸:117 X 59 X 27 mm
?量:148g (含盖158g)
通话旉Q高?SPAN lang=EN-US>13时
待机旉Q高?SPAN lang=EN-US>400时
颜色Q银白色
屏幕Q?SPAN lang=EN-US>1/4VGA彩色触摸?SPAN lang=EN-US>(4096?/FONT>)
屏幕寸Q?SPAN lang=EN-US>40x28mm(合上ȝ?SPAN lang=EN-US>)/40x61mm(打开ȝ?/FONT>)
解析度:208×144像素(合上ȝ?SPAN lang=EN-US>)/208×320像素(打开ȝ?/FONT>)
操作pȝQ?/FONT>Sybiam OS 7.0
记忆体:16+16MB快闪记忆?SPAN lang=EN-US>(9MB可供影像、游戏、通讯录、应用程?/FONT>)
P800可以使用Memory Stick扩充其存储容量、ƈ提供MP3播放功能?SPAN lang=EN-US>Memory Stick最多可扩充128MB的容量,q简?SPAN lang=EN-US>P800的档案备份,以及?SPAN lang=EN-US>PC之间的传输工作。这样一来,P800电话?SPAN lang=EN-US>PDA、数码相机、随w听、与Internetq接{多样功能集于一w?/FONT>
P800的文件和囄可以存储?SPAN lang=EN-US>Memory Stick记忆卡中Q再传输?SPAN lang=EN-US>PC中,反之亦然。由PC所下蝲?SPAN lang=EN-US>MP3音乐亦可透过P800随机附送的立体声x播放。另外,手机拍摄的照片,也可L传输?SPAN lang=EN-US>PC存储Q让用家的资料同步更新?SPAN lang=EN-US>PC所存储的图片也可传输到P800Q以便作为屏保图案、或存储于手机图库中。透过蓝牙?SPAN lang=EN-US>Memory Stick和红外线QP800得以得以擁有最強大的連接能力?/FONT>
P800可以播放手机原有的档案或透过|络下蝲的多媒体档案Q如q动比赛、音乐媄片或电媄预告片?SPAN lang=EN-US>P800也可作ؓ万用C本,处理使用者每天的作息Q如日历、电子邮件、通讯录和待办工作。所有功能都可与常用PC应用E序q行资料同步。此外,也可~辑览PowerPoint?SPAN lang=EN-US>Word?SPAN lang=EN-US>Excel的文件。透过蓝牙无线通讯技术,P800可以q接蓝牙x?SPAN lang=EN-US>PC或其它支持蓝牙的装置?/FONT>
P800的笔式操作界面,手写W置攑֜手机的左侧。用时Q可手机的拨号键盘拆下Q即可开始利用手写笔操控手机。而机背的数码相机拍下的照片可以当作来늛片,也可传送给他hQ充分展现出十的娱乐效果?/FONT>
P800使用Symbian最新版本的开攑ּ操作pȝSymbian OS V7.0Qƈl合UIQW式操作界面。由?SPAN lang=EN-US>P800采用开放性的架构Q所以用者能够下载以Java?SPAN lang=EN-US>C++撰写而成的企业应用程式或游戏软g。也是_用家可以Ҏ自己的情c随时可更新手机的应用程序和内容?/FONT>
P800的开放性不仅于此。它的整合式览器可用于Internet (HTML, xHTML, cHTML)?SPAN lang=EN-US>WAP。此外,支持GPRS?SPAN lang=EN-US>GSM 900/1800/1900三频通讯Q方便用家可以畅怺大洲160多个国家?/FONT>
在游戏功能方面,Sony Pictures Digital Entertainment所出品?SPAN lang=EN-US>Men In Black II能充分满玩家的需求。由?SPAN lang=EN-US>P800采用横式彩屏Q而且提供和铉铃声的音效,玩家玩游戏时会有意想不到的惊喜?SPAN lang=EN-US>P800中文版提供中文手写输入、中文输入法、字典、游戏和农历{多特D功能?/FONT>
索尼q?SPAN lang=EN-US> P908Q国外叫?SPAN lang=EN-US>p900Q?/FONT>
________________________________________
推荐cdQ?贉|?/FONT>
机——型Q?索尼q?/FONT> P908
参考h| 3400?/FONT>
艜y—彩Q?p色和银灰?/FONT>
——寸Q?SPAN lang=EN-US> 117×57×27mm
净——重Q?SPAN lang=EN-US> 130?/FONT>
通话旉Q?SPAN lang=EN-US> 350~780分钟
待机旉Q?SPAN lang=EN-US> 250~400时
上市旉Q?SPAN lang=EN-US> 2004q?SPAN lang=EN-US>1?/FONT>
推荐指数Q?★★★★?/FONT>
【功能介l?/FONT>
手机采用Symbian7.0pȝq_Q?SPAN lang=EN-US>C++?SPAN lang=EN-US>JavaTMSDK?/FONT>
P908的用户可用空间从q去P802?SPAN lang=EN-US>9MB增大C16MBQ同时基于对外接存储记忆的良好支持Q?SPAN lang=EN-US>P908的最大存储空间可以达?SPAN lang=EN-US>176MB的超大容量?/FONT>
P908q不仅仅是一部通话工具?SPAN lang=EN-US>P908的内|数码相机和丰富的多媒体功能可以带来影像世界的无I魅力?/FONT>
PDA功能让日怺务处理在“弹指”间L完成?/FONT>
强大的无U浏览功能让您随时“零距离接触”世界各个角落?/FONT>
宽屏三维游戏以及振动回应效果可以让手机游戏更逼真效果?/FONT>
【推荐理由?/FONT>
P908是烦爱立信l?SPAN lang=EN-US>P802之后又一ƾ超强智能手机, P908融移动电话、照相机、录像、多媒体播放器、快享及PDA于一体,拥有强大的无U功能,支持丰富的内容应用?/FONT>
作ؓP800/P802的后l者,P908对功能进行扩展,强化了移动多媒体和商务应用能力?SPAN lang=EN-US>P908的整体设计上着重强调的是金属质感,无论是线条硬朗的n轮廓q是镀铬的ȝ上都展现了这U思维?/FONT>
P908具备一个内|的30万数码摄像头Q可以拍摄大ؓ640×480?SPAN lang=EN-US>320×240?SPAN lang=EN-US>160×120像素的图片?/FONT>
最心的?SPAN lang=EN-US>P908q可以通过内置安全软g或者第三方VPN解决Ҏ接入到公司网l,所有诸如浏览、定制应用和电邮{的|络应用都可应用安全q接
symbian学习W记?SPAN lang=EN-US>
W二部分Q系l结?
?SPAN lang=EN-US>symbian os上运行的四种软g
应用E序
服务
引擎
内核
symbianpȝ使用zd对象与客?SPAN lang=EN-US>-服务器对事g处理pȝq行了优?/FONT>
g资源:
一?SPAN lang=EN-US>cpu,32?/FONT>arm
一?SPAN lang=EN-US>rom(只读存储?SPAN lang=EN-US>),里面有操作系l与内徏的中间g和应用程?/FONT>
ROM盘被映射?SPAN lang=EN-US>z:盘,所有的文g都可以通过Z:盘访问?/FONT>
pȝRAM.pȝRAM用于两个斚wQ一是被当前zd的程序和pȝ核心使用,另一个是当成?SPAN lang=EN-US>C”盘的磁盘空间。这两个部分的大是变化的,不可以保留某个的大小。由?SPAN lang=EN-US>RAM通常只有8MB?SPAN lang=EN-US>16MB,所以内存可能用完,因此l常出现内存界错误或是(写文件时)盘已满错误
IO讑֤,包括带数字笔输入的触摸屏Q键盘,记忆?SPAN lang=EN-US>(被当?SPAN lang=EN-US>D?SPAN lang=EN-US>)Q?SPAN lang=EN-US>rs232串口Q红外口Q蓝牙?/FONT>
甉|Q包括电池与外接甉|
symbian os?SPAN lang=EN-US>pcpȝ的区别如?/FONT>:
资源限制:cpu太慢与太内?/FONT>
没有盘,不能使用写到盘的虚拟内?SPAN lang=EN-US>,不能保证有够的I间保存E序或是数据文g
甉|条g严格.
symbian软g环境如下:
server | server| Application| Application | Application Dll
| | +————?SPAN lang=EN-US>+———?/FONT>- boundary
| | | |
| | | Enghine | Engine
——?SPAN lang=EN-US>+——?SPAN lang=EN-US>+———?SPAN lang=EN-US>+————?SPAN lang=EN-US>+————?/FONT> Privilege
boundary
Kernel
kernel工作在高U别Q管理机器所有硬件资源。对其它软g模块提供讉Kq些g资源的接?/FONT>
其它应用E序工作在用h?/FONT>
上面如果理解普通操作系l如linux的话Q那跟普通操作系l没有区?/FONT>
应用E序是一个有用户界面的程?SPAN lang=EN-US>,在独立的q程中运?/FONT>
q与普通操作系l也没有区别
服务是没有用L面的E序.服务理一个或多个资源Qƈ提供api,让客户可以访问它的服?SPAN lang=EN-US>.服务的客户可以是一个程序或是其它服?SPAN lang=EN-US>.每个服务也运行在独立的进E空间中?/FONT>
?SPAN lang=EN-US>symbian?SPAN lang=EN-US>,使用服务的Ş式提供类似其它操作系l上用驱动程序或是内核程序提供的功能。如文gpȝ的访问也是客?SPAN lang=EN-US>/服务cd的?SPAN lang=EN-US>(微内?/FONT>
引擎是一个应用程序中操作数据而不是与用户交互的部?SPAN lang=EN-US>.通常你可以把一个程序分成引擎部分和一?SPAN lang=EN-US>GUI部分,多部symbian内带的程序都是这样做的?/FONT>
一个应用程序引擎可以是一个独立的代码模块或是一个独立的dll,或是几个dll.
引擎和应用程序间的边界是模块?SPAN lang=EN-US>dll的边界?/FONT>
所以在symbian中有四个lgcd与三个边界类型?SPAN lang=EN-US>dll或是模块lg对交叉引用来说很方便。它们ɾpȝ模块化与保持装?/FONT>
权限边界对交叉引用比较费资源Q但是保证系l对用户太程序隐藏内怸讑֤
q程边界是所有的交叉中最昂贵的,它们保证?SPAN lang=EN-US>ram中分开每个E序
可执行文件的格式
?SPAN lang=EN-US>symbian中有两种cd的可执行文g:
exe,每个E序都有一个主入口E32main()(看上面的例子),它在独立的进E中q行
dll,提供多个入口Q由pȝ或是已存在的U程(q程)调用
有两U类型的dll,
׃n?SPAN lang=EN-US>dll,Z个或多个E序提供固定?SPAN lang=EN-US>api,q些dll多数后缀?SPAN lang=EN-US>.dll,当程序启动时pd内存中?/FONT>
多?SPAN lang=EN-US>dll,q些dll实现抽象?SPAN lang=EN-US>api,如一个打印机驱动Q?SPAN lang=EN-US>socket协议或是一个应用程序。它们的扩展名多不是.dll,而是.prn?SPAN lang=EN-US>.prt?SPAN lang=EN-US>.app{。它们从?SPAN lang=EN-US>dll相关的类l承Qƈ通常只有在程序需要它们时才读入?/FONT>
从技术上看v来与普通系l上动态库的静态蝲入与动态蝲入没有区?/FONT>
但是从功能上看就不一样了Q一U是实现某种Ҏ功能的,从某个相关类l承?SPAN lang=EN-US>dll,另一个是普?/FONT>dll
代码执行
如果E序代码?SPAN lang=EN-US>rom上,则直接执?SPAN lang=EN-US>,不然需要读?SPAN lang=EN-US>ram?SPAN lang=EN-US>(与普通操作系l不同,普通操作系l都需要读?SPAN lang=EN-US>ram?/FONT>
不能直接在硬盘上执行)
可执行代码包括三U类型的二进制数?/FONT>:
E序代码
只读静态数?/FONT>
可写静态数?/FONT>
?SPAN lang=EN-US>symbian中对?SPAN lang=EN-US>.exe?SPAN lang=EN-US>.dll是不同的
׃.exe是不可共享的,如果它在ram中执行,那与普?SPAN lang=EN-US>pcpȝ没有区别,如果?SPAN lang=EN-US>ram中执行,那它?SPAN lang=EN-US>ram中ؓ可写静态数据分配内?/FONT>
?SPAN lang=EN-US>.dll是共享的Q当dll首次d内存中时Q它被分配到一个特D的地址Q第二个U程需要这?SPAN lang=EN-US>dll时它只要讉K已经存在的这?SPAN lang=EN-US>copy可以。在所有用它的进E中dll的地址都是相同的?SPAN lang=EN-US>symbianpȝl护一个引用计敎ͼ当没有其它线E引用时才将?/FONT>unload.
?SPAN lang=EN-US>rom上的dll?SPAN lang=EN-US>rom上的exe一L接在rom上执?/FONT>
Z?SPAN lang=EN-US>dll的大进行优化,symbbianq行如下操作;
多数pȝ支持通过名字与通过数字讉Kdll提供的入口,׃名字太长Q浪费空_所?SPAN lang=EN-US>symbian只提供通过数字讉KQ当然在link时可以通过名字link.也就是说?SPAN lang=EN-US>.dll中没有名字访问办法,?SPAN lang=EN-US>.lib(引导库,引导linker正确?SPAN lang=EN-US>linkq个dll,q个是在windows中用的概念Q在win下每创徏一?SPAN lang=EN-US>dll都会创徏一个用户引导链接的同名.lib)中有,你的E序link?SPAN lang=EN-US>link的是.lib,link完成后编译器会自动把引用dll的代码变成数字引?/FONT>
如果dll被读?SPAN lang=EN-US>ram,那重定位信息(?/FONT>dll
loadC么地址)也必d含在可执行文件格式中,q个的媄响就是你不能把一个在rom中执行的E序攑ֈram中执行的E序.(rom中执行的多是oem厂家,所以普通开发者多不用兛_)
多数应用E序有自己有exe来创E,其它的程序用动态库(DL)L的Ş式,在主服务U程中调用自qU程
多数guiE序都是多?SPAN lang=EN-US>(polymorphic)dll,有一个主入口?SPAN lang=EN-US>NewApplication(),q个入口点创建ƈq回一个承自CEikAppication的对?SPAN lang=EN-US>.q样的程序被apprun.exe调用Q?SPAN lang=EN-US>app文g名ؓ参数传入?/FONT>
甉|理
甉|必须高效使用
在系l已l关机时Q确定程序仍然可以运行。如闚wQ关机后Q到时时仍然可以开?/FONT>
甉|H然xӞ关键数据应该可以保存
讑֤驱动
虽然一般不会了解它Q但是理解一下还是很有用?/FONT>
讑֤驱动工作在两个?/FONT>
W一个是中断服务E序(ISR)Q?SPAN lang=EN-US>ISR必须很短Qƈ且不能做很多事情Q因为它可能在Q何时间出玎ͼ甚至在内核服务中。通常它只是通知讑֤产生了中断ƈ讄一个标志,要求内核为第二阶D늚处理q行一个gq的函数调用(delayed function call DFC)
在方便的时候内核调?SPAN lang=EN-US>DFC.DFC可以使用多数的核?SPAN lang=EN-US>api,通常只是工作了后向用LE通知io操作已经完成
定时?/FONT>
` 内核支持真机?SPAN lang=EN-US>64hz的时钟与模拟器上10hz的时?/FONT>
旉中断是最高优先中断Q它可以通过User::After或是RTime::After讉K。时钟中断在x时停止,所以如果你h5s后的定时操作Q然后跑2s,xQ再开机时它也要等3s
内核同时支持日期/旉旉Q你可以使用User::At或是RTime::At。这个定时器很准。在xӞ如果旉CQ那它会开机,q对闚w很合适?/FONT>
内存
symbian使用内存理单元(memory management unit MMU)理内存
ROM被映到z:盘,被映到一个固定的地址?/FONT>
物理RAM?SPAN lang=EN-US>MMU分在4k的页,每个物理可以用?/FONT>:
用户q程的虚地址I间?/FONT>
内核服务的虚地址I间
ram盘,盘符?SPAN lang=EN-US>c:,ram盘只可通过文g服务q程讉K
如果dll不在rom中,那它被读?SPAN lang=EN-US>ram,dll被读?SPAN lang=EN-US>ram里面后页面标Cؓ只读只读的?/FONT>
MMU的页面{换表.如果想理解的话学习一下操作系l原?/FONT>
自由表
每个q程的地址I间可以分成下面三类:
pȝ范围的内存,如系l的rom或是dram中的dll
q程范围的内存,如进E的.exe映象和它的可写的静态数?/FONT>
每个U程的内?SPAN lang=EN-US>,包括U程的栈与线E默认的?SPAN lang=EN-US>(使用U程默认堆的原因只是Z提高内存分配与释攄速度Q从开发角度来看,它与pȝ里面的内存没有区?SPAN lang=EN-US>)?/FONT>
注意没有交换文gQ所以所有的内存都是直接使用。同Ӟ也可能会发生内存不够或是盘(c
每个U程的默认栈很小Q只?SPAN lang=EN-US>12k,所以在symbian开?/SPAN>中,不要攑֤多东西到栈中,一般对象都是在堆中分配的?/FONT>
U程创徏后,它的栈大就不可再改变?/FONT>
U程可以使用new或是User::Alloc从线E默认堆中分配内?SPAN lang=EN-US>.如果希望从其它堆中分配内存,只能使用new
动态库(DLL)
symbian?SPAN lang=EN-US>dll不支持可写的静态数?SPAN lang=EN-US>,所以你在里面不可能使用可写的全局变量或是静态变?/FONT>.
Z么不支持?SPAN lang=EN-US>?如果支持Q那每个q程调用q个dllӞ都需要ؓq个q程分配一个独立的堆,而堆最单位是4k,pȝ中有很多堆,q且有很多程序,所以内存消费基金是很大的。所以就不支持了
q样开发时不是很不方便Q因为在dll中有旉要保存自q状态,q行交互
Z解决q个问题Q?SPAN lang=EN-US>symbian中引入了U程本地数据(thread-local storage
TLS)概念(查看Dll::Tls
Dll;;SetTls)。但是调?SPAN lang=EN-US>TLS性能比较?SPAN lang=EN-US>.tls的最大大是1.8k 通常q够用了?/FONT>
文g:
c: flash ram?/FONT>
z: rom?/FONT>
d: 记忆之cȝ外挂?/FONT>
事g处理
事g处理模型如下?/FONT>:
keyborad |————————?/FONT>
|interrupt
|
kernel/driver?/FONT>+-isr/dfc
|
key event
|
|
window serv—?SPAN lang=EN-US>handle key event———?/FONT>+update window
| |
|key event draw |request
application +—————?SPAN lang=EN-US> handle ——?/FONT>-+
key event
?SPAN lang=EN-US>symbian中用活动对象(active objectQ来处理事g
?SPAN lang=EN-US>symbian os中,所有的symbian
osU程都是事g处理器,每个U程有一个活动调度对?SPAN lang=EN-US>,加上一个或多个zd对象来处理从讑֤或其它程序发q来的事件?/FONT>
每个zd对象都有一个虚拟的成员函数RunL(),在这个函数里面处理事件?/FONT>
多Q务与抢占?/FONT>
symbian os实现抢占式多U程?/FONT>
zd对象用于在单个线E内实现非抢占式多Q?SPAN lang=EN-US>
symbian学习W记一
W一部分: hello worldE序解说
symbian的不同点:
需要自己处理下面的事情:
trap harness,cleanup stack,leave,heap marking
也就是需要自p行错误检?/FONT>,
׃没有异常机制Q所?SPAN lang=EN-US>symbian使用cleanupstack处理异常
TRAP宏像?SPAN lang=EN-US>catch(?SPAN lang=EN-US>) 函数名带L的像?/FONT>throw
最后只要在E32Main里面使用一?SPAN lang=EN-US>TRAP可以了 q样保证内存没有L
对于c字符Ԍ需要?SPAN lang=EN-US>_L把它转换?SPAN lang=EN-US>symbain使用的描q?/FONT>
symbian是面向对象的Q所以对多数c库函数进行了装,?/FONT>printf
symbian的入口是E32Main函数
GLDEF_C宏表C个函数是模块的接?/FONT>
׃c中没有规定基本类型的长度Q?SPAN lang=EN-US>symbian使用typedef重定义了基本cd,?SPAN lang=EN-US>TInt16表示16?/FONT>int
~译:
工程定义文g
可以使用codewarrior或是gcc~译,我们把编译相关信息放在工E定义文件中(扩展名ؓ.mmp,makmake project),q用其它工hmmp文g变成makefile或是其它环境?SPAN lang=EN-US>(?SPAN lang=EN-US>codewarrior)的工E文?SPAN lang=EN-US>.下面?SPAN lang=EN-US>hellotext.mmp的内?/FONT>:
// hellotext.mmp
TARGET HelloText.exe
TARGETTYPE exe
SOURCEPATH .
UID 0
SOURCE hellotext.cpp
USERINCLUDE .
SYSTEMINCLUDE epoc32include
LIBRARY euser.lib
TARGET表示生成的可执行文g的名字,TARGETTYPE表示生成的文件的cd,q里?/FONT>exe
UID?SPAN lang=EN-US>GUIE序很重要,q里讄?/FONT>0
SOURCEPATH表示源文?SPAN lang=EN-US>(.cpp)的目?/FONT>
SOURCE指明源文件名
USERINCLUDE?SPAN lang=EN-US>SYSTEMINCLUDE表示用户自己声明的头文g与系l头文g的目?/FONT>
通常我们都需要把SYSTEMINCLUDE声明?/FONT>epoc32include
LIBRARY声明需要链接的?SPAN lang=EN-US>,一般需?SPAN lang=EN-US>E32用户库就可以,也就?/FONT>euser.lib
lg定义文g
symbian需要一个组件定义文Ӟq个文g名字Lbld.inf,在这个文件中包含所有的工程定义文g(mmp),更复杂的情况下会包括其它相关信息
下面?SPAN lang=EN-US>hellotext?/FONT>
// BLD.INF
PRJ_MMPFILES
hellotext.mmp
~译
cd scmphellotext
bldmake bldfiles
上面的命令会?SPAN lang=EN-US>scmphellotext下生?SPAN lang=EN-US>abld.bat文g,同时会创?SPAN lang=EN-US>epoc32buildscmphellotext目录
abld build winscw udeb
winscw表示生成codewarrior(cw)模拟?/FONT>(win
simulator)的工E文?SPAN lang=EN-US>,udeb表示创徏unicode?SPAN lang=EN-US>debug版本
build分下面六个步?/FONT>:
exportq程复制输出文g到它们的目标,一般会把通用头文件复制到epoc32include,多数应用E序在这步不需要Q何操?/FONT>
makefile阶段生成必须?SPAN lang=EN-US>makefile?SPAN lang=EN-US>ide的工作空?SPAN lang=EN-US>(?SPAN lang=EN-US>vc?SPAN lang=EN-US>dsp文g)
库阶D创入库
资源阶段创徏应用E序的资源文?SPAN lang=EN-US>,位图和应用程序信息文?/FONT>(aufs)
目标阶段生成应用E序的主执行文g
最后阶D|行Q何最后的操作Q多数程序这里不需?/FONT>
q些阶段都有选项?SPAN lang=EN-US>abld工具中,可以使用abld help得到各选项内容
最后结果放?SPAN lang=EN-US>epoc32releasewinscwudebhellotext.exe,你可以在那里双击?/FONT>
自己的操作如?/FONT>
bldmake bldfiles @UIQ_21:com.symbian.UIQ
abld build wins udeb @UIQ_21:com.symbian.UIQ
然后q行epoc32releasewinscwudebhellotext.exe
使用@UIQ_21:com.symbian.UIQ的原因是因ؓ没有讄EPOCROOT环境变量,q且安装了两?SPAN lang=EN-US>symbian环境一个安装在C:SymbianUIQ_21
创徏手机上运行的E序
abld build armi urel
创徏安装文g
?SPAN lang=EN-US>scmphellotext下运?/FONT>
makesys hellotext.pkg
q将会生?SPAN lang=EN-US>hellotext.sis,你可以把它上传到手机?BR>
如何L和连接到q程讑֤
当一个应用程序连接到q程讑֤以便应用其某个服务时Q我们需要几个步骤:首先看看是否有想要与之通信的设备。然后察看所需要的服务是否可用。最后,应用E序需要进行连接,另外可能q需要进行些安全措施
下面几个主题依ơ介l相x骤:
选择q程讑֤的方?/FONT>
如何查询q程讑֤
如何查询q程讑֤上的服务
如何同远E设备连接和传输数据
如何在外q的套接字上应用安全措施
选择q程讑֤的方?/FONT>
一个应用程序能通过下列Ҏ军_哪个q程讑֤是他通信的对象:
· 固定的连?SPAN lang=EN-US>
· 实现存储的配|?SPAN lang=EN-US>
· q户选择
· E序自动军_
上面每一个都可能由它合适的情况。前两个Ҏ中,q端讑֤的地址只需要简单的从存储出取出。而第三种Ҏ则普遍在蓝牙UI中提供?SPAN lang=EN-US>
最后一U程序自动选择q程讑֤中,可能在下列情况中应用Q?SPAN lang=EN-US>
· 为用h供可定制的设备选择UI
· 在某些特别情况下选择讑֤Q比如“选择最I闲?SPAN lang=EN-US>LAN接入点?SPAN lang=EN-US>
如何查询q程讑֤
每个蓝牙讑֤在其g中都有唯一?SPAN lang=EN-US>48位地址。一个范围内基本的设备查询将q回零或几个此类地址?SPAN lang=EN-US>
除了q个地址Q蓝牙设备也q有一个文本名字显C给用户。如果你希望昄可用讑֤的列表给用户Q你也要获取q些名字以便昄?SPAN lang=EN-US>
如果底层g支持Q地址和名字也可以同时被查询。否则,地址的查询必d名字查询h发送前完成
泛化套接字类RhostResolver用来完成地址和设备名的查询。另?SPAN lang=EN-US>TinquirySockAddrZ门的蓝牙套接字地址c,里面装了蓝牙地址Q查询入口代码,用来提供相关查询的服务和讑֤cR?SPAN lang=EN-US>
获得q程讑֤的地址
下面步骤用来查询q程讑֤的地址Q?SPAN lang=EN-US>
1. q接到套接字服务?SPAN lang=EN-US>(RSocketServ)Q然后用RSocketServ::FindProtocol()选择使用的协议。由于名字和地址的查询由堆栈?SPAN lang=EN-US>BTLinkManager协议层支持,所以选择它?SPAN lang=EN-US>
2. 创徏q初始化一?SPAN lang=EN-US>RhostResolver对象?SPAN lang=EN-US>
3. 讄TinquirySockAddr参数以便查询Q对于地址查询Q?SPAN lang=EN-US> KHostResInquiry标志需要通过TInquirySockAddr::SetAction()讄好?SPAN lang=EN-US>
然后可以通过RHostResolver::GetByAddress()开始查询?SPAN lang=EN-US>
如何查询q程讑֤的服?/FONT>
一个远E设备可以有一个或者多个蓝牙服务提供者。服务的q泛指示器可以从讑֤的类中读出。这样可以用来选择合适的讑֤图标现实l用戗这个设备的cd以在查询地址后用TInquirySockAddr::MajorClassOfDevice()获得?SPAN lang=EN-US>
在特定环境,讑֤的类提供的粗U别的服务发现ƈ不能满对设备的选择条g。这Pq样Q服务发现请求可以用来判断是否ؓ适合的选择。但只有在必需的时后才应该应用Q因为它需要一些额外时间来Ҏ个设备进?SPAN lang=EN-US>SDPh?SPAN lang=EN-US>SDPh通过蓝牙发现代理API来进行?SPAN lang=EN-US>
如何同远E设备连接和传输数据
一旦设备和服务定了,你就能够q接到远E设备ƈ开始用了
通过泛化?SPAN lang=EN-US>Symbian OS套接字借口Rsocket?SPAN lang=EN-US>Connect()函数q接到设备。蓝牙套接字可以?SPAN lang=EN-US>L2CAP?SPAN lang=EN-US>RFCOMM协议打开。对于一?SPAN lang=EN-US>L2CAP蓝牙套接字,端口Q?SPAN lang=EN-US>portQ是用来q接的协?SPAN lang=EN-US>/服务多\复用?SPAN lang=EN-US> (PSM)Q对?SPAN lang=EN-US>RFCOMM,端口是服务器频道。如果这些g知道Q可以通过d服务属?SPAN lang=EN-US>ProtocolDescriptorList来获得。详情参见用蓝牙服务发C?SPAN lang=EN-US>
你能够通过套接字用目标服务期望的格式d数据Q?SPAN lang=EN-US>AT指oQ文本,HTTPQ?SPAN lang=EN-US>PPP{)
举例Q?/FONT>
// Assume have a TInquirySockAddr object, addr, with relevant device info
// Connect an L2CAP socket
RSocket socket;
TRequestStatus status;
User::LeaveIfError(socket.Open(socketServ,KBTAddrFamily,KSockSeqPacket,KL2CAP));
User::LeaveIfError(socket.Connect(addr,status));
User::WaitForRequest(status);
if (status == KErrNone)
{
// Write some simple data
_LIT8(KDataToWrite,"01234");
socket.Write(KDataToWrite,status);
User::WaitForRequest(status);
}
// Close socket
socket.Close();
注意Q?/FONT>
· 对于RFCOMM?SPAN lang=EN-US>L2CAP协议Q没有数据可以在Connect() ?SPAN lang=EN-US>Shutdown() 调用中送出Q否则会D获得额外数据的错误?SPAN lang=EN-US>
· RFCOMM使用套接字cdQ?SPAN lang=EN-US>KSockStreamQ?SPAN lang=EN-US>
· L2CAP使用序列包的套接字类?Q?SPAN lang=EN-US>KsockSeqPacketQ?SPAN lang=EN-US>
如何在外q的套接字上应用安全措施
对于一个外q接Q?SPAN lang=EN-US>outgoing connectionQ,默认情况下蓝牙堆栈不会由具体的安全措施。如果远E设备需要认证或~码q接Q那堆栈会直接体现到应用E序?SPAN lang=EN-US>
有时候,本地E序也需要保证认证或~码q接。可以对RSocket用控制操作(ioctlsQ来认证(ioctl KHCIAuthRequestIoctl) 或者编?SPAN lang=EN-US> (KHCIEncryptIoctl) q接?SPAN lang=EN-US>
举例
下面的例子就对认证h应用?SPAN lang=EN-US>ioctl
// Assume have an opened L2CAP RSocket object, socket
socket.Ioctl(KHCIAuthRequestIoctl, status, NULL, KSolBtHCI);
User::WaitForRequest(status);
if (status==KErrNone)
{
\\ Success...
ps: 偶也在学习中Q如有错误请多指教?SPAN lang=EN-US>
ini文g的创?SPAN lang=EN-US>
创徏ini文gQ?/SPAN>
void CFrozenBubbleAppUi::WriteIniFile(TUid iInfo, void *ptr, TUint size){
TInt r;
RFs fs;
fs.Connect();
CleanupClosePushL( fs );
RDictionaryWriteStream rdsIniFile;
CDictionaryStore *cdIniFile = Application()->OpenIniFileLC(fs);//如果不存在就创徏
rdsIniFile.AssignLC(*cdIniFile, iInfo);
TPtr8 buf((TUint8*)ptr, size, size);
TRAP(r, rdsIniFile.WriteL(buf));
rdsIniFile.CommitL();
CleanupStack::PopAndDestroy();
cdIniFile->CommitL();
CleanupStack::PopAndDestroy( 2 );
}
?SPAN lang=EN-US>ini文gQ?/SPAN>
TBool CFrozenBubbleAppUi::ReadIniFile(TUid iInfo, void *ptr, TUint &size){
TInt r;
TBool result = EFalse;
RFs fs;
fs.Connect();
CleanupClosePushL( fs );
RDictionaryReadStream rdsIniFile;
CDictionaryStore *cdIniFile = Application()->OpenIniFileLC(fs);
if (cdIniFile->IsPresentL(iInfo)){
rdsIniFile.OpenLC(*cdIniFile, iInfo);
TPtr8 buf((TUint8*)ptr, size);
TRAP(r, rdsIniFile.ReadL(buf));
CleanupStack::PopAndDestroy(); // rdsIniFile
result = ETrue;
}
CleanupStack::PopAndDestroy( 2 ); // fs, cdIniFile
return result;
}
Symbian OSQ线E编E中文版
虽然symbian操作pȝ中对多Q务的实现更提倡用活动对象,但多U程也是非常有用的技术,当移植程序、后台大量复杂运或多媒体编E时Q?SPAN lang=EN-US>threads都是必不可少的?SPAN lang=EN-US>symbian中的thread~程和一般的多线E编E差不多Q下面就来看看具体文档中是如何描q的Q?/FONT>
?SPAN lang=EN-US>Symbian OSQ线E编E?/FONT>
Symbian操作pȝ中的U程和进E?/FONT>
?SPAN lang=EN-US>Symbian操作pȝ中,每个q程都有一个或多个U程。线E是执行的基本单位。一个进E的ȝE是在进E启动时生成的?/FONT>
Symbian属于抢占式多d操作pȝQ这意味着每个U程都有自己的执行时_直到pȝ?SPAN lang=EN-US>CPU使用权给予其他线E。当pȝ调度Ӟh最高优先权的线E将首先获得执行?/FONT>
q程边界是受内存保护的。所有的用户q程都有自己的内存地址I间Q同一q程中的所有线E共享这一I间Q用戯E不能直接访问其他进E的地址I间?/FONT>
每个U程都有它自qstack?SPAN lang=EN-US>heapQ这?SPAN lang=EN-US>heap可以是私有的Q也可以被其他线E共享。应用程序框架生成ƈ安装了一?SPAN lang=EN-US>active schedulerQƈ且ؓȝE准备了清除栈。如果没有用框Ӟ如编?SPAN lang=EN-US>exeE序Q那p手动生成q些了:Q?/FONT>
Symbian操作pȝ专ؓ单线E应用优化,因此强烈推荐使用“活动对象”代替多U程?/FONT>
[使用单线E的优点]
在每个线E都有自qstackI间Ӟ使用单线E可以减内存耗费?/FONT>
在线E间切换上下文要比切换活动对象(通过active schedulerQ慢得多?/FONT>
不需要处理互斥现象,q减了E序的负担,化了代码Q减了错误发生的几率?/FONT>
一些资源只能ؓȝE所用,因此它们q不是线E安全的Q如动态数l?/FONT>
[使用多线E的优点]
有时Z保证所执行的Q务的持箋性,如播攑֣xQ我们可以将其归在一个单独的U程中处理?/FONT>
复杂的多线E或长时间运行程序移植到Symbian上,如果不用多U程处理Q可能会比较难也更耗时间?/FONT>
Q题外话Q我曄一个棋cȝ序移植到symbian上,里面复杂的递归q算使我不得不用多U程Q这L情况下,你是很难时间有序的分化开来,使用zd对象的)
[U程的基本用方?/FONT>]
RThread提供了线E的各项功能。线E是为内核所拥有的对象,RThread对象装了这些对象的句柄?/FONT>
1、生成一个新U程
新的U程可以通过构造一?SPAN lang=EN-US>RThread对象Qƈ调用它的Create()函数生成。如Q?/FONT>
Code:
1: TInt threadFunction(TAny *aPtr)
2:
7:
8: RThread thread;
9: thread.Create(KThreadName, threadFunction, 4096,
10: KMinHeapSize, 256*KMinHeapSize, &iParameter);
11: thread.Resume();
2、线E状?/FONT>
一个线E的最重要的状态ؓq行、准备、等待和暂停。在生成后,U程首先处于暂停状态,你可以调?SPAN lang=EN-US>Resume()函数来启动它的运行。一个线E也可以通过调用Suspend()来进入中断状态?/FONT>
U程一般通过Kill(TInt aReason)来结束,Terminate()与其怼。如果一个进E的ȝE结束,则该q程与所属所有线E都结束?/FONT>
一U非正常关闭U程的方式就是调?SPAN lang=EN-US>Panic(const TDesC& aCategory, TInt aReason)来中断执行?/FONT>
如何获得中断U程的信息呢Q我们可通过ExitType()Q?SPAN lang=EN-US>ExitReason()以及ExitCategory()Ҏ来获得?/FONT>
U程可以在中断时发出hQ我们通过调用异步ҎLogon()来完成此d。返回值在aStatus中?SPAN lang=EN-US>LogonCancel()可以取消前次h?/FONT>
void Logon(TRequestStatus& aStatus) const;
TInt LogonCancel(TRequestStatus& aStatus) const;
我们可以通过SetProtected(ETrue)Ҏ线E保护v来,也可以通过SetProtected(EFalse)来取消保护。在保护Ӟ另一个线E是无法中断、结束、异怸断或讄该线E的优先U的?SPAN lang=EN-US>Protected()Ҏ可以q回该线E的保护状态?/FONT>
3、访问线E及q程
我们可以通过构造一?SPAN lang=EN-US>RThread对象来访问当前线E?SPAN lang=EN-US>Id()Ҏ可以q回改线E的ID?/FONT>
拥有此线E的q程可以通过讉KRThread?SPAN lang=EN-US>Process(RProcess& aProcess)Ҏ来获得。这里传入的参数应该是一?SPAN lang=EN-US>RProcess对象?/FONT>
其他U程可以通过Open()Ҏ来访问。我们通过传?SPAN lang=EN-US>TThreadId、线E名U或TFindThread对象来打开U程?/FONT>
TInt Open(const TDesC& aFullName, TOwnerType aType=EOwnerProcess);
TInt Open(TThreadId aID, TOwnerType aType=EOwnerProcess);
TInt Open(const TFindThread& aFind, TOwnerType aType=EOwnerProcess);
Code:
1: // * as a wildcard for the name search
2: _LIT(KFindAll, ?SPAN lang=EN-US>*?/FONT>);
3: // default RThread object, has a handle of the current thread
4: RThread thread;
5: TFullName fullName;
6: TFindThread finder(KFindAll);
7:
8: while (finder.Next(fullName) == KErrNone)
9:
Q未完待l)
BestRegards
hoolee
hoolee
View Public Profile
Send email to hoolee
Find all posts by hoolee
Add hoolee to Your Buddy List
#2 2005-04-28, 08:20
hoolee
Registered User Join Date: Mar 2005
Posts: 1,037
4、线E优先
U程可以被赋予一个绝Ҏ相对的优先。绝对优先定义了这个线E的M优先U,不需要考虑其拥有者进E的优先U了。而赋予相对优先时则此U称定义为拥有者进E的优先U加上该相对优先U后的结果?/FONT>
下面_体标示的优先值可以由用户代码讄Q?/FONT>
Code:
enum TProcessPriority
;
enum TThreadPriority
;
上面枚D出来的gl对优先UgؓQ?/FONT>
EPriorityAbsoluteVeryLow, EPriorityAbsoluteLow, EPriorityAbsoluteBackground, EPriorityAbsoluteForeground, EPriorityAbsoluteHigh.
相对优先UgؓQ?/FONT>
EPriorityMuchLess, EPriorityLess, EPriorityNormal, EPriorityMore, EPriorityMuchMore.
EPriorityNull是一个特D|它定义了最低的U别Q?SPAN lang=EN-US>Kernel idel thread使用的就是它*_*
EPriorityRealTime定义了除核心服务U程优先U外最高的M优先U?/FONT>
RThread中的Priority()Ҏq回了一个线E的优先U(按以上描q|。我们也可以通过SetPriority(TThreadPrioriy aPriority)Ҏ来修改优先?/FONT>
ProcessPriority()Ҏq回了拥有该U程之进E的优先U(?SPAN lang=EN-US>TProcessPriority描述|。我们也可以通过SetProcessPriority(TProcessPriority)Ҏ来修改该q程的优先?/FONT>
5、异常处?/FONT>
每个U程都有自己的异常处理模块。当U程发生异常时会调用异常处理模块。异常处理模块的a型为:
typedef void TExceptionHandler(TExcType);
RThread包含了下列异常处理相关的ҎQ?/FONT>
TExceptionHandler* ExceptionHandler()
q回该线E当前异常处理模块的地址?/FONT>
TInt SetExceptionHandler(TExceptionHandler* aHandler, TUint32 aMask);
定义了该U程新的异常处理模块的地址Q以及它所处理异常的类别?/FONT>
void ModifyExceptionMask(TUint32 aClearMask, TUint32 aSetMask)
修改异常处理模块所定之异常cdQ?SPAN lang=EN-US>aClearMask参数定义了不再ؓ异常处理模块所处理的类别,?SPAN lang=EN-US>aSetMask则定义了新的处理cd?/FONT>
TInt RaiseException(TExcType aType);
引发U程上指定类型的异常Q这时异常处理模块将被启动执行(发生在调用之后)?/FONT>
TBool IsExceptionHandled(TExcType aType);
查线E的异常处理模块是否捕捉?SPAN lang=EN-US>aTypecd的异常?/FONT>
(1)异常cd及类?/FONT>
异常cd是一l针对单个异常的cd识别Q主要用在异常发生时?/FONT>
异常cd则代表一l异常Ş式?/FONT>
异常cd的一个集是由一个或多个异常cd通过OR形式l合成的Q如KExceptionInteger|KExceptionDebugQ这些值用来设|及修改异常处理模块所处理的类别?/FONT>
下面列示了所有的cd及类别?/FONT>
异常cd 异常cd
KExceptionInterrupt ->EExcGeneral, EExcUserInterrupt
KExceptionInteger ->EExcIntegerDivideByZero, EExcIntegerOverflow
KExceptionDebug->EExcSingleStep, EExcBreakPoint
KExceptionFault ->EExcBoundsCheck, EExcInvalidOpCode, EExcDoubleFault, EExcStackFault, EExcAccessViolation, EExcPrivInstruction, EExcAlignment, EExcPageFault
KExceptionFpe ->EExcFloatDenormal, EExcFloatDivideByZero, EExcFloatIndexactResult, EExcFloatInvalidOperation, EExcFloatOverflow, EExcFloatStackCheck, EExcFloatUnderflow
KExceptionAbort ->EExcAbort
KExceptionKill->EExcKill
Q未完等l)
BestRegards
hoolee
hoolee
View Public Profile
Send email to hoolee
Find all posts by hoolee
Add hoolee to Your Buddy List
#3 2005-04-28, 09:56
zaohuzi888
Member Join Date: Mar 2005
Posts: 5
_ֽ?/FONT>
--------------------------------------------------------------------------------
不知道后面的什么时候推?SPAN lang=EN-US>,很期待哦
zaohuzi888
View Public Profile
Send email to zaohuzi888
Find all posts by zaohuzi888
Add zaohuzi888 to Your Buddy List
#4 2005-04-29, 09:36
hoolee
Registered User Join Date: Mar 2005
Posts: 1,037
6、其他线E函?/FONT>
TInt Rename(const TDesC& aName)
为线E定义个新名字?/FONT>
void RequestComplete(TRequestStatus*& aStatus, TInt aReason)
通知U程与一个异步请求绑定的h状态对?SPAN lang=EN-US>aStatus已綺完成?SPAN lang=EN-US>sStatus完成代码负责设|?SPAN lang=EN-US>aReason及发出线E请求信L通知?/FONT>
TInt RequestCount()
q回U程h信号的数目。如果是负值则表示该线E正在等待至一个异常请求的完成?/FONT>
void HandleCount(TInt& aProcessHandleCount, TInt& aThreadHandleCount)
得到U程中及拥有该线E的q程中处理模块的数目?/FONT>
RHeap* Heap()
q回一个指向改U程堆的指针?/FONT>
TInt GetRamSizes(TInt& aHeapSize, TInt& aStackSize)
得到该线E中堆和栈的大小?/FONT>
TInt GetCpuTime(TTimeIntervalMicroSeconds& aCpuTime)
得到改线E所分配到的CPU旉
void Context(TDes8& aDes)
得到该线E( sleeping状态)所注册的上下文环境?/FONT>
4、线E内部的通信
1)׃n内存
在线E间交换信息最直接的方法就是用共享内存。线E入口函C有一个参?SPAN lang=EN-US>TAny* aPtrQ这个指针可以用于Q何目的。通常可以用它来传递一个负责线E间׃n信息的数据结构或cd例。因为同一q程中的U程是共享内存地址I间的,因此q里指针所指向的数据可以被两个U程所׃nQ注意访问该数据时必L同步形式?/FONT>
另外q里的指针参数可以?SPAN lang=EN-US>SetInitialParameter(TAny* aPtr)Ҏ来改变,但这时线E应处于suspend状态?/FONT>
2)Client/Server API
Symbian操作pȝ提供了一l基?SPAN lang=EN-US>server/session?SPAN lang=EN-US>APIQ允怸个线E扮?SPAN lang=EN-US>server的角Ԍ向其他线E或q程提供服务。这?SPAN lang=EN-US>API也提供处理一l方法处理信息的传递,异步以数据传输?/FONT>
3)q程内数据传?/FONT>
如果两个U程分属不同的进E,则他们无法直接管理需要通信的数据,因ؓ他们没有׃n的数据区。这里可以?SPAN lang=EN-US>RThread提供?SPAN lang=EN-US>ReadL()Ҏ?SPAN lang=EN-US>WriteL()ҎQ我们可以用来在当前U程和由RThread提供的另一个线E间的地址I间拯8/16位的数据。这里当前线E和另一个线E可以归属同一个进E也可分属不同进E?/FONT>
数据的传输是通过拯数据来完成的Q?SPAN lang=EN-US>RThread提供了方法返回在它地址I间内一?SPAN lang=EN-US>descriptor的长度及最大允讔R度?/FONT>
a>d另个U程所提供?/FONT>descriptor
void ReadL(const TAny* aPtr,TDes8& aDes,TInt anOffset) const;
void ReadL(const TAny* aPtr,TDes16 &aDes,TInt anOffset) const;
q里ReadL()Ҏ从另一个线E的descriptor(?SPAN lang=EN-US>aPtr所?SPAN lang=EN-US>)中拷贝一l数据,传递到当前U程?SPAN lang=EN-US>descriptor(?SPAN lang=EN-US>aDes所?SPAN lang=EN-US>)?/FONT>
aPtr指针必须指向一个在RThread句柄所指线E的地址I间中有效的descriptor?/FONT>
从源descriptor中的内容是从anOffset位置那里开始拷贝到目的descriptorQ?SPAN lang=EN-US>aDesQ的?/FONT>
b)向另个线E写?/FONT>descriptor
void WriteL(const TAny* aPtr, const TDesC8& aDes, TInt anOffset) const;
void WriteL(const TAny* aPtr, const TDesC16& aDes, TInt anOffset) const;
用这个方法将当前U程descritor(aDes)所提供的数据都拯在另一个线E?SPAN lang=EN-US>(aPtr所?SPAN lang=EN-US>)?SPAN lang=EN-US>descriptor中。这?SPAN lang=EN-US>anOffset参数讑֮了目?SPAN lang=EN-US>descriptor的初始化拯位置?/FONT>
aPtr为线E地址I间内有效的可修?SPAN lang=EN-US>descriptor?/FONT>
如果拯q去的数据长度超q目?SPAN lang=EN-US>descriptor的最大长度,则函C发生异常?/FONT>
c)Descriptor帮助函数
TInt GetDesLength(const TAny* aPtr) const;
TInt GetDesMaxLength(const TAny* aPtr) const;
q里RThread?SPAN lang=EN-US>GetDesLength()Ҏ可以q回aPtr所指向?SPAN lang=EN-US>descriptor长度。这?SPAN lang=EN-US>descriptor必须?SPAN lang=EN-US>RThread句柄所指定的线E的地址I间中?/FONT>
RThread?SPAN lang=EN-US>GetMaxDesLength()Ҏq回aPtr所指向descriptor的最大长度?SPAN lang=EN-US>descriptor也应?SPAN lang=EN-US>RThread句柄所指的U程地址I间中?/FONT>
?SPAN lang=EN-US>ReadL()?SPAN lang=EN-US>WriteL(){方法前使用q些函数?/FONT>
4.4U程局部存?/FONT>(TLS)
Symbian操作pȝ是不允许?SPAN lang=EN-US>DLL中出现可写静态变量的。然而每?SPAN lang=EN-US>DLL中每个线E都会分配一?SPAN lang=EN-US>32位字W空间。这个字W用来存放一个指向数据结构或cȝ例的指针。分配和释放q些资源可在例如DLL的入口函?SPAN lang=EN-US>E32Dll中处理?/FONT>
另一个用线E局部存储的CZZ存指向类CZ的指针,q样静态回调函数可以访问与U程相联pȝ该对象。当我们处理自定义异常处理模块时是很有用的?/FONT>
Dll::SetTls(TAny *aPtr)函数负责讄U程局部存储的指针?/FONT>
Dll::Tls()函数负责q回一个指向线E局部存储的指针。取得后该指针所指定数据可以正常使用?/FONT>
4.5 User-Interrupt Exception
?SPAN lang=EN-US>3.5?SPAN lang=EN-US>Exception Handling”所qͼU程可以引发其他U程的异常。有一U异常类型是专ؓ用户所保留的,那就?SPAN lang=EN-US>EExcUserInterruptQ可以通过指定异常cdKExceptionUserInterrupt来处理。其他要传递的信息应该通过׃n内存来处理。这是在最D|间内向其他线E传递信息的方式Q当异常发生时调?SPAN lang=EN-US>RaiseException()函数可切换到另个U程的异常处理模块?/FONT>
Q未完待l)
BestRegards
hoolee
hoolee
View Public Profile
Send email to hoolee
Find all posts by hoolee
Add hoolee to Your Buddy List
#5 2005-04-30, 07:54
hoolee
Registered User Join Date: Mar 2005
Posts: 1,037
4.6 Publish & Subsribe
Publish & Subscrible是一个进E间的通信机制Q在SymbianOS v8.0a?SPAN lang=EN-US>Series 60 Platform 2nd Editon, Feature Pack2中有所介绍Q,可以查看相关的文挡?/FONT>
q个机制包括了三个基本方面:properties, publishers, ?SPAN lang=EN-US>subscribers.Properties是由一个标?SPAN lang=EN-US>SymbianOS UID所定义的全局唯一变量Q它定义了属性类别,而另一个整数定义了property sub-key?/FONT>
Publishers是负责更新属性的U程?SPAN lang=EN-US>Subscribers是负责监听属性变化的U程?/FONT>
4.7 消息队列
消息队列是另一个进E间通信的机Ӟ?SPAN lang=EN-US>SymbianOS v8.0a?SPAN lang=EN-US>Series 60 Platform 2nd Editon, Feature Pack2中有所介绍Q?/FONT>
消息队列用来向队列发送消息,而无需获得接收者的状态标识信息。Q何进E(都在同一队列中的Q或M同一q程中的U程Q在局部队列中Q都可以dq些信息?/FONT>
5、同?/FONT>
1)目的
如果多个U程在没有保护机制的情况下用同一资源Q就会出C些问题。如Q线E?SPAN lang=EN-US>A更新了部?SPAN lang=EN-US>descriptorQ而线E?SPAN lang=EN-US>B接手后又重写了内宏V回到线E?SPAN lang=EN-US>A后,又开始更新内宏V这?SPAN lang=EN-US>descriptor的内容就?SPAN lang=EN-US>A?SPAN lang=EN-US>B中来回修改了?/FONT>
Z防止q类情况的发生,你需要用非抢占?SPAN lang=EN-US>client/server机制或同步对象来处理。同步对象(mutex, semaphore, critical sectionQ都是核心对象,可以通过句柄来访问。他们会限制或直接锁住对多线E们所要访问的资源Q这U资源Ş式被UCؓ׃n资源?/FONT>
在Q何时d能有一个线E对׃n资源q行写操作,每个要访问资源的U程都应使用同步机制来管理资源?/FONT>
同步操作一般有如下步骤Q?/FONT>
1. Call Wait() of the synchronization object reserved for this resource.
2. Access the shared resource.
3. Call Signal() of the synchronization object reserved for this resource.
注意Q当killU程时要心炏V因为如果线E用已E注销的对象,不同的同步对象其处理方式是不同的。因此,忽略使用同步cd?SPAN lang=EN-US>kill一个已E更新过部分资源的线E是会引发问题的?/FONT>
2)使用Semaphores(信号)
Semaphores可以理׃n资源的同步化讉K。这?SPAN lang=EN-US>semaphore的句柄可通过RSemaphorec获得?/FONT>
Semaphore限制了同一时刻讉K׃n资源的数目?SPAN lang=EN-US>semaphore计数的初始化工作可以攑֜构造函Cq行?/FONT>
Semaphore可以是全局的也可以是局部的Q全局?SPAN lang=EN-US>semaphore有自q名称Q可以被其他q程搜烦q用。而局部的semaphore没有名称Q只能在同一q程间的U程中用?/FONT>
调用semaphore?SPAN lang=EN-US>Wait()Ҏ减?SPAN lang=EN-US>semaphore计数Q而如果计Cؓ负的话,调用U程׃q入{待状态?/FONT>
调用semaphore?SPAN lang=EN-US>Signal()Ҏ增?SPAN lang=EN-US>semaphore计数Q如果增长之前ؓ负数Q则{待信号的第一个线E将讑֮为准备运行状态?/FONT>
调用semaphore?SPAN lang=EN-US>Signal(TInt aCount)和调?SPAN lang=EN-US>n?SPAN lang=EN-US>Signal()效果是一L?/FONT>
当线E死亡时Q只有该U程正等待该信号Ӟ信号才能被通知。因Z号在下面q样的情况也是可以执行的Q在一个线E中调用Wait()Q在另一个线E中调用Signal()Q这L信号无法在用它的线E死亡时被通知。这样只会导致信可数减低?/FONT>
3)使用互斥Q?SPAN lang=EN-US>MutexQ?/FONT>
互斥主要使用在同步下独占讉K׃n资源。它的句柄可以通过RMutexcL获得?/FONT>
和信号一P互斥可以是全局也可以是局部的。唯一的不同在于其计数初始化时Mؓ1?SPAN lang=EN-US>Mutex因此只允许最多一个访问共享资源?/FONT>
如果一个线E已EZؓmutex调用Wait()Q但没有Signal()Q则U程M时该互斥被通知?/FONT>
4)使用临界?/FONT>(Critical Sections)
Critical Sections可用来在一单独q程中独占访问共享资源?SPAN lang=EN-US>Critical Sections句柄可以通过RCriticalSectioncL获得?/FONT>
Critical Sections只能用在同一q程的线E间Q通常它用来管理某D代码的讉KQ每ơ只能有一个线E来讉K?/FONT>
同一U程中,在调?SPAN lang=EN-US>Wait()前调?SPAN lang=EN-US>Signale()会引发U程的异常。但不会出现在其他类型的同步对象中?/FONT>
U程的中断是不会影响critical sections的状态的Q因此?SPAN lang=EN-US>critical sections的线E将不会被其他线E杀死,除非不在critical sections中。当不在需要时Q线E的M是不会有癬,很安全的?/FONT>
5)同步实例
Code:
1: class CMessageBuffer
2: ;
12:
13: CMessageBuffer::CMessageBuffer()
14:
17:
18: void CMessageBuffer::AddMessage(const TDes &aMsg)
19:
24:
25: void CMessageBuffer::GetMessages(TDes &aMsgs)
26:
32:
33: static void CMyClass::threadFunction(TAny *aPtr)
34:
45: }
在上面所qCQ?SPAN lang=EN-US>CMessageBuffer是一个半成品c,它允许用户增加消息到buffer中,也允许获得所有消息?/FONT>
U程函数CMyClass::threadFunction负责?SPAN lang=EN-US>CMessageBuffer׃n对象d信息Q这里内存分配和错误查ƈ没有列出Q需要读者自己完成?/FONT>
假设有多个线E要׃nCMessageBuffer对象实例Q则在实际访?SPAN lang=EN-US>buffer时必要同步来处理。我们也可在U程函数中完成,但在CMessageBuffer中完成同步将使得该类成ؓU程安全U,同样它也可以被用在单个线E中了?/FONT>
6ȝ
很多情况下都需要多U程的,当用多U程Ӟ同步及互斥排他也要考虑在内Q以便保证线E通信的安全性。如果线E用共享资源,我们应该使用某种同步机制来避免异常的发生Q?SPAN lang=EN-US>Semaphores, critical sections,?SPAN lang=EN-US>mutexes都提供了基本的解x案。此外,如果使用zd对象或清除机Ӟ我们q需要手工设|?SPAN lang=EN-US>active scheduler和清除栈。ȝ来说Q线E编E不是这么容易的Q因cȝE需要全面理解框架、多d和线E安全机制?/FONT>
symbian开发资?SPAN lang=EN-US>
d有一D|间做symbian的开?SPAN lang=EN-US>, ?SPAN lang=EN-US>sony ericsson ?SPAN lang=EN-US>p802上进行,因ؓ公司内还没有开?SPAN lang=EN-US>symbian的经验,所以开发过E中遇到的问题就只有?SPAN lang=EN-US>internet上去L帮助。本文ȝ和罗列了在开发过E中得到的各U?SPAN lang=EN-US>symbian uiq开发资源,希望对刚q入symbian开?/SPAN>的朋友能够有所帮助?SPAN lang=EN-US>
<!--[if !supportEmptyParas]--> <!--[endif]-->
<!--[if !supportLists]-->1Q?SPAN lang=EN-US><!--[endif]-->Symbian 开发者新ȝ
q是symbian|站上公布的新闻l,毫无疑问Q这是我开发过E中遇到N时得到帮助最多的地方。在q里回答问题的都是很专业?SPAN lang=EN-US>symbian开发h员,估计其中有一部分应该?SPAN lang=EN-US>symbian的技术支持工E师。只要你会提问,有耐心Q一般都可以得到有用的帮助?SPAN lang=EN-US>
Q提问前搜烦一下以前有没有同样的问题,如果有,那么你就不用{待别h的回{了Q也避免了支持者ؓ了回{同L问题费旉?SPAN lang=EN-US>
提问时尽量言意赅的描q清楚你遇到的问题,q要注意自己的态度Q网上有一详l介l如何提问的文章?SPAN style="FONT-SIZE: 9pt; COLOR: black">提问的智?/SPAN>》,先阅诅R?SPAN lang=EN-US>
阅读Q搜索其他文档后Q仍然找不到{案Ӟ才到新闻l提问。因为可能要q比较长的时间才能够得到{复?SPAN lang=EN-US>
<!--[if !supportEmptyParas]--> <!--[endif]-->
http://www.symbian.com/developer/public/index.html
<!--[if !supportEmptyParas]--> <!--[endif]-->
<!--[if !supportLists]-->2Q?SPAN lang=EN-US><!--[endif]-->SDK附带的文?SPAN lang=EN-US>
在安?SPAN lang=EN-US>UIQ2.1?SPAN lang=EN-US>SDK后,有一?SPAN lang=EN-US>patch。这?SPAN lang=EN-US>patch里面实际上ƈ没有?SPAN lang=EN-US>SDK做什么更斎ͼ里面只包括了一?SPAN lang=EN-US>CHM版的文档和一个名?SPAN lang=EN-US>news-qui的项目?SPAN lang=EN-US>CHM版的文档提高了可用性和可读性。那?SPAN lang=EN-US>news-qui的项目是学习uiq上编E的最好源代码Q因为它不仅覆盖?SPAN lang=EN-US>uiq上大多数的基架构Q而且q有一相应的chm文档分析代码Q指导阅诅R如果你刚开始学?SPAN lang=EN-US>symbian ?SPAN lang=EN-US> uiq~程。这是必ȝ源码?SPAN lang=EN-US>
SDK附带的这份文档包含了详尽?SPAN lang=EN-US>Symbian UIQ SDK开发信息,是最重要的参考资料?SPAN lang=EN-US>
以下几个部分可能是经帔R要用到的地方Q?SPAN lang=EN-US>
UIQ 2.1 SDKàUIQ SDKàC++ : q个目录里面?SPAN lang=EN-US>API Refrence, Application Developer Framework, Paradigm都是刚开始学习时常用的参考资料?SPAN lang=EN-US>
UIQ 2.1 SDKàDeveloper LibraryàAPI Refrence, 其中?SPAN lang=EN-US>C++ API Refrence?SPAN lang=EN-US>APIq行了分cMl。?SPAN lang=EN-US>System Panic Refrence在程序中出现panicӞ可以Ҏ分类和编号对应查到可用信息?SPAN lang=EN-US>
UIQ 2.1 SDKàDeveloper LibraryàTools and Utilities, 其中包含了开发过E中要用到的工具介l和指导Q比如文件{换,E序生成Q程序安装,字符格式转换Q图片格式{换,如何在设备上调试{?SPAN lang=EN-US>
<!--[if !supportEmptyParas]--> <!--[endif]-->
<!--[if !supportLists]-->3Q?SPAN lang=EN-US><!--[endif]-->FAQ
FAQ是对开发过E中l常遇到的问题进行ȝ后得到的l果Q你遇到的问题,别h已经先遇到过了,而且已经有了{案。遇到问题,先查文档Q然后到q里来看看,{案也许早就在这里,只是{待你的搜烦?SPAN lang=EN-US>
<!--[if !supportEmptyParas]--> <!--[endif]-->
http://www.symbian.com/developer/techlib/faq.html
上面的页面先q入Enter the Symbian OS Developer Knowledgebase q一栏,然后可以分cL索啦?/SPAN>
<!--[if !supportEmptyParas]--> <!--[endif]-->
<!--[if !supportLists]-->4Q?SPAN lang=EN-US><!--[endif]-->Sonyericsson 的开发技术支持论?SPAN lang=EN-US>
也不错,需要先注册?SPAN lang=EN-US>
http://developer.sonyericsson.com/show_forums.do
<!--[if !supportEmptyParas]--> <!--[endif]-->
<!--[if !supportLists]-->5Q?SPAN lang=EN-US><!--[endif]-->源代码资?SPAN lang=EN-US>
series60?SPAN lang=EN-US>SDK安装以后Q其example里的源代码是所?SPAN lang=EN-US>symbian SDK中最多,最全面的。虽然这?SPAN lang=EN-US>project不能?SPAN lang=EN-US>UIQ SDK里面~译通过Q但在遇到问题时Q参考这里面的源码会对你有很大帮助?SPAN lang=EN-US>
Symbian字符串操?SPAN lang=EN-US>
?SPAN lang=EN-US>symbianpȝ中ƈ没有使用我们熟知的类型和函数来处理字W串和二q制~冲区,q对于初学者来说可能有炚w生。大概很多编E者都在摸?SPAN lang=EN-US>TBuf, TBufC, HBufC的过E中p了不时间…?SPAN lang=EN-US>:)
symbian中的描述W?SPAN lang=EN-US>(descriptors)主要有以下特性:
1、以同样的方式对待字W串和二q制数据?/FONT>
2、数据可以存攑֜内存的Q何区域上—?SPAN lang=EN-US>ROM?SPAN lang=EN-US>RAMQ在堆或栈上都可以?/FONT>
3、描q符使用指针和长度信息来描述它包含的数据Q有些描q符q包括最大长度的信息?SPAN lang=EN-US>
下面q个囄意了描述W相关类的承关p:
所有的描述W都是从抽象c?SPAN lang=EN-US>TDesC中派生的Q他们可以分Z个大c:
1、缓冲区描述W——数据做为描q符对象的组成部分而存在,描述W对象存攑֜E序的堆栈中Q?SPAN lang=EN-US>TBuf?/FONT>TBufC,
2、堆描述W——数据做为描q符对象的组成部分而存在,描述W对象存攑֜堆中Q?/FONT>HBufC,
3、指针描q符——描q符对象和它所表示的实际数据是分开存放的:TPtr?SPAN lang=EN-US>TPtrC.
如果对照C/C++语法来看Q?/FONT>
1?SPAN lang=EN-US>TPtrC可以被看作是const char*的?/FONT>
2?SPAN lang=EN-US>TBufC可以被看作是char[]的?SPAN lang=EN-US>
其他cL有相应对照语句?SPAN lang=EN-US>
下面昄了各个类中数据是如何l织的:
TDes?SPAN lang=EN-US>TDesC是抽象类Q因此你不可能实例化它们。它们的主要用途是做ؓ函数的参数来描述字符串和二进制数据。在q样的函CQ你应该按如下规则用:
1?SPAN lang=EN-US>const TDesC& 表示只读的数据和字符丌Ӏ?/FONT>
2?SPAN lang=EN-US>TDes& 表示可以被修改的数据和字W串?SPAN lang=EN-US>
所有这些描q符都可以指定数据尺度:TDes8?SPAN lang=EN-US>TDes16?SPAN lang=EN-US>TDesC8?SPAN lang=EN-US>TDesC16?SPAN lang=EN-US>TBuf8?SPAN lang=EN-US>TBuf16{?/FONT>
q里8表示描述W处理的数据?SPAN lang=EN-US>8bit的,?SPAN lang=EN-US>16表示?SPAN lang=EN-US>16bit数据。一般来_你只要用通用形式Q?SPAN lang=EN-US>TDes, TDesC,...Q来表示文本数据而?SPAN lang=EN-US>8bit版本Q?SPAN lang=EN-US>TDesC8{)来表CZq制的内宏V?SPAN lang=EN-US>
Litterals
---------------
字符串常量可以?SPAN lang=EN-US>_L()?SPAN lang=EN-US>_LIT()宏来定义?SPAN lang=EN-US>
_L()可以生成一个指向字W值的地址Q?SPAN lang=EN-US>TPtrCQ,它经常被用来传递字W串到函CQ?/FONT>
NEikonEnvironment::MessageBox(_L("Error: init file not found!"));
_LIT()可以生成个常量名Q以便以后重复用:
_LIT(KMyFile, "c:\System\Apps\MyApp\MyFile.jpg");
_LIT()宏的l果Q就是上面的KMyFileQ实际上是个文字描述W(literal descriptorQ?SPAN lang=EN-US>TLitCQ它可以在Q何?SPAN lang=EN-US>TDesC&的地方用?SPAN lang=EN-US>
用法
---------
TDesC中最常用的函数如下:
1?SPAN lang=EN-US>Ptr()Q用来获得描q符数据中的指针?/FONT>
2?SPAN lang=EN-US>Length()Q用来获得描q符数据中的字符数?/FONT>
3?SPAN lang=EN-US>Size()Q用来获得描q符数据中的字节数目?/FONT>
4?SPAN lang=EN-US>Cpmpare()或操作符==?SPAN lang=EN-US>!=?SPAN lang=EN-US>>=?SPAN lang=EN-US><={专为比较描q符数据用的?/FONT>
5、操作符[]Q可以被当作c/c++中一P用来获得描述W字W串中的单个字符?SPAN lang=EN-US>
下面几个函数有其Ҏ性:
1?SPAN lang=EN-US>Append()?SPAN lang=EN-US>Num()有很多重载Ş式,具体可以?/FONT>SDK
2?SPAN lang=EN-US>Compare()?SPAN lang=EN-US>2个变体:CompareC()?SPAN lang=EN-US>CompareF()Q以?SPAN lang=EN-US>Copy(),Find(),Locate()?SPAN lang=EN-US>Match()Q这些函数都?SPAN lang=EN-US>C/F的后~形式Q?SPAN lang=EN-US>C代表Collated?SPAN lang=EN-US>F代表Folded.
Collating?/FONT>Folding
------------------------
Folding是个比较格式化文本的单方法,主要用在Ҏ较不是太要求_的场合?SPAN lang=EN-US>
Collation是个更好的也更有效的比较字符串的ҎQ可以生成类似字典的序?SPAN lang=EN-US>
手机游戏制作宝典
׃手机g讑֤斚w的诸多限制和性能差异Q我们在游戏的开发和制作q程中无法天马行I的进行创作,而不得不l合考虑到多方因素的q。下面列出的是一些关键的性能参数Q这些参数都直接影响游戏的效果?/FONT>
[分L?/FONT>]
手机的屏q大各有不同,?SPAN lang=EN-US>80*30?SPAN lang=EN-US>320*240Q就好比?SPAN lang=EN-US>PC发展q程中的CGA?SPAN lang=EN-US>EGA乃至VGAQ分辨率的高低直接导致了造型的大及表现力,q点怿每个设计人员都有所体会。另外,׃手机型号及操作系l的多样性,D了一ƾ游戏ƈ不能不加改动的在不同的手Zq行。对于美术设计h员而言Q就要在设计之初考虑屏幕的自适应问题。比如在128×128分L率下?SPAN lang=EN-US>200×200的分辨率下,如何可以不重新更换图片,但又辑ֈ同样的效果?
[色彩数量]
目前手机能达到的色彩数量也是限制术人员发挥的一个重要瓶颈。从q去几年的黑白屏q手机到C256艌Ӏ?SPAN lang=EN-US>4096色及真彩艌Ӏ?SPAN lang=EN-US>Digital-Red在开发游戏时接触q非常多的手机,其中有的手机L能显C?SPAN lang=EN-US>4096Ԍ但我们将一?SPAN lang=EN-US>4096色的色阶图进行显C,便发现有的颜色根本无法区分,更让人吃惊的是,个别手机q色偏严重。所以,设计人员是一定要Ҏ实际手机q行囄l制Q在此,Digital-Red有过非常多的教训?/FONT>
[明亮?/FONT>]
液晶屏幕׃其独特的发光原理Qƈ不能辑ֈ传统昄器的亮度Q同时也导致了很多色彩丰富的图案在强光下,不能昄出原有的效果Q这点在手机户外昄时尤其明显。因此设计h员在设计手机游戏囄时一定要考虑q点Q不能将色彩Ҏ度设|的q于接近、图片设计一定要z明快,避免q小的图片?/FONT>
[昄速度]
在我们接触的手机里,很多׃q算速度的问题,D动画帧数q不能流畅,甚至辑ֈ不了10?SPAN lang=EN-US>/U,q对于游戏动画而言是致命的Q我们一般采取局部刷帧或者尽量避免全屏幕动画来尽量达到预期效果。而且液晶屏幕本n也有昄速度问题Q我们就发现q很多手机都有媄像“拖䏀情c这U情况,在实际游戏中很容易造成玩家的视觉疲劻I其在颠的车上或者是行动中,游戏旉q长Q就有头晕目眩的感觉。如此,即是一ƾ优U的游戏也无法留住玩家了?/FONT>
[电力]
׃手机是液晶屏q,大多数设备在高亮度的像素昄与一般像素显CZQ两者耗电量是有所区别的,例如白色背景p比黑色背景消耗更多的甉|能量。因此,对于手机游戏而言Q要可能节省玩家的甉|Q也是对玩家的一U体贴吧?/FONT>
[手机游戏开发过E中的一些错误观?/FONT>]
很多惛_发手机游戏的朋友们对于手机游戏都充满了惻I
Digital-Red也曾与这些朋友们一P在脑中有非常多的想法等待实玎ͼ但一旦真正开发游戏的时候我们就发现很不现实Q这里将几个常见的错误认识与怽分nQ?/FONT>
ULPC游戏到手Z
PC上的游戏已经以百兆来计算其占用空间了Q而很多手机游戏是?SPAN lang=EN-US>K来计,大多数的手机游戏能安?SPAN lang=EN-US>60K的游戏就不错了?/FONT>
J2ME游戏不用改动可以q行在各U手Z
J2ME在移动设备上有一?SPAN lang=EN-US>MIDP 1.0标准Q但各个手机厂商在推出支?SPAN lang=EN-US>J2ME的手Z都对其进行了扩充甚至改动Q一个程序想要达到最理想的效果就一定要针对不同型号的手机?/FONT>
[?SPAN lang=EN-US>Java开发手机游戏要比用C++?/FONT>]
使用Java开发手机游戏的非常方便,但在效果与性能上很难与C++代码实现效果比拟。如?SPAN lang=EN-US>Symbian OS/WinCE讑֤上我们还是推荐尽量?SPAN lang=EN-US>C++来开发ؓ好?/FONT>
[Java开发出的应用程序占用的I间?/FONT>]
在开发小型应用时Q?SPAN lang=EN-US>JavaE序的确I间占用较小Q但如果游戏目q大Q?SPAN lang=EN-US>Java游戏的小巧优势就很难体现了?/FONT>
[手机游戏{划与传l?SPAN lang=EN-US>游戏{划无异]
手机游戏?SPAN lang=EN-US>{划忌非常多,要求{划人员必须全面了解手机的技术性能才能做出针对性的优秀游戏?/FONT>
[术可以d图,然后再羃?/FONT>]
一张大囑֦果羃?SPAN lang=EN-US>12*12大小Q效果就可想而知了?
Symbian中的更改应用E序图标
应用E序的图标需要在MMP文g中用AIF语句指定,一?SPAN lang=EN-US>MMP的例?/FONT>
/*
* ============================================================================
* Name : TestDlg.mmp
* Part of : TestDlg
* Created : 2005/09/12 by
* Description:
* This is the project specification file for TestDlg.
* Initial content was generated by Series 60 AppWizard.
*
* Version :
* Copyright:
* ============================================================================
*/
TARGET TestDlg.app
TARGETTYPE app
UID 0x100039CE 0x097A0B44
TARGETPATH \system\apps\TestDlg
SOURCEPATH ..\src
SOURCE TestDlgApp.cpp
SOURCE TestDlgAppUi.cpp
SOURCE TestDlgDocument.cpp
SOURCE TestDlgDialog.cpp
SOURCE MailViewDlg.cpp
RESOURCE ..\data\TestDlg.rss
RESOURCE ..\data\TestDlg_caption.rss
LANG SC
USERINCLUDE .
USERINCLUDE ..\inc
SYSTEMINCLUDE . \epoc32\include
LIBRARY euser.lib apparc.lib cone.lib eikcore.lib
LIBRARY eikcoctl.lib avkon.lib
LIBRARY eikdlg.lib estor.lib msgs.lib etext.lib
AIF TestDlg.aif ..\aif TestDlgaif.rss c8 context_pane_icon.bmp context_pane_icon_mask.bmp list_icon.bmp list_icon_mask.bmp
AIF目录下的TestDlgaif.rss :
/*
* ============================================================================
* Name : TestDlgaif.rss
* Part of : TestDlg
* Created : 2005/09/12 by
* Description:
* RSS for creating the aif file for TestDlg.
* Initial content was generated by Series 60 AppWizard.
* Version :
* Copyright:
* ============================================================================
*/
#include <aiftool.rh>
RESOURCE AIF_DATA
{
app_uid=0x097A0B44;
num_icons=2;
embeddability=KAppEmbeddable;
newfile=KAppDoesNotSupportNewFile;
}
// End of File
安装后自动应用。一?SPAN lang=EN-US>MASK文gQ就是把图标存成黑白2位色的文Ӟ习惯上是名字?SPAN lang=EN-US>_maskQ上面的例子中,是context_pane_icon.bmp?SPAN lang=EN-US>context_pane_icon_mask.bmp以及list_icon.bmp?SPAN lang=EN-US> list_icon_mask.bmp四个文g。当然在资源文g要有说明Q也?SPAN lang=EN-US>AIF那行?SPAN lang=EN-US>
利用symbian?SPAN lang=EN-US>API得到手机型号
利用symbian?SPAN lang=EN-US>API得到手机型号
?Q困扰我很久的一个问题,?SPAN lang=EN-US>symbian?SPAN lang=EN-US>api里面Q就扑ֈ一?SPAN lang=EN-US>HALc,可以q回一些定义好?SPAN lang=EN-US>enumQ但也只是厂商等{,搞不?SPAN lang=EN-US>symbianZ么要q回enumQؓ什么不q回一个字W串Q厂商在制定的时候加q去是了?/FONT>
但是型号始l得不到Q请问大家有没有什么方法来得到型号Q比如要得到7610Q?SPAN lang=EN-US>
{:
事例Q?SPAN lang=EN-US>
from Forum_Nokia_Technical_Library_v1_8_en.chm
Fetching device model information
+-------------------------------------------------------------------------+
|Subject |How can I fetch device model information |
+-------------+-------------------------------+---------------------------+
| |Platform(s) |Device(s), SW version(s) |
+ +-------------------------------+---------------------------+
| |Series 60 Platform 1st Edition |N/A |
| |Series 60 Platform 2st Edition | |
+-------------+-------------------------------+---------------------------+
|Category |Symbian C++ |
+-------------+-----------------------------------------------------------+
|Subcategory |General |
+-------------+-----------------------------------------------------------+
|Description |In Symbian OS phones the machine UID is unique for each |
| | device type. Unfortunately the UID can be same for device |
| |variants, such as Communicator variants (Nokia 9210, Nokia |
| |9210i, Nokia 9290, and Nokia 9210c), and the UID cannot be |
| |used to distinguish between exact device models. The |
| |Symbian machine UID can be retrieved with the HAL::Get() |
| |method, using HALData::EMachineUid as a parameter. |
| | |
| |#include <hal.h> // also link to hal.lib |
| | |
| |TInt mUid = 0; |
| | |
| |HAL::Get(HALData::EMachineUid, mUid); |
| | |
| |For example: |
| | |
| | 3650 0x101f466a |
| | 7650 0x101f4fc3 |
| | N-Gage 0x101f8c19 |
| | N-Gage QD 0x101fb2b1 |
| | Siemens SX1 0x101F9071 |
| | 6600 0x101fb3dd |
| | 7610 0x101fb3f3 |
| | 9500 0x101f3ee3 |
| | 6260 0x101fb3f4 |
| | 6630 0x101fbb55 |
| | 6680 0x10200F99 |
| | 3230 0x10200F97 |
| | 6682 0x10200F9B |
| | 6681 0x10200F9C |
| | N90 0x10200F98 |
| | |
| |Check the document Series 60 Platform Identification Code |
| |available at http://www.forum.nokia.com for a list of |
| |machine UIDs. |
+-------------+-----------------------------------------------------------+
|Creation date|May 24, 2005 |
+-------------+-----------------------------------------------------------+
|Last modified| |
+-------------------------------------------------------------------------+
Symbian~译pȝ概观 | |||||||||||
作者:Peter Ji?nbsp; 文章来源Qcsdn 点击敎ͼ 170 更新旉Q?005-11-8 | |||||||||||
有很多涉及到~译q程的工?/SPAN>.q篇文章里我们仅学习一个最基本的工L译一个简单应用程序的q程(针对Series 60?/SPAN>UIQ).
命o行工?/SPAN> W一个涉及到的工具就?/SPAN>bldmake:q个工具可以创徏一个命令文?/SPAN>,你将用到q个文g来编译ƈq接你的应用E序(abld). Bldmake需?/SPAN>bld.inf文g来完成这些工?/SPAN> Abld.bat文g是应用程序编译的入口?/SPAN>. 依据你传递给abld命o的参?/SPAN>.会产生如下文g:一?/SPAN>Visual C++工作区和目文g(abld makefile vc6),一?/SPAN>Windows模拟器应用程?/SPAN>(abld build wins udeb)或一个真?/SPAN>Symbian讑֤的应用程?/SPAN>(abld build thumb urel). VC6?/SPAN>Wins参数可以见名知义(VC6=Visual C++6,Wins=Windows).udeb则意味着”Unicode-Debug?urel表示”Unicode-Release?Unicode是一个字W编码格?/SPAN>(有些cMASCII?/SPAN>Unicode允许外文字符~码(包括汉语)).Debug的意思是你将会生关于你的应用程序的调试信息(大概是模拟器的版本信?/SPAN>),发布到真实设备上时将不会包含调试信息(已经发布了就不会再需要调试了)
创徏调试日志QlogQ文? ?Peter Jiang(译自newlc.com)
需要在手机上调试代码或跟踪执行q程?RFileLogger也许可以帮助?/SPAN>.q个class的功能非常强大而且很容易?/SPAN>. 首先声明一个文件日志的q接q且创徏一?/SPAN>log文g
W?/SPAN>3行的CreateLog函数有三个参?/SPAN>: Log路径 Log文g?/SPAN> 记录模式(EFileLoggingModeOverwrite|EFileLoggingModeAppend) 例如下列代码Q是我的log文g?/SPAN>full path(手机上的文gpȝ) C:/Logs/MyLoggingDirectory/MyLogFile. Ҏ来说Q我习惯?/SPAN>opening代码攑ֈ我希望跟t的class?/SPAN>ConstructL()函数里面Q然后在析构函数?/SPAN>closing.在真正编码时Q你最好检一?/SPAN>Connect?/SPAN>CreateLog是否q回?/SPAN>KErrNone. 一旦你完成了这些,你就可以?/SPAN>log文g中输入文本和数据了。基本的命o为:
要是不希望记录日期和旉Q你可以使用q条语句来关闭它们?/SPAN>
别忘了在MMP文g上加?/SPAN>flogger.libQ还有包?/SPAN>flogger.h头文件。现在可以编译执行你的程序了?/SPAN> StopQ?/SPAN>log文gq没建立呢!正确Q这没办法在代码里完成,我们只能手工?/SPAN>C:/Logs/MyLoggingDirectory目录中创?/SPAN>log文gQ否则什么日志也不会记录。不需要重新编译?/SPAN> |
1、UIQ 2.1 SDK WINSQ完全安装?BR>2、C++ BuilderX 1.5 Mobile EditionQ完全安装?BR>3、Windows?2bit Debugger?/SPAN>
我手里没有VCQ就没有安装Q因个环境按照ARMI模式~译也可以了。开始前需要设定环?-讄Tools|Symbian SDK Configuation:
现在开始进行第一个测试程序:HelloWorld?/SPAN>
1、进?C++BuilderX IDE?BR>2、File|New [Mobile C++]Import Symbian C++ ProjectQ选择UIQ SDK自带的例子程序UIQ_21\UIQExamples\HelloWorldQ导入?/SPAN>
注意导入时Platform应选择ARMI?/SPAN>
3、编译生成SIS: Rebuild。在UIQ_21\UIQExamples\HelloWorld目录下生成HelloWorld_ARMI_UDEB.sis?BR>4、用手机应用程序安装工具安装HelloWorld_ARMI_UDEB.sisQ即可见?HelloWorld"了?BR>