Embedded 版 (精华区)

发信人: bage (欧是铁八哥), 信区: Embedded_system
标  题: Windows CE应用程序开发实例
发信站: 哈工大紫丁香 (2001年08月13日11:31:47 星期一), 站内信件


                   Windows CE应用程序开发实例
                           田东风
    在IT技术革命日新月异的今天,嵌入式产品技术作为一支奇葩,成为人们关注的焦
点之一。Windows CE作为微软推出的嵌入式操作系统是此类产品中非常重要的一支力量
。Windows CE是一种紧凑、高效、可伸缩的操作系统,主要面向各种嵌入式系统和产品
。它的模块化设计使它特别适用于各种资源受限的硬件系统,例如消费电子设备,专用
工业控制器和嵌入式通讯设备。在当前市场上,运行Windows CE的产品有Internet机顶
盒,Web电话,POS终端,导航设备,HPC(手持PC),PPC(掌上PC),AutoPC(车载PC),维纳
斯电脑等等。
    Windows CE应用程序开发的工具包由微软提供。本文以掌上电脑(PPC) 的数据库应
用程序开发为例,介绍Windows CE应用程序开发的主要过程。作者使用的开发环境由Mi
ncrosoft Visual C++ 5.0,Mincrosoft Windows CE Toolkit for Visual C++ 5.0,M
incrosoft Windows CE Platform SDK(PPC)组成。在Windows NT 环境下,应首先安装M
incrosoft Visual C++ 5.0,然后安装Mincrosoft Windows CE Toolkit for Visual C
++ 5.0,Mincrosoft Windows CE Platform SDK(PPC)。安装成功后,用户可在Mincros
oft Visual C++ 5.0中File/New菜单下发现已经可以创建WCE工程,包括WCE MFC AppWi
zard(exe),WCE MFC AppWizard(dll),WCE MFC ActiveX ControlWizard,WCE ATL CO
M AppWizard,且Win32 Application工程也支持更多的平台:Win32(WCE Mips),Win32
(WCE SH),Win32(WCE X86em),Win32(WCE X86) ,Win32(WCE PPC)。其中,Mips,SH,
X86,PPC指CPU类型,而X86em指编译仿真环境下运行的代码。仿真环境指微软提供的运
行于PC上的PPC仿真器,它与Mincrosoft Windows CE Platform SDK(PPC)打包在一起了
。用户可先编译仿真环境下运行的代码,然后在仿真环境下调试通过,最后再编译目标
机器代码(如Mips代码,这视硬件设备所用CPU类型而定)。
    对于熟悉Mincrosoft Visual C++ 5.0的用户,只要认真学习Windows CE的系统构成
及其帮助文挡,掌握Mincrosoft Windows CE Toolkit for Visual C++ 5.0,Mincroso
ft Windows CE Platform SDK(PPC)是不会有太多困难的。Windows CE是许多分散模块的
集合,每个模块提供了不同的功能。Windows CE包括四个主要模块:Kernel模块,Obje
ct Store模块,GWES模块,Communications模块。Kernel模块是Windows CE操作系统的
核心,由coredll.dll表示。Object Store模块即对象存储模块,Windows CE除支持FAT
文件系统,系统注册表外,还新增加了Windows CE数据库,并提供了丰富的操作函数,
如创建,检索,修改,删除等等。Windows CE系统中自带的联系人,日程表,便笺等应
用程序就是使用Windows CE数据库的范例。GWES模块即图形(Graphics),窗口(Windowi
ng),事件(Events)子系统模块,这部分与普通WIN32 API基本相同。Communications模
块即通讯模块,Windows CE提供了丰富的通信支持:串行IO(如与PC连接),局域网(LAN
),互联网(Internet),红外通讯(IrDA),远程访问(RAS),电话API(TAPI)等等。
下面结合Windows CE数据库API的使用,介绍Windows CE数据库应用程序开发的主要过程

