Chinaunix首页 | 论坛 | 博客
  • 博客访问: 9461236
  • 博文数量: 1227
  • 博客积分: 10026
  • 博客等级: 上将
  • 技术积分: 20273
  • 用 户 组: 普通用户
  • 注册时间: 2008-01-16 12:40
文章分类

全部博文(1227)

文章存档

2010年(1)

2008年(1226)

我的朋友

分类: C/C++

2008-04-23 21:48:20

EVC开发实例二:保存信息(一)


作者:



  Windows CE下开发的软件大多和硬件紧密相关。如果写和硬件相关的技术,那只有极少数甚至没有人受益。相反写出来的文章,应该让更多的人受益,都能学而用之。任何一篇文章我都会遵循此原则。当然,本人资质甚浅。只能尽力而为。
  题目中的信息是指很少量的数据。比如配置信息、注册表数据等。在其它Windows 操作系统中,这些信息一般都被保存在*.ini文件或注册表中。
  嵌入式设备没有统一的要求。有的不需要保存任何数据,有的将数据保存到RAM中,在关闭设备时仍然给RAM提供电源。有的将数据保存到永久存储设备中。不同的情况有不同的解决方案,这就造成了在保存信息方面,相关的技术很繁杂,要弄明白需要时间和实践。
   在这篇文章中我主要讲解在Windows CE下如何将数据保存到永久存储器中。将数据保存到永久存储器中应用广泛,不易丢失数据,可以保存大量的数据,也不必在系统关闭后还要提供电源。相比较将数据保存到RAM中要不间断地提供电源,存储空间也大大受限制。

保存到*.ini文件中

  要想让你定制的内核支持永久存储设备,需要加入对永久存储设备的支持(就是驱动程序),再加入一种文件系统。现在假如我们的存储硬件采用IDE接口,使用一种简单实用的文件系统,FAT是合适的选择。那么对应的操作步骤如下:先使用新内核生成向导,生成一个内核工程后(采用哪个平台模板都行),在PB右边“catalog”窗口中加入对存储设备的支持。在PB v4.1下具体位置为“device drivers”-“storage devices”-“ATAPI PCI/IDE Storage Block Driver”。单击右键,在弹出菜单中单击“add platform”,PB立刻将相关驱动程序源码或者编译后的文件,还有相关环境变量加到你的内核工程中。之后再加入FAT文件系统驱动。FAT组件的具体位置为:
“Core OS”-“display based devices”-“file system and data store”-“storage manager”-“FAT File System”。
  也用同样方法加入到左边内核工程中。之后设置环境变量。方法是单击PB菜单“platform”-“settings”-“environment”-“new”,输入环境变量名“IMGRAM64”,再输入值“1”。准备工作完成后,编译整个内核。你定制的内核就应该支持永久存储了。
   先不考虑注册表问题。假如我们的产品不需要保存注册表数据,但是需要将一些软件使用的配置信息保存到永久存储器中,那么采用ini文件方式比较适合。不采用注册表保存数据的原因是在定制内核时需要进行复杂的设置,来保证内核能在每次启动时加载保存到永久存储设备上的注册表数据。如果只是几个软件需要使用配置信息,那就没必要为了能够保存注册表数据而设置内核。把话说简单一点:除非必要,能不用注册表保存最好。
  虽然在EVC帮助文件中提到了MFC库中有CWinApp::WriteProfileInt和CWinApp::WriteProfileString 。而且在EVC下编译也通过了。但实际执行起来函数返回值为0,说明没有任何数据被写到硬盘上。在硬盘或者\windows目录下也没找到ini文件。这看起来很蹊跷,如果你使用EVC开发过,你就见怪不怪了。下面顺便说说我遇到过的“蹊跷”:
   A、有的函数在帮助文件中提到过,说CE支持此函数。但在编译时EVC不识别,或者链接时不识别。一种原因可能是你在安装了CE和EVC后,没有调整EVC的编译和链接目录,也就是包含头文件和库文件的目录。EVC在安装后,默认包含头文件和库文件的目录为Standard SDK目录,Standard SDK是专为模拟器准备的,自然内容很少,找不到某个函数也在情理中。解决办法是修改EVC的包含头文件和库文件的目录。位置在菜单“tools”-“options”-“directories”。在“CPUs”栏里选择你的CPU类型,然后分别添加头文件和库文件的目录,添加的头文件目录和库文件目录是安装Windows CE时SDK的目录。举例来说,假如开发平台使用的是x86 CPU。那么在“CPUs”中选择“Win32 (WCE x86)”,然后在“Show directories”中选择“include files”,接着在下面“Directories”栏里添加几个目录。如图1所示(SDK指软件开发包,OAK指OAL开发包,DDK指驱动开发包)。接着在“Show directories”中选择“library files”,把库文件目录也添加进去。如图2所示。另一种原因就是真的没有此函数。CE的帮助文件做的并不好。很多函数的说明、例子代码都是照抄于VC下的帮助文件。只有编译或者运行程序时你才知道这个函数是否存在。
注:如果你是在PB下创建工程编写程序,就不必设置了。


图一


图二

   回到正题。CWinApp::WriteProfileInt和CWinApp::WriteProfileString函数既然不能写数据到永久存储设备。那就必须自己写这两个函数和对应的读取数据函数GetProfileString和GetProfileInt。因为这四个函数使用频率很高,故我将此函数写出来,当你需要的时候就不用再写了。
注:1、函数中所有字符串均为UNICODE。2、采用了MFC类库。3、具体问题见代码。

写作时间:2004-5-14

未经本文作者同意,不准擅自转载本篇文章。联系作者请邮至 fllsoft@sina.com或windowsce@tom.com

阅读(249) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~