要打包数据库进exe完全不是一件复杂的事(事实上相当简单, 加到resource文件里一起
编译就成了)
使用时把resource里的内容写入一个临时文件即可进行数据库操作了.
但是这样做的限制很多, 首先, 你不能修改该数据库的内容, 即使改也只是改动临时
库, 因为原始库的内容在exe中. 如果硬要修改, 也不是办不到, 但方法相当复杂,
而且不是该程序自身能够完成的,必须想办法生成或调用另一个exe, 同时关闭自己,让
另一个程序完成接下的操作. 做完之后再重新运行, 难度和复杂度可想而知(变态?).
其次, 一个100M+的exe文件是不是能正常运行不出问题还不得而知.
第三, 如果先压缩再打包, 又增加了编程的难度(读取时还要处理解包).
讲了这么多不好的地方, 打包的方法如下(通过.res, 这是最方便的方法了), 您自己
考虑一下:
1. 用任何文本编辑器生成一个后缀名为rc的文本文件,如"myres.rc".
2. 文本中格式如下:
1 RCDATA "C:/TEMP/MYDBF.DBF"
^^^ ^^^^^^ ^^^^^^^^^^^^^^^^^^^
ID 数据类型 需要打包进.res的文件
2 RCDATA "C:/TEMP/MYDBF.MDX"
每行定义.res中的一项
3. 用BRCC32.EXE 把.rc文件编译成.res
命令行为:
BRCC32.EXE myres.rc
4. 在你的工程文件(.dpr)中加上
{$R MYRES.RES}
重新编译即可
运行时可通过读取resource中的内容生成一个临时数据库进行操作, 具体方法如下:
procedure TForm1.FormCreate(Sender: TObject);
var
ResStream: TResourceStream;
begin
ResStream:=TResourceStream.CreateFromID(HInstance, 1, RT_RCDATA);
ResStream.SaveToFile('myres.dbf');
ResStream.Free;
ResStream:=TResourceStream.CreateFromID(HInstance, 2, RT_RCDATA);
ResStream.SaveToFile('myres.mdx');
ResStream.Free;
end;
这样生成的myres.dbf就是你打包进exe里的数据库了. 如果不带索引(或者准备临时
create index), 这个dbf可以取任何名称. 否则该dbf名称必须和打包前一致(不然
报找不到mdx错).