![]() |
中国DOS联盟-- 联合DOS 推动DOS 发展DOS --联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum |
| 游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟 |
|
中国DOS联盟论坛 现在时间是 2026-09-25 11:52 |
共 47,813 主题排行 / 349,918 发帖 / 今日 0 篇 / 48,274 会员排行 |
| DOS批处理 & 脚本技术(批处理室) » [推荐] BAT转COM的C语言源程序 |
| 可打印版本 2,036 / 14 |
| 第1楼 JonePeng | 发表于 2004-08-23 00:00 |
| 金牌会员 发帖 1,883 积分 4,562 来自 广东广州 | |
|
[推荐] BAT转COM的C语言源程序 最近我发现了一个把BAT文件转成COM的C语言原代码,编译后效果不错,转换后的COM文件比BAT2COM转换的要小得多,执行效率也更快。为了尊重原作者的创作权,在此不列出源程序,请光临他的网站:http://member.netease.com/~gmounto/cpro/BAT2COM.html
|
|
| 第2楼 Kinglion | 发表于 2004-08-26 00:00 |
| 铂金会员 发帖 1,924 积分 5,798 来自 金獅電腦軟體工作室 | |
|
支持原创作品!
|
|
| 第3楼 JonePeng | 发表于 2006-05-04 21:56 |
| 金牌会员 发帖 1,883 积分 4,562 来自 广东广州 | |
|
坛友wang6610今天提醒我 1 楼的链接已经失效,可能原链接更改或者因作者没有付费而空间被关闭。幸好我有源程序的备份,现在贴出来供大家学习和研究。
|
|
| 第4楼 wang6610 | 发表于 2006-05-05 05:46 |
| 银牌会员 发帖 488 积分 1,246 | |
|
谢谢JonePeng!!!
|
|
| 第5楼 chineselgs | 发表于 2006-05-06 15:24 |
| 高级用户 发帖 266 积分 613 来自 河南省 | |
|
晕,这个网站怎么打不开啊?? |
|
| 第6楼 272922032 | 发表于 2006-05-08 07:02 |
| 禁止访问 发帖 41 积分 97 | |
|
程序有1个错误,无法编译 |
|
| 第7楼 home | 发表于 2006-05-22 21:35 |
| 初级用户 发帖 27 积分 170 | |
|
源程序清单
/*************************************************************/ /* 程序名称: BAT2COM.C 1.50 */ /* 作 者: 董占山 */ /* 完成日期: 1993,1995 */ /* 用 途: 将批处理文件(.bat)转换为命令文件(.COM) */ /* 编译方法: 用下列命令编译连接可以得到BAT2COM.COM: */ /* tcc -mt bat2com */ /* tlink c:\tc\lib\c0t+bat2com,bat2com,,c:\tc\lib\cs\lib /t */ /*************************************************************/ #include <stdio.h> #include <string.h> /* 生成命令文件的头部,包含调用2EH的机器指令 */ char bat2comhead[81] = { 0xBB,0x00,0x10,0xB4,0x4A,0xCD,0x21,0x0E,0x1F,0x2E, 0x8B,0x0E,0x51,0x01,0xBE,0x51,0x01,0x8B,0xC6,0x50, 0x5B,0x51,0x83,0xC3,0x02,0x8B,0xF3,0x33,0xDB,0x8A, 0x1C,0x53,0x56,0x2E,0x8C,0x16,0x4D,0x01,0x2E,0x89, 0x26,0x4F,0x01,0xCD,0x2E,0x0E,0x1F,0x2E,0x8B,0x26, 0x4F,0x01,0x2E,0x8E,0x16,0x4D,0x01,0x58,0x5B,0x59, 0x03,0xC3,0x50,0x83,0xE9,0x01,0x83,0xF9,0x00,0x75, 0xCD,0xB8,0x00,0x4C,0xCD,0x21,0xC3,0x00,0x00,0x00, 0x00}; int totallength; /* 所生成文件的总长度 */ char buffer[10000]; /* 生成命令文件的缓冲区 */ /* 删除批命令中的无意义的前导空格函数 */ void removespace(str1) char *str1; { unsigned int i=0; char *str2; str2=str1; /* str2指向str1的地址 */ if ((str1==' ') && (i==0)) { ++str1; /* str1地址加1 */ movmem(str1,str2,strlen(str1)+1); /* 删除一个前导空格 */ removespace(str2); /* 递归调用此函数 */ } } /* 将批命令中的"%%"改为"%"的函数 */ void removedouble(str1) char *str1; { unsigned int j,i=0; char *str2; str2=str1; /* str2指向str1的地址 */ if ((str1=='%') && (str1[++i]=='%')) { --i; for (j=0;j<i;j++) { ++str1;++str2; } ++str1; movmem(str1,str2,strlen(str1)+1); /* 删除一个'%'字符 */ removedouble(str2); /* 递归调用此函数 */ } } /* 删除批命令中的"@"符号函数 */ void removeatchar(str1) char *str1; { char *str2; str2=str1; /* str2指向str1的地址 */ if (str1[0]=='@') { ++str1; movmem(str1,str2,strlen(str1)+1); /* 删除字符'@' */ } } /* 转换所有的批命令,并写入缓冲区 */ void transfer(flnm) char *flnm; { unsigned int i, cmnum=0; char strlen1,ch,str1[256],*p,*cm; FILE *txtfl; if ((txtfl=fopen(flnm,"r"))==NULL) { printf("Input file is not found !"); exit(0); } p = buffer; /* p指向缓冲区的开始地址 */ for (i=0;i<81;++i) *p++=bat2comhead; /* 将命令文件头写入缓冲区 */ ch = 0x0d; /* 回车符 */ totallength = 83; /* 命令文件头加2个字节的总长度 */ for (i=0;i<2;i++) p++; /* p指针相前移动2个字节 */ do { fgets(str1,256,txtfl); /* 从批文件中读一条命令 */ removespace(str1); /* 删除前导空格 */ removedouble(str1); /* 将"%%"改为"%" */ removeatchar(str1); /* 删除"@"字符 */ strlen1 = strlen(str1); /* 计算命令串长度 */ if (strlen1>2) { /* 合法命令? */ ++cmnum; /* 命令数加1 */ *p++ = strlen1-1; /* 把命令长度写入缓冲区 */ ++totallength; /* 命令文件总长度加1 */ for (i=0;i<strlen1-1;++i) *p++ = str1; /* 将命令串写入缓冲区 */ totallength += strlen1-1; /* 命令文件总长度加上命令串长度 */ *p++=ch; /* 写入一个回车符 */ ++totallength; /* 命令文件总长度加1 */ strcpy(str1,""); /* 清除命令字符串内容 */ } } while (!feof(txtfl)); /* 是文件尾吗 ? */ cm = &cmnum; /* 写入命令个数 */ buffer[81] = *cm++; buffer[80] = *cm; fclose(txtfl); /* 关闭文件 */ } /* 将构造好的缓冲区内容写入命令文件 */ void writeBAT2COM(flnm) char *flnm; { FILE *bfl; unsigned int i; char drive[3],dir[65],name[9],ext[5]; fnsplit(flnm,drive,dir,name,ext); strcat(name,".com"); if ((bfl=fopen(name,"wb"))==NULL) { /* 建立并打开一个二进制文件 */ printf("File does not opened !"); exit(1); } fwrite(buffer,totallength,1,bfl); /* 写缓冲区的内容 */ /* for (i=0;i<totallength;++i) fprintf(bfl,"%c",buffer); */ /* for (i=0;i<totallength;++i) fputc(buffer,bfl); */ fclose(bfl); } /* 帮助函数 */ void help() { printf("\nSyntex : B2C Batch_filename"); exit(0); } /* 主函数 */ main(argc,argv) int argc; char *argv[]; { char flnm[80]; printf("\nB2C Version 1.0 Copyright (c) 1993,94 Dong Zhanshan"); switch (argc) { case 1 : help();break; case 2 : strcpy(flnm,argv[1]);break; default: help(); } transfer(flnm); writeBAT2COM(flnm); } 大家看看这个,是不是 |
|
| 第8楼 qylml | 发表于 2006-06-14 16:49 |
| 新手上路 发帖 5 积分 10 | |
|
学习中ing.....
:) |
|
| 第9楼 wang6610 | 发表于 2006-08-13 15:55 |
| 银牌会员 发帖 488 积分 1,246 | |
|
/*************************************************************/
/* 程序名称: BAT2COM.C 1.50 */ /* 作 者: 董占山 */ /* 完成日期: 1993,1995 */ /* 用 途: 将批处理文件(.bat)转换为命令文件(.COM) */ /* 编译方法: 用下列命令编译连接可以得到BAT2COM.COM: */ /* tcc -mt bat2com */ /* tlink c:\tc\lib\c0t+bat2com,bat2com,,c:\tc\lib\cs\lib /t */ /*************************************************************/ #include <stdio.h> #include <string.h> /* 生成命令文件的头部,包含调用2EH的机器指令 */ char bat2comhead[81] = { 0xBB,0x00,0x10,0xB4,0x4A,0xCD,0x21,0x0E,0x1F,0x2E, 0x8B,0x0E,0x51,0x01,0xBE,0x51,0x01,0x8B,0xC6,0x50, 0x5B,0x51,0x83,0xC3,0x02,0x8B,0xF3,0x33,0xDB,0x8A, 0x1C,0x53,0x56,0x2E,0x8C,0x16,0x4D,0x01,0x2E,0x89, 0x26,0x4F,0x01,0xCD,0x2E,0x0E,0x1F,0x2E,0x8B,0x26, 0x4F,0x01,0x2E,0x8E,0x16,0x4D,0x01,0x58,0x5B,0x59, 0x03,0xC3,0x50,0x83,0xE9,0x01,0x83,0xF9,0x00,0x75, 0xCD,0xB8,0x00,0x4C,0xCD,0x21,0xC3,0x00,0x00,0x00, 0x00}; int totallength; /* 所生成文件的总长度 */ char buffer[10000]; /* 生成命令文件的缓冲区 */ /* 删除批命令中的无意义的前导空格函数 */ void removespace(str1) char *str1; { unsigned int i=0; char *str2; str2=str1; /* str2指向str1的地址 */ if ((str1[i]==' ') && (i==0)) { ++str1; /* str1地址加1 */ movmem(str1,str2,strlen(str1)+1); /* 删除一个前导空格 */ removespace(str2); /* 递归调用此函数 */ } } /* 将批命令中的"%%"改为"%"的函数 */ void removedouble(str1) char *str1; { unsigned int j,i=0; char *str2; str2=str1; /* str2指向str1的地址 */ if ((str1[i]=='%') && (str1[++i]=='%')) { --i; for (j=0;j<i;j++) { ++str1;++str2; } ++str1; movmem(str1,str2,strlen(str1)+1); /* 删除一个'%'字符 */ removedouble(str2); /* 递归调用此函数 */ } } /* 删除批命令中的"@"符号函数 */ void removeatchar(str1) char *str1; { char *str2; str2=str1; /* str2指向str1的地址 */ if (str1[0]=='@') { ++str1; movmem(str1,str2,strlen(str1)+1); /* 删除字符'@' */ } } /* 转换所有的批命令,并写入缓冲区 */ void transfer(flnm) char *flnm; { unsigned int i, cmnum=0; char strlen1,ch,str1[256],*p,*cm; FILE *txtfl; if ((txtfl=fopen(flnm,"r"))==NULL) { printf("Input file is not found !"); exit(0); } p = buffer; /* p指向缓冲区的开始地址 */ for (i=0;i<81;++i) *p++=bat2comhead[i]; /* 将命令文件头写入缓冲区 */ ch = 0x0d; /* 回车符 */ totallength = 83; /* 命令文件头加2个字节的总长度 */ for (i=0;i<2;i++) p++; /* p指针相前移动2个字节 */ do { fgets(str1,256,txtfl); /* 从批文件中读一条命令 */ removespace(str1); /* 删除前导空格 */ removedouble(str1); /* 将"%%"改为"%" */ removeatchar(str1); /* 删除"@"字符 */ strlen1 = strlen(str1); /* 计算命令串长度 */ if (strlen1>2) { /* 合法命令? */ ++cmnum; /* 命令数加1 */ *p++ = strlen1-1; /* 把命令长度写入缓冲区 */ ++totallength; /* 命令文件总长度加1 */ for (i=0;i<strlen1-1;++i) *p++ = str1[i]; /* 将命令串写入缓冲区 */ totallength += strlen1-1; /* 命令文件总长度加上命令串长度 */ *p++=ch; /* 写入一个回车符 */ ++totallength; /* 命令文件总长度加1 */ strcpy(str1,""); /* 清除命令字符串内容 */ } } while (!feof(txtfl)); /* 是文件尾吗 ? */ cm = &cmnum; /* 写入命令个数 */ buffer[81] = *cm++; buffer[80] = *cm; fclose(txtfl); /* 关闭文件 */ } /* 将构造好的缓冲区内容写入命令文件 */ void writeBAT2COM(flnm) char *flnm; { FILE *bfl; unsigned int i; char drive[3],dir[65],name[9],ext[5]; fnsplit(flnm,drive,dir,name,ext); strcat(name,".com"); if ((bfl=fopen(name,"wb"))==NULL) { /* 建立并打开一个二进制文件 */ printf("File does not opened !"); exit(1); } fwrite(buffer,totallength,1,bfl); /* 写缓冲区的内容 */ /* for (i=0;i<totallength;++i) fprintf(bfl,"%c",buffer[i]); */ /* for (i=0;i<totallength;++i) fputc(buffer[i],bfl); */ fclose(bfl); } /* 帮助函数 */ void help() { printf("\nSyntex : B2C Batch_filename"); exit(0); } /* 主函数 */ main(argc,argv) int argc; char *argv[]; { char flnm[80]; printf("\nB2C Version 1.0 Copyright (c) 1993,94 Dong Zhanshan"); switch (argc) { case 1 : help();break; case 2 : strcpy(flnm,argv[1]);break; default: help(); } transfer(flnm); writeBAT2COM(flnm); } |
|
| 第10楼 NaturalJ0 | 发表于 2006-08-15 00:58 |
| 银牌会员 发帖 533 积分 1,181 | |
|
编译失败了,请高手指点一下。非常感谢。
|
|
| 第11楼 mornsmile | 发表于 2006-08-16 08:11 |
| 初级用户 发帖 23 积分 147 | |
| 第12楼 redtek | 发表于 2007-02-08 07:23 |
| 金牌会员 发帖 1,147 积分 2,902 | |
|
精彩!!!收藏~~~
|
|
| 第13楼 anqing | 发表于 2007-02-08 08:13 |
| 高级用户 发帖 413 积分 859 | |
|
谢谢
|
|
| 第14楼 wang6610 | 发表于 2007-06-25 16:23 |
| 银牌会员 发帖 488 积分 1,246 | |
|
C:\TC>tcc -mt bat2com
Turbo C Version 2.0 Copyright (c) 1987, 1988 Borland International bat2com.c: Error bat2com.c 11: Unable to open include file 'stdio.h' Error bat2com.c 12: Unable to open include file 'string.h' Error bat2com.c 82: Undefined symbol 'FILE' in function transfer Error bat2com.c 82: Undefined symbol 'txtfl' in function transfer Warning bat2com.c 82: Code has no effect in function transfer Error bat2com.c 83: Undefined symbol 'NULL' in function transfer Warning bat2com.c 109: Suspicious pointer conversion in function transfer Error bat2com.c 119: Undefined symbol 'FILE' in function writeBAT2COM Error bat2com.c 119: Undefined symbol 'bfl' in function writeBAT2COM Warning bat2com.c 119: Code has no effect in function writeBAT2COM Error bat2com.c 120: Expression syntax in function writeBAT2COM Error bat2com.c 121: Expression syntax in function writeBAT2COM Error bat2com.c 122: Undefined symbol 'drive' in function writeBAT2COM Error bat2com.c 122: Undefined symbol 'dir' in function writeBAT2COM Error bat2com.c 122: Undefined symbol 'name' in function writeBAT2COM Error bat2com.c 122: Undefined symbol 'ext' in function writeBAT2COM Error bat2com.c 124: Undefined symbol 'NULL' in function writeBAT2COM *** 14 errors in Compile *** Available memory 400928 |
|
| 第15楼 duanml | 发表于 2007-06-25 17:21 |
| 中级用户 发帖 112 积分 231 | |
|
编译环境不对,stdio.h都找不到~
|
|
|
[ 联系联盟系统管理团队 -
中国DOS联盟 -
标准版 ] Sponsored by ifanr Inc | © 2001–2023 |