全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:6130
推到 Plurk!
推到 Facebook!

讓程式可以"自殺"的函式

 
algo
一般會員


發表:4
回覆:21
積分:10
註冊:2003-04-15

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-08-26 19:25:30 IP:59.120.xxx.xxx 未訂閱
因為看到國外論壇有人提到利用Windows console下的 指令來做事,所以想到是否可以利用將檔案送到null 這個"垃圾桶"來達成程式自殺的目的... 很高興測試結果是Ok,測試過Win2K/XP/2K3平台,在 這邊提供給各位參考 class="code"> void Suicide() { SHELLEXECUTEINFO SEI; TCHAR selfFilePath[MAX_PATH], //File Path of this program szComspec[MAX_PATH], //Environment variable in OS szParams[MAX_PATH]; //Paramter string of ShellExecuteEx() // get self file path. if((::GetModuleFileName(NULL, selfFilePath, MAX_PATH) != 0) && (::GetShortPathName(selfFilePath, selfFilePath, MAX_PATH) != 0) && (::GetEnvironmentVariable(_TEXT("COMSPEC"), szComspec, MAX_PATH) != 0)) { // set command shell parameters lstrcpy(szParams, _TEXT("/c del ")); lstrcat(szParams, selfFilePath); lstrcat(szParams, _TEXT(" > nul")); // set struct members SEI.cbSize = sizeof(SEI); SEI.hwnd = 0; SEI.lpVerb = _TEXT("Open"); SEI.lpFile = szComspec; SEI.lpParameters = szParams; SEI.lpDirectory = 0; SEI.nShow = SW_HIDE; SEI.fMask = SEE_MASK_NOCLOSEPROCESS; // increase resource allocation to program ::SetPriorityClass(::GetCurrentProcess(), REALTIME_PRIORITY_CLASS); ::SetThreadPriority(::GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL); // invoke command shell if(::ShellExecuteEx(&SEI)) { // suppress command shell process until program exits ::SetPriorityClass(SEI.hProcess, IDLE_PRIORITY_CLASS); ::SetProcessPriorityBoost(SEI.hProcess,TRUE); // notify explorer shell of deletion ::SHChangeNotify(SHCNE_DELETE,SHCNF_PATH, selfFilePath, 0); } else {// if error, normalize allocation ::SetPriorityClass(GetCurrentProcess(), NORMAL_PRIORITY_CLASS); ::SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_NORMAL); } } ???
------
???
raistlinmiao
一般會員


發表:17
回覆:20
積分:12
註冊:2004-10-22

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-08-26 20:43:53 IP:163.28.xxx.xxx 未訂閱
我直接copy閣下的code來實驗 好像不行耶.. 能不能請你看一下,謝謝
atmanlu
一般會員


發表:3
回覆:3
積分:1
註冊:2003-08-06

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-08-28 11:31:38 IP:219.84.xxx.xxx 未訂閱
我有試成功: 
 
//---------------------------------------------------------------------------    #define NO_WIN32_LEAN_AND_MEAN //必需放在#include 之前
#include     #include 
#pragma hdrstop    #include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;    BOOL SelfDelete()
{
  SHELLEXECUTEINFO sei;      TCHAR szModule [MAX_PATH],
        szComspec[MAX_PATH],
        szParams [MAX_PATH];      ZeroMemory( szModule,  sizeof(TCHAR)*MAX_PATH );
  ZeroMemory( szComspec, sizeof(TCHAR)*MAX_PATH );
  ZeroMemory( szParams,  sizeof(TCHAR)*MAX_PATH );      // get file path names:      if((GetModuleFileName(0,szModule,MAX_PATH)!=0) &&
     (GetShortPathName(szModule,szModule,MAX_PATH)!=0) &&
     (GetEnvironmentVariable("COMSPEC",szComspec,MAX_PATH)!=0))
  {
    // set command shell parameters
    lstrcpy(szParams,"/c del ");
   // lstrcpy(szParams,"dir ");
    lstrcat(szParams, szModule);
  //  lstrcat(szParams, " > nul");        // set struct members
    sei.cbSize       = sizeof(sei);
    sei.hwnd         = 0;
    sei.lpVerb       = "Open";
    sei.lpFile       = szComspec;
    sei.lpParameters = szParams;
    sei.lpDirectory  = 0;
    sei.nShow        = SW_HIDE;
    sei.fMask        = SEE_MASK_NOCLOSEPROCESS;        // invoke command shell        if(ShellExecuteEx(&sei))
    {
      // suppress command shell process until program exits
      SetPriorityClass(sei.hProcess,HIGH_PRIORITY_CLASS);//IDLE_PRIORITY_CLASS);          SetPriorityClass( GetCurrentProcess(),
                        REALTIME_PRIORITY_CLASS);          SetThreadPriority( GetCurrentThread(),
                         THREAD_PRIORITY_TIME_CRITICAL);          // notify explorer shell of deletion          SHChangeNotify(SHCNE_DELETE,SHCNF_PATH,szModule,0);          return TRUE;
    }
  }
  return FALSE;
}    //---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
  : TForm(Owner)
{
  
}
//---------------------------------------------------------------------------    void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
  if(!SelfDelete())
  {
  }
}
//---------------------------------------------------------------------------    
algo
一般會員


