Windows Delphi自删除程序

Windows Delphi自删除程序,windows,delphi,assembly,Windows,Delphi,Assembly,如何自动删除我的Delphi程序?我尝试了以下代码: procedure DeleteSelf; var module : HMODULE; buf : array [ 0 .. MAX_PATH - 1 ] of char; p : ULONG; hKrnl32 : HMODULE; pExitProcess, pDeleteFile, pFreeLibrary : pointer; begin module := GetModuleHandle ( nil );

如何自动删除我的Delphi程序?我尝试了以下代码:

procedure DeleteSelf;
var
  module : HMODULE;
  buf : array [ 0 .. MAX_PATH - 1 ] of char;
  p : ULONG;
  hKrnl32 : HMODULE;
  pExitProcess, pDeleteFile, pFreeLibrary : pointer;
begin
  module := GetModuleHandle ( nil );
  GetModuleFileName ( module, buf, sizeof ( buf ) );
  CloseHandle ( THandle ( 4 ) );
  p := ULONG ( module ) + 1;
  hKrnl32 := GetModuleHandle ( 'kernel32' );
  pExitProcess := GetProcAddress ( hKrnl32, 'ExitProcess' );
  pDeleteFile := GetProcAddress ( hKrnl32, 'DeleteFileA' );
  pFreeLibrary := GetProcAddress ( hKrnl32, 'FreeLibrary' );
  asm
    lea eax, buf
    push 0
    push 0
    push eax
    push pExitProcess
    push p
    push pDeleteFile
    push pFreeLibrary
    ret
  end;
end;
但它不起作用,请不要删除该文件。我的程序是控制台。
谢谢

您的代码只有在Windows NT和2000下才能工作。因为在这些OSs中,系统保留了一个对内存映射文件的usermode句柄引用,该文件支持磁盘上的可执行映像在这些Windows版本中,此句柄始终具有值0x4

删除自己的exe最有效的方法是在挂起状态下创建子进程,注入代码以等待父进程(要删除的exe),然后检测父进程何时退出,删除父进程,最后杀死子进程

您可以在这些推荐的参考资料中找到有关此主题的更多信息

  • 兰珠。五,

你到底想做什么?离开有什么不对?这看起来像是Win16的回程。我看到这可能的唯一方法是调用另一个程序(或批处理文件),该程序在应用程序退出时执行此操作。对于一个应用程序来说,如果不依赖其他外部帮助程序来删除自己是不可能的。因此,唯一的解决方案是创建一个文件。Bat?不一定,唯一的解决办法是依靠可执行文件之外的东西为您完成任务。操作代码有缺陷。当我正在修改代码时,问题已经解决了。显然,这个问题不是重复的,问题是为什么发布的代码不起作用。