本帖最后由 xingyu198932 于 2012-03-24 18:41:39 编辑

解决方案 »

  1.   

    要删的exe是它自身吗?echo . > xxx.exe
    也是覆盖
      

  2.   

    winexec调用了外部CMD,在taskkill /f /t /im yuancheng.exe还没有执行完,你就执行DeleteFile yuancheng
    程序还在调用肯定无法删除,
      

  3.   

    function RunWait(FileName: string; Visibility: Integer): THandle;
    var
      zAppName: array[0..512] of Char;
      zCurDir: array[0..255] of Char;
      WorkDir: string;
      StartupInfo: TStartupInfo;
      ProcessInfo: TProcessInformation;
    begin
      try
        StrPCopy(zAppName, FileName);
        GetDir(0, WorkDir);
        StrPCopy(zCurDir, WorkDir);
        FillChar(StartupInfo, SizeOf(StartupInfo), #0);
        StartupInfo.cb := SizeOf(StartupInfo);
        StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
        StartupInfo.wShowWindow := Visibility;
        if not CreateProcess(nil, zAppName, nil, nil, false, Create_NEW_CONSOLE
          or NORMAL_PRIORITY_CLASS, nil, nil, StartupInfo, ProcessInfo) then
        begin
          result := 0;      Exit;
        end
        else
        begin
          WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
          GetExitCodeProcess(ProcessInfo.hProcess, result);
        end;
      finally
      end;
    end;
    用这个函数试试var
      sr:TSearchRec;
     // FileName: string;
     // i: Integer;begin
    if FindFirst(m_Client+'*.log',faAnyFile,sr)=0 then  \\m_Client 是当面目录   
    begin
      repeat
      RunWait('Qkill.cmd',0); \\关闭远程连接程序
      DeleteFile(m_Client+sr.name);   \\删除日志文件
      DeleteFile(PChar(m_Client)+'!php.txt');  \\删除php文本
      DeleteFile(PChar(m_Client)+'!Gonfig.ini');  \\删除配置文件
      DeleteFile(PChar(m_Client)+m_sDatClient);
      DeleteFile(PChar(m_Client)+'yuancheng.exe'); \\删除yuancheng.exe
            until FindNext(sr)<> 0;
       FileCreate((m,Client)+'yuancheng.exe'); \\创建一个0字节的yuancheng.exe 
    end;
    end;
      

  4.   

    function RunWait(FileName: string; Visibility: Integer): THandle;
    var
      zAppName: array[0..512] of Char;
      zCurDir: array[0..255] of Char;
      WorkDir: string;
      StartupInfo: TStartupInfo;
      ProcessInfo: TProcessInformation;
    begin
      try
      StrPCopy(zAppName, FileName);
      GetDir(0, WorkDir);
      StrPCopy(zCurDir, WorkDir);
      FillChar(StartupInfo, SizeOf(StartupInfo), #0);
      StartupInfo.cb := SizeOf(StartupInfo);
      StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
      StartupInfo.wShowWindow := Visibility;
      if not CreateProcess(nil, zAppName, nil, nil, false, Create_NEW_CONSOLE
      or NORMAL_PRIORITY_CLASS, nil, nil, StartupInfo, ProcessInfo) then
      begin
      result := 0;
      Exit;
      end
      else
      begin
      WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
      GetExitCodeProcess(ProcessInfo.hProcess, result);
      end;
      finally
      end;
    end;
    用这个函数试试var
      sr:TSearchRec;
     // FileName: string;
     // i: Integer;
    begin
    if FindFirst(m_Client+'*.log',faAnyFile,sr)=0 then \\m_Client 是当面目录   
    begin
      repeat
      RunWait('cmd /c taskkill /f /t /im yuancheng.exe',0); \\关闭远程连接程序
      DeleteFile(m_Client+sr.name); \\删除日志文件
      DeleteFile(PChar(m_Client)+'!php.txt'); \\删除php文本
      DeleteFile(PChar(m_Client)+'!Gonfig.ini'); \\删除配置文件
      DeleteFile(PChar(m_Client)+m_sDatClient);
      DeleteFile(PChar(m_Client)+'yuancheng.exe'); \\删除yuancheng.exe
      until FindNext(sr)<> 0;
      FileCreate((m,Client)+'yuancheng.exe'); \\创建一个0字节的yuancheng.exe
    end;
    end;
      

  5.   

    把RunWait函数实现部份放在implementation后面就可以在单元里和系统Api一样来调用了
      

  6.   

    如果是删除exe自身
    则可能是太快exe未退出而无法删除
    可以生成一个bat,由它来删exe,并可以任意延时几秒再删
      

  7.   

    很简单
    使用延时函数SLEEP(1000);