程序由BCB完成,带有一些BCB特有的VCL类型,如TStringList、AnsiString。
下面是捆绑的程序,使用该程序进行捆绑生成一个新的程序,该程序便是可以进行自动分解的程序了。还可以加入分解后运行某一个文件的功能。
下面是主要实现代码:
BOOL TForm1::DoBind(BOOL self, AnsiString filename) //自解压 ... { int ExecuteFileNum = strExecuteFile->Count; int NonExecuteFileNum = strNonExecuteFile->Count; AnsiString strSelfExtFile = filename; int FileNum = ExecuteFileNum + NonExecuteFileNum; //CONTROL_INFO SELF_EXTRACT_INFO SELF_EXTRACT_INFO *pBind = new SELF_EXTRACT_INFO[FileNum+1]; CONTROL_INFO KeyInfo; DWORD nFileSize; struct _stat st; // FILE *fpread, *fpwrite; // if((fpwrite = fopen(strSelfExtFile.c_str(),"wb"))==NULL) ...{ delete []pBind; return FALSE; } if(self == TRUE) //自解压 ...{ FileNum++; AnsiString matrix = ExtractFilePath(Application->ExeName); matrix = matrix + "MatrixFile.exe"; _stat(matrix.c_str(),&st); pBind[0].nFileSize = st.st_size; //此处加入母体程序 if((fpread = fopen(matrix.c_str(),"rb"))==NULL) ...{ delete []pBind; fclose(fpwrite); return FALSE; } int c; while((c = fgetc(fpread))!=EOF) ...{ fputc(c,fpwrite); } fclose(fpread); } else ...{ _stat(strExecuteFile->Strings[0].c_str(),&st); pBind[0].nFileSize = st.st_size; } //by jingzhongrong int i; for(i=0; i<ExecuteFileNum; i++) ...{ strcpy(pBind[i+1].cFileName,strExecuteFile->Strings[i].c_str()); _stat(strExecuteFile->Strings[i].c_str(),&st); pBind[i+1].nFileSize = st.st_size; nFileSize += st.st_size; pBind[i+1].bExecute = TRUE; } for(i=0; i<NonExecuteFileNum; i++) ...{ strcpy(pBind[i+1+ExecuteFileNum].cFileName,strNonExecuteFile->Strings[i].c_str()); _stat(strNonExecuteFile->Strings[i].c_str(),&st); pBind[i+1+ExecuteFileNum].nFileSize = st.st_size; nFileSize += st.st_size; pBind[i+1+ExecuteFileNum].bExecute = TRUE; } KeyInfo.nBindNum = FileNum; KeyInfo.nObjectSize = pBind[0].nFileSize; if(self==TRUE) ...{ nFileSize += pBind[0].nFileSize; } else ...{ } KeyInfo.nFileSize = nFileSize + sizeof(CONTROL_INFO) + (FileNum-1)*sizeof(SELF_EXTRACT_INFO); KeyInfo.nBindType = 0; KeyInfo.nExecuteType = 1; // FileNum = ExecuteFileNum + NonExecuteFileNum + 1; for(i=1;i<FileNum;i++) ...{ if((fpread = fopen(pBind[i].cFileName,"rb"))==NULL) ...{ delete []pBind; return FALSE; } strcpy(pBind[i].cFileName,ExtractFileName(AnsiString(pBind[i].cFileName)).c_str()); fwrite(&pBind[i],1,sizeof(SELF_EXTRACT_INFO),fpwrite); int c; while((c = fgetc(fpread)) != EOF) ...{ fputc(c,fpwrite); } fclose(fpread); } fwrite(&KeyInfo,1,sizeof(CONTROL_INFO),fpwrite); fclose(fpwrite); delete []pBind; // return TRUE;}上面代码是我直接从程序中复制过来的,没有去修改,程序功能比这篇文章中所写要复杂一点,所以下面说一下代码的主要流程。
先读取自解压控制程序然后写入一个指定的文件中,之后读取要捆绑的文件的文件信息,填充SELF_EXTRACT_INFO结构,之后写入文件,再把捆绑的文件内容接着写入文件,重复知道所有要捆绑的文家全部写入完成,在最后,程序填充控制信息CONTROL_INFO结构,写在文件最后,这是为了自解压控制程序可以读出有关的控制信息。
读出写入文件的主要代码如下:
fwrite(&pBind[i],1,sizeof (SELF_EXTRACT_INFO),fpwrite); int c; while((c = fgetc(fpread)) != EOF) { fputc(c,fpwrite); } fclose(fpread);//write by jingzhongrong
last edit by jingzhongrong at 17:51 2007/2/24