cmd.exe
/c
del
filename--------------------------------------------------------------------------------代码示例:C语言形式#include
#include
#include
BOOL
SelfDel(){SHELLEXECUTEINFO
seiTCHAR
szModule
[MAX_PATH],szComspec[MAX_PATH],szParams
[MAX_PATH]//
获得自身文件名.
获取cmd的全路径文件名if((GetModuleFileName(0,szModule,MAX_PATH)!=0)
&&(GetShortPathName(szModule,szModule,MAX_PATH)!=0)
&&(GetEnvironmentVariable("乎正COMSPEC",szComspec,MAX_PATH)!=0)){//
设置命令参数.lstrcpy(szParams,"/c
del
")lstrcat(szParams,
szModule)lstrcat(szParams,
"
>
nul")//
设置结构成员.sei.cbSize
=
sizeof(sei)sei.hwnd
=
0sei.lpVerb
=
"Open"sei.lpFile
=
szComspecsei.lpParameters
=
szParamssei.lpDirectory
=
0
sei.nShow
=
SW_HIDEsei.fMask
=
SEE_MASK_NOCLOSEPROCESS//
创建cmd进程.if(ShellExecuteEx(&sei)){//
设置cmd进程的执行级别为空闲执行,使本程序有足够的时间从内存中退出.SetPriorityClass(sei.hProcess,IDLE_PRIORITY_CLASS)//
将自身进程的优先级置高SetPriorityClass(GetCurrentProcess(),REALTIME_PRIORITY_CLASS)SetThreadPriority(GetCurrentThread(),THREAD_PRIORITY_TIME_CRITICAL)//
通知Windows资源浏览器,本程序文件已经被删除.SHChangeNotify(SHCNE_DELETE,SHCNF_PATH,szModule,0)return
TRUE}}return
FALSE}---------------------------------------------------------------------------------代码示例:汇编形式雀则.386.model
flat,stdcalloption
casemap:noneinclude
windows.incinclude
kernel32.incincludelib
kernel32.libinclude
urlmon.incincludelib
urlmon.libinclude
shell32.incincludelib
shell32.lib.data?szModule
db
MAX_PATH
dup
(?)sComspec
db
MAX_PATH
dup
(?)
自删除szParams
db
MAX_PATH
dup
(?)hCurProcess
dd
?hCurThread
dd
?.datasei
SHELLEXECUTEINFO
<0>.constszComspec
db
COMSPEC,0Verb1
db
open,0szCom1
db
/c
del
,0szCom2
db
>
nul,0.codestart:invoke
GetModuleFileName,0,addr
szModule,MAX_PATHinvoke
GetEnvironmentVariable,addr
szComspec,addr
sComspec,MAX_PATHinvoke
lstrcpy,addr
szParams,addr
szCom1invoke
lstrcat,addr
szParams,addr
szModuleinvoke
lstrcat,addr
szParams,addr
szCom2mov
sei.cbSize,sizeof
sei
1mov
sei.hwnd,0
2mov
sei.lpVerb,offset
Verb1
3lea
eax,szParamsmov
sei.lpParameters,eax
4lea
eax,sComspecmov
sei.lpFile,eax
5mov
sei.lpDirectory,0mov
sei.nShow,SW_HIDEmov
sei.fMask,SEE_MASK_NOCLOSEPROCESSinvoke
ShellExecuteEx,
addr
sei.if
eaxinvoke
SetPriorityClass,sei.hProcess,IDLE_PRIORITY_CLASSinvoke
GetCurrentProcessmov
hCurProcess,eaxinvoke
SetPriorityClass,hCurProcess,REALTIME_PRIORITY_CLASSinvoke
GetCurrentThreadmov
hCurThread,eaxinvoke
SetThreadPriority,hCurThread,THREAD_PRIORITY_TIME_CRITICALinvoke
SHChangeNotify,SHCNE_DELETE,SHCNF_PATH,addr
szModule,0&n
BOOL SelfDel(){
SHELLEXECUTEINFO sei
TCHAR szModule [MAX_PATH],szComspec[MAX_PATH],szParams [MAX_PATH]
// 获得自身文件名. 获取cmd的全路径文件名
if((GetModuleFileName(0,szModule,MAX_PATH)!=0) &&
(GetShortPathName(szModule,szModule,MAX_PATH)!=0) &&
(GetEnvironmentVariable("COMSPEC",szComspec,MAX_PATH)!=0))
{
// 设置命令参数.
lstrcpy(szParams,"/c del ")
lstrcat(szParams, szModule)
lstrcat(szParams, " > nul")
// 设置结构成员.
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
// 创建cmd进程.
if(ShellExecuteEx(&sei))
{
// 设置cmd进程的执行级别为空闲执行,使本程序有足够的时间从内存中退出.
SetPriorityClass(sei.hProcess,IDLE_PRIORITY_CLASS)
// 将自身进程的优先级置高
SetPriorityClass(GetCurrentProcess(),REALTIME_PRIORITY_CLASS)
SetThreadPriority(GetCurrentThread(),THREAD_PRIORITY_TIME_CRITICAL)
// 通知Windows资源浏览器,本程序文件已经被删除.
SHChangeNotify(SHCNE_DELETE,SHCNF_PATH,szModule,0)
return TRUE
}
}
return FALSE
}
其他相关程序直接调用remove函数删除就好. 只有程序本身 需要新建进程渣磨世删除 也就是上面这个代码. 游耐
检查下是否有中断被使能却为巧慧编写中断服务函数。或者为每个中断答宽逗源编写空的服务函数
原因是AVR中断服务向量在单片机的低段,与main函数清卖,处在相近位置,如无中断服务函数,据会跳到主函数中,这个与中用的编译器也有关系,winavr(gcc) , 就会这样。
在给你推荐一个调试方法,分块屏蔽sei() 前面的程序语句以方便定位,误使能中断的位置。
个人意见仅供参考,如若有误欢迎批评指正。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)