先编写一个程序编译成EXE,使这个EXE文件从自己的最后面读取数据,数据的格式当然得自己定了。然后将你的文档,加在EXE文件的最后面就形成了类似自解压的文件。这个EXE文件就是一个模板。
比如你把两个文件创建成两个自解压的文件exe1,exe2,然后再将这两个文件创建成zip1,zip2格式。你就会发现,exe1-zip1 = exe2-zip2。exe1和exe2前面的数据是一摸一样的。后面的数据分别和zip1、zip2一样。
vchelp.net上面有一个闻以祥编写的“传话精灵”的程序,就是这个原理,有源程序,你可以看看。

解决方案 »

  1.   

    squiffy,哪儿有啊?我没搜到。
      

  2.   

    http://www.vchelp.net/soft/tell_her/ani_builder_src.zip
      

  3.   

    真没劲。就read了一下那个exe文件,然后创建一个txt文件,然后主体程序读取它。
    这骗小孩子还行。
    难道那些自解包也都是这么工作的?!
    我认为,他们是从exe所在的内存段中读取末尾的数据的。所以我想知道“怎么获得自身程序所在内存段的指针?”
      

  4.   

    是CS:IP吗?(有点记不清楚了? ^&^)
      

  5.   

    To diclogic(逻辑侦探):“我认为,他们是从exe所在的内存段中读取末尾的数据的”
    我认为不是这样。象zip自解压文件这些都是把数据文件作为资源存放的。
    可执行文件运行时,资源并不载入内存,否则几百兆的ZIP自解压文件岂不是不能存在了吗?
    当然实现的细节也不是“read了一下那个exe文件,然后创建一个txt文件,然后主体程序读取”那样简单,但原理差不多。
      

  6.   

    to gboy:
    嗯。我现在觉得也有可能是另外读取的。
    不过我觉得你举的反例并没多大说服力,win系统用虚拟内存机制使内存增加至2G,对程序来说,这2G是不分真假的,不少情况下都会出现程序所用到的内存大于实际内存的情况。不过如何编辑一个exe的资源呢?又如何读取自己编辑的资源呢?(也就是说如何设置自己编辑的资源ID)
      

  7.   

    可以看看这个帖子
    http://www.csdn.net/expert/topic/144/144639.shtm
      

  8.   

    我看了。但你没说清楚。怎么通过外部程序给我现在这个做好的exe加资源?
    总不可能每做一个自解包就用vc便一个程序吧?!
      

  9.   

    要"通过外部程序给我现在这个做好的exe加资源"?
    那你不如这样,先编写一个exe程序,它会读取它自己末尾的数据,
    而你的外部程序要作的工作是把数据拷贝到这个exe文件的末尾.
    我以前写过文件切割机,其中的自动合并文件功能就是这样实现的.