运行时生成exe

kuailejh 2003-07-18 09:06:46
看到有的文件分割软件,可以生成用于合并文件的exe,
是如何实现的?
分少点,穷啊,以后多了在发给大家
...全文
37 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
jbz 2003-07-24
  • 打赏
  • 举报
回复
jishiping(JSP 季世平)的方法确实不错,我分析了一个软件确实如此。

不过我建议这个exe由vc编译生成,那样会小很多。那个“冰雪分割机”生成的exe太大了点。
我见过的一个Split软件生成的合并文件只有二、三十K,不但具有文件完整性校验(CRC)。
并且具有友好的windows窗口界面。

jbz 2003-07-18
  • 打赏
  • 举报
回复
楼主的意思是如何实现动态生成exe文件,这样的软件确实见过不少。
我知道有用VC做的,而且生成的exe只有几十K大小,确实是很吸引人,
有必要大家讨论一下。
jishiping 2003-07-18
  • 打赏
  • 举报
回复
合并文件,简单的调用DOS命令copy就可以了。我看到的切割软件,都是产生一个批处理
文件,批处理文件里调用DOS命令copy来合并文件。
firewill 2003-07-18
  • 打赏
  • 举报
回复
同意楼上!还有一个类似的例子:图形界面的Arj压缩。就是把DOS下的Arj.exe作为资源编译进程序中,使用时再解压到临时目录下进行操作。看上去好像只有一个windows下的exe,实际上包含了arj.exe。希望能对你有所帮助!
duduwolf 2003-07-18
  • 打赏
  • 举报
回复
你也可以做到,你可以把一个exe以资源的方式添加到程序中,以后再代码里就可以直接操作这个exe的运行啦!
jishiping 2003-07-18
  • 打赏
  • 举报
回复
先写好一个EXE文件,然后将文件信息加到加到EXE的后面就可以了。假设E事先做好的EXE
大小为64KB,将数据加到EXE后面。EXE执行时,从64KB的地方读取数据。下面是我写的一个
EXE的源程序,就是用来合并文件的EXE。

#include <io.h>
#include <stdio.h>
#include <windows.h>

#define FILELEN 32
#define EXESIZE 57344

void main(int argc, char* argv[])
{
int num;
int nLen;
FILE *fp;
FILE *fp1;
FILE *fp2;
char buf[4096];
char tmp[FILELEN+1]="";
char File[FILELEN+1]="";

fp = fopen(argv[0], "rb");
if (fp==NULL) return;

nLen = filelength(fileno(fp));
if (nLen<=EXESIZE+FILELEN || (
nLen-EXESIZE)%FILELEN!=0) {
MessageBox(0, "文件长度不对!",
"", MB_OK);
fclose(fp); return;
}
fseek(fp, EXESIZE, SEEK_SET);
fread(File, 1, FILELEN, fp);
//File存放的是合并的文件名
if (access(File,0) == 0) {
wsprintf(buf, "文件%s已经存在。"
"需要覆盖吗?", File);
if (MessageBox(NULL,buf,"",
MB_YESNO)!=IDYES) {
fclose(fp); return;
}
}
fp1 = fopen(File, "wb");
if (fp1 == NULL) {
wsprintf(buf, "不能写文件%s!",
File);
MessageBox(NULL, buf, "", 0);
fclose(fp); return;
}
for(nLen-=EXESIZE+FILELEN; nLen>0;
nLen-=FILELEN) {
fread(tmp, 1, FILELEN, fp);
if (access(tmp,0) != 0) {
printf("文件%s不存在\n", tmp);
fclose(fp); fclose(fp1);
remove(File); return;
}
fp2 = fopen(tmp, "rb");
if (fp2 == NULL) {
printf("不能打开文件%s\n", tmp);
fclose(fp); fclose(fp1);
remove(File); return;
}
while(1) {
num = fread(buf, 1, sizeof(
buf), fp2);
if (num <= 0) {
fclose(fp2); break;
}
fwrite(buf, 1, num, fp1);
}
}
fclose(fp); fclose(fp1);
}

