编写一个程序,要求运行该程序,通过一个事件,从事先设定好的某处拷贝一个同名文件覆盖自己,覆盖后再自动运行该程序。类别进行应用程序更新

解决方案 »

  1.   

    一个a.exe是不可能自己从其他地方拷贝一个文件来覆盖自己的,覆盖工作只能由另一个程序来完成。假设另一个程序是B.exe。那么在a.exe中:Application.Terminate;
    WinExec(PChar('路径\B.exe', SW_SHOW);接下来B.exe就可以拷贝文件覆盖A.exe了。在A.exe拷贝覆盖完毕后再:
    WinExec(PChar('路径\A.exe', SW_SHOW);
    B.exe从何处拷贝文件,复制到何处,这两个信息必须实现由A.exe保存到某个地方(如一个文件或者注册表),然后由B.exe去读取。—————————————————————————————————
    宠辱不惊,看庭前花开花落,去留无意;毁誉由人,望天上云卷云舒,聚散任风。
    —————————————————————————————————
      

  2.   

    建议把更新部份做成exe,其他重要功能做成Dll,动态调用,更新时更新Dll就行了,我们的程序都是这样做的
      

  3.   

    严黎斌() ( ) :
    这不是为了干坏事,大型多人使用的项目必须有自动更新能力。这是减少后期维护工作的最重要的保证。做成dll仍然有更新主程序的问题。总是“覆盖自己”是逃避不了的。—————————————————————————————————
    宠辱不惊,看庭前花开花落,去留无意;毁誉由人,望天上云卷云舒,聚散任风。
    —————————————————————————————————
      

  4.   

    lxpbuaa(桂枝香在故国晚秋)说的对
      

  5.   

    lxpbuaa(桂枝香在故国晚秋) 
    你说的方法我已经用上了,当有新版本的时候,会提示用户更新,同时把主程序关掉,把更新程序运行,进行更新后再把更新程序关了,把主程序运行起来
      

  6.   

    我有个办法,不知大家的意见,LOOK:http://218.56.11.178:8020/web/technology.aspx-》下载基地-》例程-经典应用-》自杀程序做写小改动,将批处理的内容换一下就OK了。
      

  7.   

    自己覆盖自己其实并不是没有办法,自己还可以删除自己呢,呵呵。
    只要思路对了应该不难完成。
    windows是可以创建线程的,我们如何利用这一点呢,写好一个函数他是负责拷贝的,
    我们把这个函数放在一个线程里面,然后再发挥一下,把这个线程注入到explorer进程里面
    关闭应用程序后,他还是在运行的。
      

  8.   

    小弟用Delphi没多久,只会用来写MIS系统,高级的都不会,有没有哪位大侠能提供一下源码,感激不尽
      

  9.   

    能不能用自杀的方法,写一个BAT,COPY过来,运行
      

  10.   

    大家还是来看看高手的作品吧(转贴)
    下面的代码由Gary Nebbett写就.Gary Nebbett乃是WINDOWS NT/2000 NATIVE API 
    REFERENCE的作者.乃NT系统一等一的高手.下面就分析一些他的这段代码. 
    这段代码在PROCESS没有结束前就将启动PROCESS的EXE文件删除了. 
    int main(int argc, char *argv[]) 

    HMODULE module = GetModuleHandle(0); 
    CHAR buf[MAX_PATH]; 
    GetModuleFileName(module, buf, sizeof buf); 
    CloseHandle(HANDLE(4)); 
    __asm { 
    lea eax, buf 
    push 0 
    push 0 
    push eax 
    push ExitProcess 
    push module 
    push DeleteFile 
    push UnmapViewOfFile 
    ret 

    return 0; 

    现在,我们先看一下堆栈中的东西 
      
    偏移 内容 
    24 0 
    20 0 
    16 offset buf 
    12 address of ExitProcess 
    8 module 
    4 address of DeleteFile 
    0 address of UnmapViewOfFile 
      
    调用RET返回到了UnmapViewOfFile,也就是栈里的偏移0所指的地方.当进入UnmapViewOfF 
    ile的流程时,栈里见到的是返回地址DeleteFile和HMODUL module.也就是说调用完毕后 
    返回到了DeleteFile的入口地址.当返回到DeleteFile时,看到了ExitProcess的地址,也 
    就是返回地址.和参数EAX,而EAX则是buffer.buffer存的是EXE的文件名.由GetModuleFil 
    eName(module, buf, sizeof buf)返回得到.执行了DeleteFile后,就返回到了ExitProce 
    ss的函数入口.并且参数为0而返回地址也是0.0是个非法地址.如果返回到地址0则会出错 
    .而调用ExitProcess则应该不会返回. 
      
    /* 下面的解释非常重要 */ 
    这段代码的精妙之处在于: 
    1.如果有文件的HANDLE打开,文件删除就会失败,所以,CloseHandle(HANDLE(4));是十分 
    巧妙的一手.HANDLE4是OS的硬编码,对应于EXE的IMAGE.在缺省情况下,OS假定没有任何调 
    用会关闭IMAGE SECTION的HANDLE,而现在,该HANDLE被关闭了.删除文件就解除了文件对 
    应的一个句柄. 
    2.由于UnmapViewOfFile解除了另外一个对应IMAGE的HANDLE,而且解除了IMAGE在内存的 
    映射.所以,后面的任何代码都不可以引用IMAGE映射地址内的任何代码.否则就OS会报错. 
    而现在的代码在UnmapViewOfFile后则刚好没有引用到任何IMAGE内的代码. 
    3.在ExitProcess之前,EXE文件就被删除了.也就是说,进程尚在,而主线程所在的EXE文件 
    已经没了.(WINNT/9X都保护这些被映射到内存的WIN32 IMAGE不被删除.) 
      
    一开始,不明白这段话:当返回到DeleteFile时,看到了ExitProcess的地址 
    后来想起WinAPI的call convention是__stdcall,特点是参数从右向左入栈, 
    而且由callee维护stack frame, 感觉是C和Pascal的混血儿,这样就迎刃而解了. 
    这段代码在C编译器的眼皮底下构造如此巧妙的调用序列 
    再次崇拜一把Gary Nebbett