可執行檔案即 exe 檔案在執行過程中,由系統管理其開啟的控制代碼。此時對該檔案的一些操作是被系統禁止的,比如刪除操作。然而在某些場合,可能須要程式有自我刪除的功能,也就是程式執行結束後刪除自身。基於這個想法,可以有一種很簡單的方法來實現這個基本功能。
本方法基於兩點來實現刪除功能。一是利用 windows 的 command program 的刪除檔案操作;再者就是啟動新的程序來執行這個刪除操作。下面就仔細說明。
windows 中的 command program 是乙個系統的 shell program. 在 windows95/98/me 中,其檔名為 command.com ,而在 nt/2000/xp 中則是 cmd.exe 。我們可以通過環境變數 comspec 得到其全路徑名。
假定目前我們所使用的是 xp ,在命令列中輸入 :
cmd.exe /?
即得到 command shell 的使用方法;其中 /c 的含義是:執行字串指定的命令然後終斷,這正是我們所須要的。這樣利用 command shell 刪除乙個檔案的命令如下:
cmd.exe /c del mypro.exe
這裡要注意一點,檔名應該是短檔名(檔名不得超過 8 個字元 , 字尾不超過 3 個字元)。如果實際檔案是長檔案句,那麼程式中我們可以用 getshortpathname 這個 api 函式來轉換。
接下來我們要做是如何在一新的程序中成功的執行這一指令。起來乙個新程序的命令主要有 shellexecute 和createprocess 。
先使用 shellexecute 為例。在程式的結束處使用如下語句:
shellexecute(null, "open","cmd.exe", "/c del mypro.exe ", null, sw_hide);
編譯後執行檔案發現執行成功,檔案執行完後被刪除。但是後面做多次實驗後,發現有時檔案執行完後並不會被刪除。通過分析,認為在刪除操作執行時,可執行檔案還未關閉。也就是說只有在執行檔案的程序關閉後,執行刪除操作的程序才能完成操作。這樣就有了乙個問題,系統負責程序和執行緒的排程執行,我們無法人為規定程序或執行緒以某種秩序執行。
對此我的解決辦法是,建立執行刪除操作的程序時設定其為掛起狀態,從而為其的設定乙個低優先順序別,同時提高執行檔案的程序級別,然後才正式起動新程序。這樣基本可以保證兩個程序的先後執行。這樣新的解決方法就是用createprocess以create_suspend標誌來建立新程序,然後用setpriorityclass來設定相應的優先順序,主程序的優先順序是high_priority_class,而執行刪除操作的程序的優先順序是idle_priority_class。經過數百次的測試,刪除操作都是成功的。
下面是乙個封裝了刪除操作的函式,函式內起動乙個程序執行command shell的del命令。在程式最後結束處呼叫它,就可以簡單的實現程式的自刪除功能。
view source
print?
01.
include < windows.h>
02.
#include < shellapi.h>
03.
#include < stdio.h>
04.
05.
int
deletemyexe()
06.
45.
46.
// heigthen priority of the current process
47.
setpriorityclass(getcurrentprocess(), high_priority_class);
48.
49.
// set file attribute to normal
50.
setfileattributes(tc***ename, file_attribute_normal);
51.
52.
// depress priority of command process, then start it
53.
setpriorityclass(pi.hprocess, idle_priority_class);
54.
resumethread(pi.hthread);
55.
return
0;
56.
}
如何簡單實現可執行檔案的自我刪除
可執行檔案即 exe 檔案在執行過程中,由系統管理其開啟的控制代碼。此時對該檔案的一些操作是被系統禁止的,比如刪除操作。然而在某些場合,可能須要程式有自我刪除的功能,也就是程式執行結束後刪除自身。基於這個想法,可以有一種很簡單的方法來實現這個基本功能。本方法基於兩點來實現刪除功能。一是利用 wind...
vs 實現執行可執行檔案
有三個api函式可以執行可執行檔案winexec shellexecute和createprocess。1.createprocess因為使用複雜,比較少用。2.winexec主要執行exe檔案。如 winexec notepad.exe readme.txt sw show 3.shellexec...
android 編寫簡單可執行檔案
使用android sdk 原始碼編譯乙個簡單的adb shell 命令下的可執行檔案 在system core 下建立乙個臨時資料夾tmp,並建立了android.mk 和 test.c local path call my dir include clear vars local module ...