首先编译程序,生成EXE后查看EXE的大小,然后将宏 EXESIZE 改成你生成的EXE大小后再
编译就可以了(注意此时编译时不要修改任何参数,这样第二次编译的EXE才会和第一次
编译生成的EXE大小相同)。将这个程序作为资源放在分割程序中,需要的时候,将它从
资源中释放出来存成EXE,然后在这个文件的后面添加数据,每32个字节为一个文件名,
第一个文件存放合并后的文件名,以后的每32个字节存放被分割的文件的文件名。
jishiping 2003-07-18
  • 打赏
  • 举报
回复
先写好一个EXE文件,然后将文件信息加到加到EXE的后面就可以了。假设E事先做好的EXE
大小为64KB,将数据加到EXE后面。EXE执行时,从64KB的地方读取数据。下面是我写的一个
EXE的源程序,就是用来合并文件的EXE。

#include <io.h>
#include <stdio.h>
#include <windows.h>

#define FILELEN 32
#define EXESIZE 57344

void main(int argc, char* argv[])
{
int num;
int nLen;
FILE *fp;
FILE *fp1;
FILE *fp2;
char buf[4096];
char tmp[FILELEN+1]="";
char File[FILELEN+1]="";

fp = fopen(argv[0], "rb");
if (fp==NULL) return;

nLen = filelength(fileno(fp));
if (nLen<=EXESIZE+FILELEN || (
nLen-EXESIZE)%FILELEN!=0) {
MessageBox(0, "文件长度不对!",
"", MB_OK);
fclose(fp); return;
}
fseek(fp, EXESIZE, SEEK_SET);
fread(File, 1, FILELEN, fp);
//File存放的是合并的文件名
if (access(File,0) == 0) {
wsprintf(buf, "文件%s已经存在。"
"需要覆盖吗?", File);
if (MessageBox(NULL,buf,"",
MB_YESNO)!=IDYES) {
fclose(fp); return;
}
}
fp1 = fopen(File, "wb");
if (fp1 == NULL) {
wsprintf(buf, "不能写文件%s!",
File);
MessageBox(NULL, buf, "", 0);
fclose(fp); return;
}
for(nLen-=EXESIZE+FILELEN; nLen>0;
nLen-=FILELEN) {
fread(tmp, 1, FILELEN, fp);
if (access(tmp,0) != 0) {
printf("文件%s不存在\n", tmp);
fclose(fp); fclose(fp1);
remove(File); return;
}
fp2 = fopen(tmp, "rb");
if (fp2 == NULL) {
printf("不能打开文件%s\n", tmp);
fclose(fp); fclose(fp1);
remove(File); return;
}
while(1) {
num = fread(buf, 1, sizeof(
buf), fp2);
if (num <= 0) {
fclose(fp2); break;
}
fwrite(buf, 1, num, fp1);
}
}
fclose(fp); fclose(fp1);
}

首先编译程序,生成EXE后查看EXE的大小,然后将宏 EXESIZE 改成你生成的EXE大小后再
编译就可以了(注意此时编译时不要修改任何参数,这样第二次编译的EXE才会和第一次
编译生成的EXE大小相同)。将这个程序作为资源放在分割程序中,需要的时候,将它从
资源中释放出来存成EXE,然后在这个文件的后面添加数据,每32个字节为一个文件名,
第一个文件存放合并后的文件名,以后的每32个字节存放被分割的文件的文件名。
tjzzx888 2003-07-18
  • 打赏
  • 举报
回复
用copy /b
kuailejh 2003-07-18
  • 打赏
  • 举报
回复
对啊,对啊,jbz(虚心求教)说的对,
http://www.skycn.com/soft/9913.html
这个分割软件就可以生成exe文件,
把exe放到资源里当然可以,但exe执行时怎么得到分割后的所有文件名?是用这个exe搜索*.*.000这样的文件名么?不可能的,随便写这样的文件名会提示错误。
那它是怎么实现的?

13,873

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