手撸一个安装包制作工具(5) --生成器/项目链接

模板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个所有字符串信息文件]

手撸一个安装包制作工具(5) --生成器/项目链接_第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


转载于:https://my.oschina.net/tasker/blog/724839

你可能感兴趣的:(手撸一个安装包制作工具(5) --生成器/项目链接)