首先,在安装好的Mincrosoft Visual C++ 5.0中File/New菜单下选择Project,选中WC
E MFC AppWizard(exe),在Platforms中根据硬件平台CPU类型进行选择(笔者的掌上电脑
是Mips CPU,故选择Win32(WCE Mips)),为了可先编译仿真环境下运行的代码,然后在
仿真环境下调试,一般还应同时选择Win32(WCE X86em)。在Project name中输入:DbTe
st,
在后面的步骤中注意选择include Windows CE Database Classes,这样在stdafx.h中将
加入:#include <wcedb.h> // WCE MFC database classes。其他步骤与PC上开发相同
。注意,在编译之前,先在Build/Set Active Configurations...菜单下选择所要的平
台,一般先选择Win32(WCE X86em)Debug平台,如编译调试成功,再选择Win32(WCE X86
em)Release平台,如编译运行成功,最后选择Win32(WCE Mips))Release平台,如编译运
行不成功,可选择Win32(WCE Mips))Debug平台进行联机调试。在Mincrosoft Visual C
++ 5.0中Tools菜单下,有许多联机调试工具:Remote Spy++,Remote Registry Edito
r,Remote Heap Walker,Remote Process Viewer,Remote Zoomin,Remote Object V
iewer,Remote Connection Server。它们的熟练应用对于调试复杂程序是有极大帮助的
。但是,对于初学者,最好还是在仿真环境下调试分析。
下面给出一个为掌上电脑开发的保险业务应用实例中用到的主要代码,并加以注释。示
例用WCE MFC database classes开发,它包括类CCeDBDatabase ,CCeDBProp,   CCeD
BRecord,CCeDBEnum。它们封装了Windows CE数据库API,使用户更容易进行Windows CE
数据库应用程序的开发。
在DbTestView.h中加入
//保险业务应用实例数据库命名
const WCHAR DB_NAME_INSURANCE[] = _T("insurance.cd");
const WORD PROP_SUM = 101,
PROP_RENDERER = 102,
PROP_DEADLINE = 103,
PROP_PEOPLE = 104,
PROP_INSURANCEKIND = 105,
PROP_INSURER = 106,
PROP_PLACE_AFTER = 107;
class CDbTestView : public CView
{
......
CCeDBProp* m_pValProperty[6];
CEOID m_DBOID;
CCeDBProp m_SortProperty[4];
CCeDBDatabase m_DBInsurance;
......
}
//在DbTestView.cpp中加入
CDbTestView::CDbTestView()
{
m_SortProperty[0]=CCeDBProp(CCeDBProp::Type_Long,PROP_PLACE_AFTER,CCeDBProp:
:Sort_Ascending);
m_SortProperty[1]=CCeDBProp(CCeDBProp::Type_String,PROP_DEADLINE,CCeDBProp::
Sort_Ascending);
m_SortProperty[2]=CCeDBProp(CCeDBProp::Type_String,PROP_SUM,CCeDBProp::Sort_
Ascending);
m_SortProperty[3]=CCeDBProp(CCeDBProp::Type_String,PROP_RENDERER,CCeDBProp::
Sort_Ascending);
for(int i=0;i<6;i++)
m_pValProperty[i]=NULL;
m_Insurer=_T("");
......
//如果保险业务应用实例数据库不存在,则建立并打开它:
if(!CCeDBDatabase::Exists(DB_NAME_INSURANCE))
{
m_DBOID=m_DBInsurance.Create(DB_NAME_INSURANCE,1976723,4,m_SortProperty);
m_DBInsurance.Open(m_DBOID,&m_SortProperty[0]);
}
//如果存在,则打开它:
else
{
if(!m_DBInsurance.Open(DB_NAME_INSURANCE,&m_SortProperty[0]))
return false;
}
......
}
//关闭保险业务应用实例数据库
CDbTestView ::~ CDbTestView ()
{
m_DBInsurance.Close();
}
//向保险业务应用实例数据库添加记录
void CDbTestView ::WriteRecord(bool bAdd)
{
CCeDBProp m_ValProperty[7];
CCeDBRecord m_DBRecord;
m_ValProperty[0] = CCeDBProp((LPWSTR)(LPCTSTR)m_Insurer,PROP_INSURER);
m_ValProperty[1] = CCeDBProp((LPWSTR)(LPCTSTR)m_Deadline,PROP_DEADLINE);
m_ValProperty[2] = CCeDBProp((LPWSTR)(LPCTSTR)m_InsuranceKind,PROP_INSURANCE
KIND);
m_ValProperty[3] = CCeDBProp((LPWSTR)(LPCTSTR)m_People,PROP_PEOPLE);
m_ValProperty[4] = CCeDBProp((LPWSTR)(LPCTSTR)m_Renderer,PROP_RENDERER);
m_ValProperty[5] = CCeDBProp((LPWSTR)(LPCTSTR)m_Sum,PROP_SUM);
m_DBRecord.AddProps(m_ValProperty,6);
if(bAdd)
{
m_ValProperty[6] = CCeDBProp((long)m_DBInsurance.GetNumRecords(),PROP_PLACE_
AFTER);
m_DBRecord.AddProp(&m_ValProperty[6]);
if(!m_DBInsurance.AddRecord(&m_DBRecord))
AfxMessageBox(_T("不能添加记录!"));
}
else
{
if(!m_DBInsurance.WriteCurrRecord(&m_DBRecord))
AfxMessageBox(_T("不能添加记录!"));
}
m_DBRecord.DeleteAllProps();
}
//从保险业务应用实例数据库读取记录
void CDbTestView ::ReadRecord()
{
CCeDBRecord m_DBRecord;
if(!m_DBInsurance.ReadCurrRecord(&m_DBRecord))
{
AfxMessageBox(_T("不能读取记录!"));
return;
}
m_pValProperty[0]=m_DBRecord.GetPropFromIdent(PROP_PEOPLE);
m_pValProperty[1]=m_DBRecord.GetPropFromIdent(PROP_SUM);
m_pValProperty[2]=m_DBRecord.GetPropFromIdent(PROP_RENDERER);
m_pValProperty[3]=m_DBRecord.GetPropFromIdent(PROP_DEADLINE);
m_pValProperty[4]=m_DBRecord.GetPropFromIdent(PROP_INSURANCEKIND);
m_pValProperty[5]=m_DBRecord.GetPropFromIdent(PROP_INSURER);
m_People = m_pValProperty[0]->GetString();
m_Sum = m_pValProperty[1]->GetString();
m_Renderer = m_pValProperty[2]->GetString();
m_Deadline = m_pValProperty[3]->GetString();
m_InsuranceKind = m_pValProperty[4]->GetString();
m_Insurer = m_pValProperty[5]->GetString();
}
//从保险业务应用实例数据库删除记录
void CDbTestView ::OnDeleteitem()
{
int SelectedItem=m_ListBrowse.GetNextItem(- 1,LVNI_SELECTED);
if(SelectedItem==-1)
return;
m_ListBrowse.DeleteItem(SelectedItem);
m_DBInsurance.SeekToIndex(SelectedItem);
m_DBInsurance.DeleteCurrRecord();
}
以上代码在Visual C++ 5.0及WCE Toolkit for Visual C++ 5.0下调试通过。
作者简介:田东风,中国地质大学(北京)计算机系副教授
联系方式:62531708(O),68154499呼38636,82323503(H)
通讯地址:北京右安门半步桥街13号院5号楼7门401,田英 (转田东风),邮编:100054


--
                     
           ooooO    Ooooo      *********************************
           (    )   (    )     #    大肚能容,容天下难容之事    #  
            \  (     )  /      #    开口便笑,笑世间可笑之人    #
             \  )   (  /       *********************************
              ~~     ~~

※ 来源:·哈工大紫丁香 bbs.hit.edu.cn·[FROM: bage.hit.edu.cn]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:3.299毫秒