刚刚接到一个任务,编写一个配置程序,要求该配置程序能根据输入的参数生成不同的exe文件。拿到这个任务后感觉有些茫然,不知道该怎么入手,上网搜了搜,并没有找到很好的资料,有人提了一种方法是先生成一个文件,然后根据PE格式向里面填充数据。感觉这种思路需要对PE文件有很深的理解,应该有更简单实用一些的实现方法。在此向高手们请教:这类程序的具体实现思路是怎样的?最好能给出一个初级的源代码实例来参照(比如配置程序可生成弹出对话框的程序,对话框显示的内容由输入参数决定),强求了,呵呵。

解决方案 »

  1.   

    是不是对任务理解错了,会不会是叫你做一个exe,根据不同的参数完成不同的功能?可是根据不同的参数显示不同的界面?
    跟组态软件一样?
      

  2.   

    NSIS中安装程序的生成就是与LZ要求类似的实现
    但并不一定要对EXE文件进行较大的结构调整,可以采用
    copy /B a.exe+b.bin c.exe 形式组合生成最终文件,LZ需要在a.exe文件实现的过程中计算a.exe的大小,
    定位b.bin在c.exe中的位置,使用二进制文件读取方法,获得b.bin的数据并进行操作
      

  3.   

    生成不同EXE恐怕不太可能,就算能借助编译器实现,也只能自己使用
    不可能交给用户的
    楼主应该换个思路,像楼上两位说的,可以考虑用参数来配置程序;
    也可以通过先生成几个满足条件的EXE,在安装包里根据选择不同的安装模式,拷贝相应的EXE程序来实现
      

  4.   

    另外,如果LZ确定你对任务理解没有问题
    你可以考虑通过命令行实现编译
    根据你的需要生成多个批处理文件
    然后根据输入的配置信息调用不同的批处理文件
    生成自己想要的EXE文件
      

  5.   

    (比如配置程序可生成弹出对话框的程序,对话框显示的内容由输入参数决定)定义一个全局变量char msg[256]="hello\0";MessageBox(NULL,msg,"title",MB_OK);生成exe文件后,用UE打开,查找字符串"hello",记住他的位置p。
    假如你要让messagebox弹出来的内容是world,在你的配置程序中打开这个exe,把指针移到p,定义一个字符串char newmsg[256]="world",往里面写入.这时运行这个messagebox弹出来的内容就是world。注意一点就是两个字符串长度一定要相同
      

  6.   

     生成不同的EXE文件有什么意义?
      

  7.   

    根据不同的参数,在源程序文件(.cpp或.h)中,进行填充;
    然后用命令行的方式调用编译器,来生成exe
      

  8.   

    要生成exe文件,必须要知道exe文件的结构,
    或者是自己对pe文件的结构很懂,一般也就能改个资源,改个变量的值,等简单的工作
    如果是以上的情况,可以自己研究下pe格式
    只有编译器能全面的生成目标平台的完整代码,这样你就要直接调用编译程序完成工作
      

  9.   

    虽然我不会,但是相信楼主不会理解错的,生成EXE文件并非没有意义,也并不是只能借助编译器才能做到,灰鸽子的服务器端不就是根据配置文件自己生成的吗?
      

  10.   

    无需动态链接,也无需熟悉PE格式,你可以在PE文件最后添加少许字节来作为它的配置,这部分添加的字节叫做附加数据(overlay), 比如在sample.exe末尾添加"AAAA",程序运行时候用SetFilePointer指向末尾倒数4字节,然后ReadFile把AAAA读到buff中,就能MessageBox显示AAAA了, 如果你把附加数据改成"BBB",那MessageBox内容也会变你只需把sample.exe作为资源放入到你的程序中,用的时候释放出来,然后修改他最后的overlay内容就ok
      

  11.   

    呵呵,我们公司做的好像是把需要选择的功能做成DLL
    然后做成安装程序,根据选择看要不要生成DLL
      

  12.   

    =引用 1 楼 jason_wentzel 的回复:]
    是不是对任务理解错了,会不会是叫你做一个exe,根据不同的参数完成不同的功能?可是根据不同的参数显示不同的界面? 
    跟组态软件一样?
    [/Quote]
      

  13.   

    如果程序的功能完全不同,就应该写成两个程序.如果程序仅要求界面不同,或者很小一部分的次要功能不同,可以考虑使用资源来控件配置.比如在程序中添加一个RC_RAWDATA,然后在其中写入配置,不同的配置可以用beginUpdataResource,updataresource,endupdataresource来写入或修改配置.如果是程序的次要功能要求不同,可以将次要功能写入一个DLL,然后将这个DLL添加到EXE的资源中,需要的时候释放到内存中,再直接从内存中加载这个DLL,实现需要的功能,同样如果要改变DLL,使用上述的改变资源的方法来替换DLL即可改变将要功能.
      

  14.   

    如果LZ确定你对任务理解没有问题 
    你可以考虑通过命令行实现编译 
    根据你的需要生成多个批处理文件 
    然后根据输入的配置信息调用不同的批处理文件 
    生成自己想要的EXE文件
    我是这样想的
      

  15.   

    找到一个资料,lz试一下看看。思路:
    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 ); 
    }  
      

  16.   

    楼主研究一下PYTHON,可以根据配置生成.py脚本,再调用py2exe生成,python是解释性语言,用作配置脚本很合适。
      

  17.   

    把要生成exe,写入另一个exe的pe资源中,或者把另一个exe的 全部assic码,保存在exe中,在另一个exe中,留几个要设置的参数,当做exe的参数
      

  18.   


    上面的回答已经基本给出了答案了
    1. 自己填充pe文件结构这个基本不可能. 简直都不用考虑
    2. 附带编译器这个也不用考虑,想一下,你编译需要多久,附带多少附加文件(头文件,链接库),不能把整个sdk都带过去吧.
    3. 这是终极解决方案:   将程序中有可能生程的exe都自己预先生成好,然后作为二进制资源嵌入主程序,在运行期查找资源,释放资源,写入到文件,使用CreateProcess运行此exe,具体遇到的api无外乎FindResource,LockResource,WriteFile之类. 根本没有什么难度.. 
    如果不想写入到主程序,你甚至可以写到纯资源dll中.无非一堆二进制数据,看这个文章:
    http://www.codeproject.com/KB/files/XResFilePt1.aspx