刚刚接到一个任务,编写一个配置程序,要求该配置程序能根据输入的参数生成不同的exe文件。拿到这个任务后感觉有些茫然,不知道该怎么入手,上网搜了搜,并没有找到很好的资料,有人提了一种方法是先生成一个文件,然后根据PE格式向里面填充数据。感觉这种思路需要对PE文件有很深的理解,应该有更简单实用一些的实现方法。在此向高手们请教:这类程序的具体实现思路是怎样的?最好能给出一个初级的源代码实例来参照(比如配置程序可生成弹出对话框的程序,对话框显示的内容由输入参数决定),强求了,呵呵。
解决方案 »
- 用SCSI命令向U盘发INQUIRY指令,遇到的问题(Access is denied. ERROR_ACCESS_DENIED )
- 我该怎么办!
- 使用ADO Command的Execute方法返回的Recordset对象有问题
- CString转CTime (碰到新问题)
- 请教:这是我在调试后出现的提示,具体是什么意思?
- 基于c++ corba高级编程 哪里有下载
- 串口问题~小弟接受不到完整发下来得字节数~~~
- 问大家个简单问题: 怎么知道多播组有成员加入和退出? 不难吧
- vista怎么用api修改系统默认的音效装置
- 关于VirtualFree的疑问
- 我在做视频播放,遇到问题请指教!!
- JPEG转换为BMP图象序列处理求助
跟组态软件一样?
但并不一定要对EXE文件进行较大的结构调整,可以采用
copy /B a.exe+b.bin c.exe 形式组合生成最终文件,LZ需要在a.exe文件实现的过程中计算a.exe的大小,
定位b.bin在c.exe中的位置,使用二进制文件读取方法,获得b.bin的数据并进行操作
不可能交给用户的
楼主应该换个思路,像楼上两位说的,可以考虑用参数来配置程序;
也可以通过先生成几个满足条件的EXE,在安装包里根据选择不同的安装模式,拷贝相应的EXE程序来实现
你可以考虑通过命令行实现编译
根据你的需要生成多个批处理文件
然后根据输入的配置信息调用不同的批处理文件
生成自己想要的EXE文件
假如你要让messagebox弹出来的内容是world,在你的配置程序中打开这个exe,把指针移到p,定义一个字符串char newmsg[256]="world",往里面写入.这时运行这个messagebox弹出来的内容就是world。注意一点就是两个字符串长度一定要相同
然后用命令行的方式调用编译器,来生成exe
或者是自己对pe文件的结构很懂,一般也就能改个资源,改个变量的值,等简单的工作
如果是以上的情况,可以自己研究下pe格式
只有编译器能全面的生成目标平台的完整代码,这样你就要直接调用编译程序完成工作
然后做成安装程序,根据选择看要不要生成DLL
是不是对任务理解错了,会不会是叫你做一个exe,根据不同的参数完成不同的功能?可是根据不同的参数显示不同的界面?
跟组态软件一样?
[/Quote]
你可以考虑通过命令行实现编译
根据你的需要生成多个批处理文件
然后根据输入的配置信息调用不同的批处理文件
生成自己想要的EXE文件
我是这样想的
1、将要释放的exe加到资源里。
2、根据参数load不同的资源然后释放。详见代码。void GenerateExe()
{
HRSRC hResInfo = NULL;
HGLOBAL hResData = NULL;
DWORD dwSize = 0, dwWritten = 0;
HANDLE hFile = NULL; // 查找所需的资源
hResInfo = FindResource( NULL, MAKEINTRESOURCE(IDR_TEST1), "Test" );
if ( hResInfo == NULL )
return ; // 获得资源尺寸
dwSize = SizeofResource( NULL, hResInfo ); // 装载资源
hResData = LoadResource( NULL, hResInfo );
if ( hResData == NULL )
return ; // 写文件
hFile = CreateFile( "E:\\YourExe.exe", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL );
if ( hFile == NULL )
return ; WriteFile( hFile, (LPCVOID)LockResource( hResData ), dwSize, &dwWritten, NULL );
CloseHandle( hFile );
}
上面的回答已经基本给出了答案了
1. 自己填充pe文件结构这个基本不可能. 简直都不用考虑
2. 附带编译器这个也不用考虑,想一下,你编译需要多久,附带多少附加文件(头文件,链接库),不能把整个sdk都带过去吧.
3. 这是终极解决方案: 将程序中有可能生程的exe都自己预先生成好,然后作为二进制资源嵌入主程序,在运行期查找资源,释放资源,写入到文件,使用CreateProcess运行此exe,具体遇到的api无外乎FindResource,LockResource,WriteFile之类. 根本没有什么难度..
如果不想写入到主程序,你甚至可以写到纯资源dll中.无非一堆二进制数据,看这个文章:
http://www.codeproject.com/KB/files/XResFilePt1.aspx