{
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函数删除就好. 只有程序本身 需要新建进程删除 也就是上面这个代码.
不过我还是没有找到象你说的那样的程序逾期自毁程序指一些程序,如中文编辑软件CCED及WPS等,这类程序的使用有一定的日期
限制,一旦逾期,将提出警告并删除系统运行所必须的文件。显然这类程序给我们的日常应
用带来了诸多不便。一种简单的方法是用DOS的DATE命令修改系统日期,然后运行这类程序
,运行完毕再改回日期。该法虽然可行,但需较多的人工干预,万一忘记某一步骤,将产生不
可预料的后果。一种改进的方法是使用批命令,但由于无法保证运行后系统日期的正确,故
其实际效果仍欠佳。有鉴于此,笔者用C语言编写了一个程序(附后),圆满地解决了此问题。
使用本方法不仅可以有效地防止程序自毁,而且不对系统日期产生影响。程序用Turbo C V
2.0编译通过,在PC/AT、Super386上运行通过。
#include
#include
#include
#include
extern unsigned_stklen=2048
extern unsigned_heaplen=2048
int main(int argc,char *argv ,char * envp )
{
struct date curdate,olddate
int reyear
inr result
char * errstr[] =
{
"Parameter table too long.",
"Invalid parameter.",
"Path or filename not found.",
"Bad EXEC format.",
"Not enough memory",
"Unknown error"
}
"int err
if (argc==1)
{
printf(" This program is used for executing those programs\n")
printf ("which may destroy themselves while deadline passed.\n\n")
printf ("Usage:SAFEDATE\n")
return 1
}
getdate (&curdate)
olddate=curdate
reyear=olddate.da_year_1980
olddate.da_year-=reyear
setdate (&olddate)
argv++/* Adjust command line pointer */
result=spawnvpe(P_WAIT,argv[0],argv,envp)
olddate.da_year+=reyear
setdate (&olddate)
if (result==-1)
{
printf("\aExecuting program%sfailed.\n",argv[0])
switch (errno)
{
case E2BIG: err=0
break
case EINVAL: err=1
break
case ENOENT: err=2
break
case ENOEXEC: err=3
break
case ENOMEM: err=4
break
default:
err=5
}
printf(" %s\n", errstr [err])
return 2
}
return 0
}
注:此文仅作为一种应用技巧予以刊出,仅此而已。
——编者
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)