Win32下Foxbase+資料庫瀏覽程式的編寫 (轉)
一、目的
: (Cyrix 200MHz ), 16M,4G
要求:在98的中滑鼠雙擊任何一個Foxbase+圖示(每個檔案資料記錄在一萬條以下),開啟資料庫檔案並顯示資料庫內容。
二、步驟
Foxbase+資料庫檔案格式(參照Mark Sadler的檔案格式說明和相應C語言源程式檔案)
中發生的問題:
以下是Mark Sadler的F.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 se */
};
struct DBF
{
char filename[MA]; /* dfilename */
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;
這顯然在下無法編譯透過。但在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等),增加一些功能,使程式更加完美。
本文是幾年前所作,希望對初學者有所幫助。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10794571/viewspace-974729/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 瀏覽器資料庫 IndexedDB(一) 概述瀏覽器資料庫Index
- 瀏覽器資料庫 IndexedDB 入門教程瀏覽器資料庫Index
- astro中瀏覽器端使用lit編寫的componentsAST瀏覽器
- 利用 Powershell 編寫簡單的瀏覽器指令碼瀏覽器指令碼
- win32下彙編程式碼結構學習Win32
- 編寫資料庫設計文件資料庫
- Linux伺服器部署Web版VSCode,在window下使用瀏覽器在linux環境下編寫程式碼Linux伺服器WebVSCode瀏覽器
- 一張圖瀏覽資料庫各種型別資料庫型別
- Laravel 自增瀏覽數實現(資料庫 + Redis)Laravel資料庫Redis
- 用Rust編寫的資料庫GreptimeDB現開源Rust資料庫
- ChiselStore:Rust編寫的Raft分散式SQLite資料庫RustRaft分散式SQLite資料庫
- 資料庫課程作業筆記 - 編寫資料填充資料庫筆記
- 怎樣用Sourceinsight編輯/瀏覽整個工程的程式碼
- gluesql/gluesql:一個用Rust編寫的SQL資料庫引擎庫包SQLRust資料庫
- 資料庫課程作業筆記 - 編寫資料庫遷移檔案資料庫筆記
- Linux下的 sniff-andthen-spoof程式編寫Linux
- 達夢資料庫DM管理工具如何瀏覽資料,用條件篩選資料資料庫
- 程式設計面試題:編寫一個會造成資料庫死鎖的應用程式設計面試題資料庫
- sessionStorage:提供瀏覽會話資料的儲存Session會話
- 瀏覽器儲存資料的幾種方法瀏覽器
- 微信跳轉外部瀏覽器下載app詳解瀏覽器APP
- 編寫一個使用wreq庫的爬蟲程式爬蟲
- 七大SQL程式碼編寫原則:可顯著提高資料庫效能!SQL資料庫
- spacejam/sled:使用Rust語言編寫的嵌入式資料庫Rust資料庫
- 微信跳轉瀏覽器提示,微信瀏覽器中直接跳轉手機預設瀏覽器是怎麼實現的瀏覽器
- 使用 Visual Studio Code SQLite 擴充套件來瀏覽 SAP CAP 資料庫SQLite套件資料庫
- 如何通過瀏覽器 JavaScript API 訪問伺服器資料庫瀏覽器JavaScriptAPI伺服器資料庫
- 寫一個簡單的支援Node.js&瀏覽器的自定義事件庫Node.js瀏覽器事件
- Jack架設WIN32彙編程式的開發環境Win32開發環境
- [譯] 如何在瀏覽器中編寫一款藍芽應用瀏覽器藍芽
- js程式碼清楚瀏覽器資源clearCacheJS瀏覽器
- 概覽資料庫索引資料庫索引
- 資料庫課程作業筆記 - 編寫 RESTful 路由資料庫筆記REST路由
- 重學瀏覽器(1)-多程式多執行緒的瀏覽器瀏覽器執行緒
- Jack's第一個Win32彙編程式HelloWorldWin32
- 瀏覽器端儲存資料的終極指南瀏覽器
- 常見的瀏覽器端資料儲存方案瀏覽器
- 開啟瀏覽器,不用寫程式碼,做個小遊戲瀏覽器遊戲
- 使用Chatgpt編寫的PHP資料庫pdo操作類(增刪改查)ChatGPTPHP資料庫