發表:4
回覆:21
積分:10
註冊:2003-04-15

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-08-29 15:41:24 IP:59.120.xxx.xxx 未訂閱
因為VC寫習慣了,忘了 > ???
------
???
fbms
一般會員


發表:16
回覆:29
積分:14
註冊:2003-07-09

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-08-30 09:42:55 IP:219.133.xxx.xxx 未訂閱
好极了
malanlk
尊榮會員


發表:20
回覆:694
積分:577
註冊:2004-04-19

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-08-30 13:08:27 IP:203.69.xxx.xxx 未訂閱
Delphi 版本    
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ShellAPI, ShlObj;    type
  TForm1 = class(TForm)
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
  public
    { Public declarations }
  end;    var
  Form1: TForm1;    implementation    {$R *.dfm}    function Suicide: Boolean;
var
  sei: TSHELLEXECUTEINFO;
  szModule:  PChar;
  szComspec: PChar;
  szParams:  PChar;
begin
  szModule  := AllocMem(MAX_PATH);
  szComspec := AllocMem(MAX_PATH);
  szParams  := AllocMem(MAX_PATH);      // get file path names:
  if ((GetModuleFileName(0,szModule,MAX_PATH)<>0) and
     (GetShortPathName(szModule,szModule,MAX_PATH)<>0) and
     (GetEnvironmentVariable('COMSPEC',szComspec,MAX_PATH)<>0)) then
  begin
    // set command shell parameters
    lstrcpy(szParams,'/c del ');
    lstrcat(szParams, szModule);        // set struct members
    sei.cbSize       := sizeof(sei);
    sei.Wnd          := 0;
    sei.lpVerb       := 'Open';
    sei.lpFile       := szComspec;
    sei.lpParameters := szParams;
    sei.lpDirectory  := 0;
    sei.nShow        := SW_HIDE;
    sei.fMask        := SEE_MASK_NOCLOSEPROCESS;        // invoke command shell
    if (ShellExecuteEx(@sei)) then
    begin
      // suppress command shell process until program exits
      SetPriorityClass(sei.hProcess,HIGH_PRIORITY_CLASS);//IDLE_PRIORITY_CLASS);          SetPriorityClass( GetCurrentProcess(),
                        REALTIME_PRIORITY_CLASS);          SetThreadPriority( GetCurrentThread(),
                         THREAD_PRIORITY_TIME_CRITICAL);          // notify explorer shell of deletion
      SHChangeNotify(SHCNE_DELETE,SHCNF_PATH,szModule,nil);          Result := True;
    end
    else
      Result := False;
  end
  else
    Result := False;
end;    procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Suicide;
end;
發表人 - malanlk 於 2005/08/30 13:11:39
One2Free
一般會員


發表:26
回覆:28
積分:20
註冊:2004-05-12

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-09-01 14:51:17 IP:61.143.xxx.xxx 未訂閱
XP 下, Delphi 版无效!
malanlk
尊榮會員


發表:20
回覆:694
積分:577
註冊:2004-04-19

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-09-01 21:56:05 IP:61.219.xxx.xxx 未訂閱
我是在 XP SP2 , DELPHI 7 環境下寫的, 測試 OK
malanlk
尊榮會員


發表:20
回覆:694
積分:577
註冊:2004-04-19

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-09-02 09:33:52 IP:203.69.xxx.xxx 未訂閱
To One2Free, 是不是忘記設定 Form 的 OnClose Event 為 FormClose 啊....
800822
一般會員


發表:0
回覆:1
積分:0
註冊:2005-09-09

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-09-10 10:15:29 IP:60.16.xxx.xxx 未訂閱
在XP sp2下可以的,我用的是delphi 7.0.很不错的!
dan59314
中階會員


發表:121
回覆:107
積分:86
註冊:2002-08-16

發送簡訊給我
#11 引用回覆 回覆 發表時間:2005-10-05 08:52:14 IP:220.130.xxx.xxx 未訂閱
Good to learn. Thanks. 我的 WinXP SP2 Delphi7 執行 OK p.s. 在 IDE 下不可行,不放在 FormClose() 內也不可。 有沒有可能不放在 FormClose() 內也可以隨時按下按鈕自殺呢? http://delphi.ktop.com.tw/topic.php?TOPIC_ID=27674
algo
一般會員


發表:4
回覆:21
積分:10
註冊:2003-04-15

發送簡訊給我
#12 引用回覆 回覆 發表時間:2005-10-08 22:44:48 IP:61.59.xxx.xxx 未訂閱
引言: 有沒有可能不放在 FormClose() 內也可以隨時按下按鈕自殺呢?
既然要程式"自殺",自然需要停止程式執行... 這樣的前提之下您可以同樣在FormClose()中呼 叫,而由按下按鈕的OnButtonClick()中通知AP 做Close動作,這樣即可達成您想要的目的,一 點點建議供您參考! ???
------
???
james2mac
一般會員


發表:11
回覆:11
積分:4
註冊:2008-02-01

發送簡訊給我
#13 引用回覆 回覆 發表時間:2009-10-08 16:54:36 IP:218.210.xxx.xxx 未訂閱
在close event內加入這段也有相同的效果!!

ShellExecute(Handle, 'open', PChar('command.com'), PChar('/c del ' ExtractFileName(Application.ExeName)), nil, SW_hide);
系統時間:2024-05-15 13:48:38
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!