Win32下Foxbase+数据库浏览程序的编写

程序|数据|数据库

一、目的
硬件:CPU (Cyrix 200MHz ), 内存16M,硬盘4G
要求:在WINDOWS98的资源管理器中鼠标双击任何一个Foxbase+数据库文件图标(每个文件数据记录在一万条以下),程序打开数据库文件并显示数据库内容。

二、步骤
Foxbase+数据库文件格式(参照Mark Sadler的文件格式说明和相应C语言源程序文件)
编程中发生的问题:
以下是Mark Sadler的DBF.H文件部分内容:
typedef unsigned char UCHAR;

struct FIELD_RECORD     /* This structure is filled in memory */
{            /* with a fread. do not change. */
  char  name[11];     /* name of field in asciz */
  char  typ;        /* type of field...char,numeric etc. */
  char *field_data_address;   /* offset of field in record */
  #if defined(__TINY__) || defined(__SMALL__) || defined (__MEDIUM__)
  int space_holder;     /* field_data_address must be 32 bits */
  #endif
  UCHAR len;        /* length of field */
  UCHAR dec;        /* decimals in field */
  UCHAR reserved_bytes[14];  /* reserved by dbase */
};

struct DBF
{
  char filename[MAXPATH];     /* dos filename */
  FILE *file_ptr;      /* c file pointer */
  unsigned long int current_record;/* current record in memory */
  enum           /* status of file */
  {
   not_open=0,
   not_updated,
   updated
  } status;
  UCHAR num_fields;       /* number of fields */

  /* the following 7 variables are filled with a fread, do not change order or size */
  UCHAR dbf_version;     /* version character */
  UCHAR update_yr;      /* date of last update - year (-1900) */
  UCHAR update_mo;      /* date of last update - month */
  UCHAR update_day;       /* date of last update - day */
  unsigned long int records;   /* number of records in dbf */
  unsigned int header_length;  /* length of header structure */
  unsigned int record_length;  /* length of a record */
  /*                */
  struct FIELD_RECORD *fields_ptr; /* pointer to field array */
  char *record_ptr;       /* pointer to current record struct */
};

int d_addrec(struct DBF *d);
int d_blank(struct DBF *d);
int d_close(struct DBF *d);
int d_cpystr(struct DBF *s,struct DBF *d);
char d_getfld(struct DBF *d,int f,char *buff);
int d_getrec(struct DBF *d,unsigned long int r);
int d_open(struct DBF *d);
int d_putfld(struct DBF *d,int f,char *buff);
int d_putrec(struct DBF *d,unsigned long int r);

以上资料中提供的函数都提供了源程序,虽然大部分都是使用ANSI C,但却是针对DOS方式下的。如更新日期:
       inregs.h.ah=0x2a;
  intdos(&inregs,&outregs);
  d->update_day=outregs.h.dl;
  d->update_mo=outregs.h.dh;
  d->update_yr=outregs.x.cx-1900;
这显然在Win32下无法编译通过。但在DOS下完全可以编译通过,并准确地读出各条记录信息。
修改以上各函数,使之符合WIN32特点,编译通过。
运行程序,发现无法正确显示数据库内容。
由于函数实现部分已经全部修改为Win32可以接受的形式,没什么问题,只有检查DBF.H。
DOS的int与char一样为8bit, 而WIN32中,int 为32bit,Smallint 为8bit。
修改DBF.h文件,将struct中所有的int 改为Smallint,long int 改为int。
编译通过,程序能正常运行。
三、总结
在WIN32沿用DOS方式下的C程序时,要特别注意不同平台下的区别。
以上程序还可适当加强,如:读入各项数据时应新建一线程,并增加一进度条显示数据库文件读入情况,再编写一些函数(如Find、Delete等),增加一些功能,使程序更加完美。
本文是几年前所作,希望对初学者有所帮助。

时间: 2024-09-19 20:38:09

Win32下Foxbase+数据库浏览程序的编写的相关文章

jsp+javabean开发模式下,数据库sql语句的编写规范

js|规范|数据|数据库|语句 在中小型的开发团队或开发项目中,很多人选择了jsp+javabean的开发模式,但这种模式下,sql语句应该写在什么位置,很多人,包括我自己都会走很多的弯路.        很多书上要么推荐sql语句写在bean中,让jsp调用即可(理由是这样子比较规范),要么推荐sql语句写在jsp文件中(理由是方便开发,开发速度很快),但我在实际开发中,发现采用上述两种方式都不是很好,下面我将我的方法说一下,希望得到大家的指正.        我认为在做列表查询时,即按照某种

