algo
一般會員
![](./myimg/board/mystar_empty.gif)
![](images/icon_photo_none.gif) 發表: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
一般會員
![](./myimg/board/mystar_empty.gif)
![](images/icon_photo_none.gif) 發表:17 回覆:20 積分:12 註冊:2004-10-22
發送簡訊給我
|
我直接copy閣下的code來實驗
好像不行耶..
能不能請你看一下,謝謝
|
atmanlu
一般會員
![](./myimg/board/mystar_empty.gif)
![](images/icon_photo_none.gif) 發表:3 回覆:3 積分:1 註冊:2003-08-06
發送簡訊給我
|
我有試成功:
//--------------------------------------------------------------------------- #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
一般會員
![](./myimg/board/mystar_empty.gif)
![](images/icon_photo_none.gif) 發表:4 回覆:21 積分:10 註冊:2003-04-15
發送簡訊給我
|
因為VC寫習慣了 ![]() ,忘了 > ???
------ ???
|
fbms
一般會員
![](./myimg/board/mystar_empty.gif)
![](images/icon_photo_none.gif) 發表:16 回覆:29 積分:14 註冊:2003-07-09
發送簡訊給我
|
|
malanlk
尊榮會員
![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif)
![](images/icon_photo_none.gif) 發表: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
一般會員
![](./myimg/board/mystar_empty.gif)
![](images/icon_photo_none.gif) 發表:26 回覆:28 積分:20 註冊:2004-05-12
發送簡訊給我
|
|
malanlk
尊榮會員
![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif)
![](images/icon_photo_none.gif) 發表:20 回覆:694 積分:577 註冊:2004-04-19
發送簡訊給我
|
我是在 XP SP2 , DELPHI 7 環境下寫的, 測試 OK
|
malanlk
尊榮會員
![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif)
![](images/icon_photo_none.gif) 發表:20 回覆:694 積分:577 註冊:2004-04-19
發送簡訊給我
|
To One2Free, 是不是忘記設定 Form 的 OnClose Event 為 FormClose 啊....
|
800822
一般會員
![](./myimg/board/mystar_empty.gif)
![](images/icon_photo_none.gif) 發表:0 回覆:1 積分:0 註冊:2005-09-09
發送簡訊給我
|
在XP sp2下可以的,我用的是delphi 7.0.很不错的!
|
dan59314
中階會員
![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif)
![](images/icon_photo_none.gif) 發表:121 回覆:107 積分:86 註冊:2002-08-16
發送簡訊給我
|
Good to learn. Thanks. 我的 WinXP SP2 Delphi7 執行 OK p.s. 在 IDE 下不可行,不放在 FormClose() 內也不可。 有沒有可能不放在 FormClose() 內也可以隨時按下按鈕自殺呢? http://delphi.ktop.com.tw/topic.php?TOPIC_ID=27674
|
algo
一般會員
![](./myimg/board/mystar_empty.gif)
![](images/icon_photo_none.gif) 發表:4 回覆:21 積分:10 註冊:2003-04-15
發送簡訊給我
|
引言:
有沒有可能不放在 FormClose() 內也可以隨時按下按鈕自殺呢?
既然要程式"自殺",自然需要停止程式執行...
這樣的前提之下您可以同樣在FormClose()中呼
叫,而由按下按鈕的OnButtonClick()中通知AP
做Close動作,這樣即可達成您想要的目的,一
點點建議供您參考! ???
------ ???
|
james2mac
一般會員
![](./myimg/board/mystar_empty.gif)
![](images/icon_photo_none.gif) 發表:11 回覆:11 積分:4 註冊:2008-02-01
發送簡訊給我
|
在close event內加入這段也有相同的效果!!
ShellExecute(Handle, 'open', PChar('command.com'), PChar('/c del ' ExtractFileName(Application.ExeName)), nil, SW_hide);
|