模板EXE中已经指定了详细的结构,生成器只要按照结构写入文件尾部即可
为了方便调用, 这里只开发一个命令程序
下面是生成器的步骤:
1: 获取调用参数,用于初始化信息头
2: 开始生成时, 生成器将模板exe拷贝一份到[生成目标]
3: 遍历生成的文件夹,写入信息头
4: 将信息头[addedSector]写入生成目标的最后
5: 将安装所需的临时文件按照结构[fileblock]写入生成目标
5: 将每个文件[fileblock]依次写入生成目标
这里源码就很简单了,我只挑几个易错的地方解释下:
写入文件尾部时:
FILE * f = fopen ( filename, "ab" );
if( f)
{
fwrite ( buf , size, 1, f );
fclose ( f );
return true ;
}
这是要注意,写如频繁时可能会返回错误32,重复去写就好了.
else
{
//为了防止磁盘的cache导致的fclose后不立即刷新文件
//这里一直尝试去打开文件
Sleep ( 1 );
//printf("fopen err: %d\n",GetLastError());
return appendFile ( filename, buf , size );
}
因为我的安装包程序采用的是单个文件压缩的方式
所以将来扩展的时也可以很好的实现各种压缩混合在一起
//使用了开源的zip.cpp/zip.h
//
if(strcmp( compressStr, "zip" ) == 0)
{
char tmpfile[260];
strcpy( tmpfile, filename );
strcat( tmpfile, ".zip" );
HZIP hz = CreateZip( tmpfile, 0 );
ZipAdd( hz, FsGetFileName( filename ), filename );
CloseZip( hz );
DeleteFileA( filename );
MoveFileA( tmpfile, filename );
}
这样压缩之后再重新计算填充fileblock, 然后追加到模板exe就可以了
生成器的使用方式:
将生成器模板exe以及临时文件放入相同目录中,使用命令行调用即可.
调用规则:
//-------------------------------------------------------------------------------
// 生成目标 安装包主名 文件夹 压缩 自动运行
//
// arg -> generator -c:\setup.exe -programName -folder -zip -xxxx.exe
// -none
//-------------------------------------------------------------------------------
[3个图片 1个所有字符串信息文件]
str.txt文件 - 中文编码 (GB2312):
安装 - %s
< 上一步(B)
下一步(N) >
取消
继续
安装(I)
完成(F)
欢迎使用 %s 安装向导
现在将安装 %s。
建议你在继续之前关闭其他应用程序。
点击"下一步"继续,或者点击"取消"退出安装。
选择目标位置
%s 要安装到哪里?
安装程序将把 %s 安装到以下文件夹。
若要继续,请点击"下一步"。 如果你要换一个文件夹,请点击"浏览"。
浏览(R)...
准备安装
安装程序准备在你的电脑上安装。
点击"安装"继续,如果你想修改设置请点击"上一步"。
正在安装
正在安装 %s, 请稍后...
正在提取文件...
%s 安装向导完成
安装程序已在您的电脑中安装了 %s 。 此应用程序可以通过选择安装的快捷方式运行。
单击'完成'退出安装程序。
运行 %s
退出安装
安装未完成!如果你现在退出,程序将无法完成!
要退出安装吗?
目标位置:
生成器项目传送门: http://git.oschina.net/codetimer/ctParcel-Generator
模板EXE项目传送门: http://git.oschina.net/codetimer/ctParcel