Win32下病毒设计入门_安全相关

   Win32下病毒设计入门  本文假定你对dos下的病毒和386PM有一定的了解.  1.感染任何一个病毒都需要有寄主,把病毒代码加入寄主程序中 (伴侣病毒除外).  以下说明如何将病毒代码嵌入PE文件中,有关PE文件的结构请看以前的文章. PE文件的典型结构: MZ Header DOS STUB CODE PE HEADER OPTIONAL HEADER SECTION TABLE SECTION 1 SECTION 2 ... IMPORT TABLE EXPORT TABLE 和D

在osx系统下,能用c语言编写窗口化的程序么?

问题描述 在osx系统下,能用c语言编写窗口化的程序么? 在mac下,c语言能编写窗口化的程序么, 我在网上搜索了下,没有具体的回答,但是有人说程序是否窗口化和语言无关,只和 调用的api有关... 小弟菜鸟一个,求大神给解答下,如果调用api怎么调用啊.. 用的xcode,可我确实是太菜了,用不明白啊,哪位大牛推荐个网站,帖子,视频之类的, 让我学习学习,不胜感激-- 解决方案 可以的,使用qt.http://blog.csdn.net/libaineu2004/article/details

面向对象在数据库应用程序中的应用(dotNet)

程序|对象|数据|数据库 面向对象在数据库应用程序中的应用(dotNet) 现在的应用程序很大一部分都是与数据库相关的程序,而写数据库程序会涉及到很多数据表,访问和操纵数据表构成了数据库应用程序最常见的动作,所以,编写出高效的程序对于程序员来说是不得不去考虑的.本文将讨论这个话题,希望对读者朋友有所裨益. 面向对象是当今程序界的普遍编程思想,他具有三个最基本的特征:封装.继承和多态.继承对于代码的复用非常有效,多态则是指函数(方法)的多种形态,可以通过子类重写父类的方法来改变对象的行为,在面向对

第十三章-Delphi开发数据库应用程序概述(一)(3)

13.3 Delphi数据库的体系结构 Delphi使用可视化的部件创建数据库应用,跟创建其它的非数据库应用程序一样,数据库部件都具备一定的属性,程序设计人员可以在设计过程中设置部件的多种属性,也可以在程序运行过程中通过程序来设置部件的各种属性. 在Delphi部件板上有两页数据库部件用于开发数据库应用程序: 数据访问部件页:该页上的部件主要用于说明有关的数据库的信息,如应用程序要访问(连接)的数据库,要访问数据库中的具体的数据库表,以及要访问表中哪些字段等,在实际的开发应用中常用的部件有TDa

第十三章-Delphi开发数据库应用程序概述(一)(2)

13.2.1 Delphi的数据库特性 跟其他的应用程序一样,Delphi提供了许多部件以方便地创建数据库应用程序.数据库对象的数据成员既可在设计阶段设置,也可在运行阶段通过程序代码进行设置.Delphi的部件板上提供了两页数据库应用程序开发中所要使用的部件: 数据访问页(Data Access Page)上的部件用于直接访问数据库中的数据库表. 数据控制页(Data Control Page)上的部件用来与用户交互,显示.修改数据库中的数据. 数据库应用程序首先是利用Delphi提供的数据库部

利用ASP技术开发基于WWW的数据库检索程序

程序|数据|数据库  ASP是微软公司推出的用以取代CGI的新技术,是目前公认的建立Windows NT动态站点最好的工具.它与ADO(Active Data Object,一种新的数据访问模型)的充分结合,提供了强大的数据库访问功能,使之成为进行网上数据库管理的重要手段.     一.ASP简介   ASP内含于Internet Information Server(简称IIS3.0)中,扩展名以.asp表示.ASP文件可以用常规的文本编辑器编辑,也可以利用专门的辅助开发工具InterDev进

第十三章-Delphi开发数据库应用程序概述(二)(2)

13.3.3 数据库窗体专家和数据库操作台(DBD) Delphi为用户开发简单的数据库应用程序提供了一个开发工具叫做"数据库窗体专家"(Database Form Expert),在Delphi系统菜单Tool菜单下可以找到. 数据库窗体专家能够自动生成简单的数据库应用程序中所必须完成的许多任务,它还可以生成基于单个数据库表的应用程序窗体或基于主要──明细型多个数据库表的应用程序窗体,数据库窗体专家能够自动完成的任务如下: ● 放置数据库部件到窗体中(TDataSource部件) ●

第十三章-Delphi开发数据库应用程序概述(二)(1)

13.3.2 数据控制部件 数据控制部件页上的部件,主要用于设计用户界面,对数据库中的数据进行浏览.编辑.插入.删除等操作.因而数据控制部件常常又被称为数据浏览部件,数据控制部件其实是在Standard页上的标准部件的基础上,相应地增加了数据浏览功能,使得它们能够显示和编辑数据库中数据信息. 数据控制部件既能够把数据库中的数据显示到窗体中,又可以将其自身的经过修改的数据写回到数据库中.下表列出了数据控制页上的数据控制部件及它们的主要用途. 表13.5 数据控制部件 ━━━━━━━━━━━━━━━