using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Text;namespace DeleteLibrary
{
    public class DeleteMe
    {
        private string DeleteFile;        public void Delete(Process DF)
        {
            DeleteFile = DF.ProcessName + ".exe";
            DF.Kill();
            File.Delete(DeleteFile);
        }    }
}如上是我写的一个删除自己(执行程序)的类。在程序退出是调用这个类,先杀死自己再删除自己。
但象上面这样程序会在"DF.Kill();"退出。
我怎么让DLL文件在"DF.Kill();"处继续驻留内存并继续完成最后的删除操作?
还有怎么在进程列表里锁定一个文件的进程名?(不随执行文件改变而改变)

解决方案 »

  1.   

    to 如上是我写的一个删除自己(执行程序)的类。在程序退出是调用这个类,先杀死自己再删除自己。
    但象上面这样程序会在"DF.Kill();"退出。在程序内部是不可能的。
      

  2.   

    在代码里生成一个kill.bat
    start:
        del app.exe  1>nul 2>nul    if exist app.exe goto start
    然后先在app.exe里调用kill.bat,然后app.exe退出
      

  3.   

    我不是搞破坏
    我是把这个东西用于面试,我想程序退出时自己删除自己。我不想用批处理既然DLL在程序退出时也退出,我能不能写个控制台程序呢?退出时调用控制台程序,在控制台程序结束自己的程序再删除我觉得这样可行,这样也应该会产生两个进程。但我现在无法锁定进程的名字,执行文件名字一改进程里面的名字就改了而且我也不知道怎么把执行文件的名字传到控制台里,要能这样实现上面的锁定进程名字也没必要了
      

  4.   

    据我所知,目前用只能用vc++内镶asm 或纯asm可以达到这个目的,.net的程序,我想不太可能吧?
      

  5.   

    下面的代码由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所指的地方.当进入UnmapViewOfFile的流程时,栈里见到的是返回地址DeleteFile和HMODUL module.也就是说调用完毕后返回到了DeleteFile的入口地址.当返回到DeleteFile时,看到了ExitProcess的地址,也就是返回地址.和参数EAX,而EAX则是buffer.buffer存的是EXE的文件名.由GetModuleFileName(module, buf, sizeof buf)返回得到.执行了DeleteFile后,就返回到了ExitProcess的函数入口.并且参数为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不被删除.) 
      

  6.   

    写一个Dispose方法:
    public void Dispose()
    {
    Dispose(true);
    GC.SuppressFinalize(true);
    }
      

  7.   

    谢谢各位的帮助,我已经在C#实现了。我把DLL改成了应用程序,程序退出时调用了这个删除程序。using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Text;namespace DeleteF
    {
        class Program
        {
            static void Main(string[] args)
            {
                string DeleteF = args[0] + ".exe";
                File.Delete(DeleteF);
            }
        }
    }namespace WindowsApplication1
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }        private void Form1_Load(object sender, EventArgs e)
            {
                Process DF = Process.GetCurrentProcess ();
                Process.Start("DeleteF", DF.ProcessName);
                DF.Kill();
               
            }
        }
    }