现象1:有的可执行文件运行时,可以手动删除/重命名,但是无法覆盖该可执行文件。例如vc向导生成的MFC对话框程序;
现象2:有的可执行文件运行时,不可以手动删除/重命名/覆盖该可执行文件,会提示文件正在被使用。例如微软的msnmsgr.exe;按道理可执行文件运行时,该文件的部分被映射到内存么,那么该文件应该还被OS占用。现象2才合理,可是怎么解释现象1呢??

解决方案 »

  1.   

    当然有这种现象啊,文本就是如此,因为系统已经把内容已经读到内存中了。就是说平时我们看到运行中的TXT,运行的是Notepad.exe,只不过读取了TXT中的内容。在打开的时候初始化就是读取TXT内容。读完就不锁定TXT了
      

  2.   

    当你播放一部>4GB的日本爱情动作片的时候,你的内存能完整的加载它么?如果在放的时候被删除了,那?
    可执行文件也差不多.有些可能没有被加载.
      

  3.   

    没见过运行中的exe或com可执行程序还能被删除,程序退出时删除自己这倒是可以实现,除非Microsoft修改操作系统内核,改写可执行文件的加载运行机制
      

  4.   

    现象1大概是EXE文件中有回调函数接收用户的消息,当接收到关闭的消息时,exe文件调用自身的消息处理函数关闭程序
      

  5.   

    现象1 很好重现的呀,大家用vc6建个简单的mfc 对话框程序,就有现象1了。
      

  6.   


    这个文本可以理解啊,Notepad.exe读完就不锁定TXT。可是我想问的是可执行文件自己。对于现象1来说,难道os一次把它映射完了就不锁定了? 如果不锁定了,那怎么不能用同名的文件覆盖呢?
      

  7.   

    运行中,你能把它删除?强,
    除非程序中HOOK删除动作,然后程序自杀(退出时自己删除自己)
      

  8.   


    Notepad.exe读入文件 和 OS的PELoader加载PE的机制不一样
    Notepad.exe是一次性将文件读入内存的,
    PE加载是通过内存映射
      

  9.   


    的确不能删除,能剪贴到其它目录。我还以为也可以删除呢。。晕。 更正现象1如下。现象1:有的可执行文件运行时,可以手动移动/重命名,但是无法覆盖该可执行文件。例如vc向导生成的MFC对话框程序;
      

  10.   

    程序运行时,它所有的路径,是不能修改的,不能删除也不能覆盖,只能对exe改名,或把exe拷到另一目录,是拷贝,不是剪贴
      

  11.   

    一般pe文件加载是通过mapsection(这个函数使用了MapVeiwOfFile)来将磁盘文件映射到内存中的,所以此时的pe与磁盘上pe文件是关联的,但不与这个文件所在目录的目录文件关联,这样,文件名可以修改,但文件内容不可修改。实际上,在PE的File Characteristics里面设置IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP/IMAGE_FILE_NET_RUN_FROM_SWAP标志,即可告诉pe加载器一次将PE加载进内存,并断开与磁盘文件的链接。
    此标记在VS2005/2008的link选项里面,仔细找"swap from net"这个选项。