讓程式可以"自殺"的函式 |
|
algo
一般會員 發表:4 回覆:21 積分:10 註冊:2003-04-15 發送簡訊給我 |
因為看到國外論壇有人提到利用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 發送簡訊給我 |
|
atmanlu
一般會員 發表:3 回覆:3 積分:1 註冊:2003-08-06 發送簡訊給我 |
我有試成功:
//--------------------------------------------------------------------------- #define NO_WIN32_LEAN_AND_MEAN //必需放在#include 之前 #include |
algo
一般會員 發表:4 回覆:21 積分:10 註冊:2003-04-15 發送簡訊給我 |
|
fbms
一般會員 發表:16 回覆:29 積分:14 註冊:2003-07-09 發送簡訊給我 |
|
malanlk
尊榮會員 發表:20 回覆:694 積分:577 註冊:2004-04-19 發送簡訊給我 |
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 發送簡訊給我 |
|
malanlk
尊榮會員 發表:20 回覆:694 積分:577 註冊:2004-04-19 發送簡訊給我 |
|
malanlk
尊榮會員 發表:20 回覆:694 積分:577 註冊:2004-04-19 發送簡訊給我 |
|
800822
一般會員 發表:0 回覆:1 積分:0 註冊:2005-09-09 發送簡訊給我 |
|
dan59314
中階會員 發表:121 回覆:107 積分:86 註冊:2002-08-16 發送簡訊給我 |
|
algo
一般會員 發表:4 回覆:21 積分:10 註冊:2003-04-15 發送簡訊給我 |
|
james2mac
一般會員 發表:11 回覆:11 積分:4 註冊:2008-02-01 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |