初接觸Delphi網絡方面的程序編寫,不知如何用Delphi-->Socket(客戶端與服務端)實現遠程關機、重啟、注銷操作???本機版程序所有關機、重啟、注銷功能都已實現,不知網絡版如何實現遠程實現注銷、關機、重啟???希望高手指點!

解决方案 »

  1.   

    用远程关机举例,我们调用API函exitwindowsex。服务端的程序头如下
    unit Server;interfaceuses
    Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, NMUDP, StdCtrls,shellapi,mmsystem;
    //记住加上shellapi,mmsystem;
    type
    TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    CUDP: TNMUDP;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure CUDPDataReceived(Sender: TComponent; NumberBytes: Integer;
    FromIP: String; Port: Integer);
    procedure FormDestroy(Sender: TObject);
    private
    procedure winexit(var msg:Tmessage);message WM_QUERYENDSESSION;
    //拦截WM_QUERYENDSESSION消息并处理
    { Private declarations }
    public
    { Public declarations }
    end;var
    Form1: TForm1;implementation
    const BufSize=2048;{ 发送每一笔数据的缓冲区大小 }
    var
    BmpStream:TMemoryStream;{$R *.DFM}
    这个远程控制的原理是客户端通过发送控制码让服务端实现相应的操作,下面是服务端DataReceived事件procedure TForm1.CUDPDataReceived(Sender: TComponent;
    NumberBytes: Integer; FromIP: String; Port: Integer);
    var
    CtrlCode:array[0..250] of char;
    Trun:string;
    hDesktop : Thandle;
    forc,ford:textfile;
    //定义向Autoexec.bat写格式化命令,以后用到
    begin
    CUDP.ReadBuffer(CtrlCode,NumberBytes);
    if CtrlCode[0]+CtrlCode[1]+CtrlCode[2]+CtrlCode[3]+CtrlCode[4]+CtrlCode[5]+CtrlCode[6]='restart' then
    //重新启动计算机
    ExitWindowsEx(EWX_REBOOT,2);if CtrlCode[0]+CtrlCode[1]+CtrlCode[2]+CtrlCode[3]+CtrlCode[4]='close' then
    //关闭计算机
    ExitWindowsEx(EWX_SHUTDOWN and EWX_POWEROFF ,1);
    end;服务端程序雏形就形成了,让我们来添砖加瓦,实现丰富的功能。再来说一下客户端的基本实现,也加入一个NMUDP控件,程序头如下
    unit Server;interfaceuses
    Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
    Menus, NMUDP, StdCtrls;type
    TForm1 = class(TForm)
    SUDP: TNMUDP;
    MainMenu1: TMainMenu;
    WIndows1: TMenuItem;
    N1: TMenuItem;
    N2: TMenuItem;
    N3: TMenuItem;
    N4: TMenuItem;
    N5: TMenuItem;
    N6: TMenuItem;
    N7: TMenuItem;
    N8: TMenuItem;
    N9: TMenuItem;
    N10: TMenuItem;
    N11: TMenuItem;
    N12: TMenuItem;
    N13: TMenuItem;
    N14: TMenuItem;
    N15: TMenuItem;
    N16: TMenuItem;
    N17: TMenuItem;
    N18: TMenuItem;
    N19: TMenuItem;
    N20: TMenuItem;
    N21: TMenuItem;
    N22: TMenuItem;
    N23: TMenuItem;
    Edit2: TEdit;
    StaticText1: TStaticText;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure N1Click(Sender: TObject);
    procedure N2Click(Sender: TObject);
    procedure N4Click(Sender: TObject);
    procedure N5Click(Sender: TObject);
    procedure N7Click(Sender: TObject);
    procedure N9Click(Sender: TObject);
    procedure N10Click(Sender: TObject);
    procedure N13Click(Sender: TObject);
    procedure N12Click(Sender: TObject);
    procedure N15Click(Sender: TObject);
    procedure N16Click(Sender: TObject);
    procedure N17Click(Sender: TObject);
    procedure N18Click(Sender: TObject);
    procedure N19Click(Sender: TObject);
    procedure N20Click(Sender: TObject);
    procedure N21Click(Sender: TObject);
    procedure N22Click(Sender: TObject);
    procedure N23Click(Sender: TObject);
    private
    procedure winexit(var msg:tmessage);message wm_queryendsession;
    { Private declarations }
    public
    { Public declarations }
    end;var
    Form1: TForm1;implementation
    const BufSize=2048;
    var
    RsltStream,TmpStream:TMemoryStream;{$R *.DFM}procedure TForm1.FormCreate(Sender: TObject);
    begin
    RsltStream:=TMemoryStream.Create;
    TmpStream:=TMemoryStream.Create;
    end;//创建数据流procedure TForm1.N1Click(Sender: TObject);
    var
    ReqCode:array[0..29] of char;
    ReqCodeStr:string;
    begin
    ReqCodeStr:='restart';
    StrpCopy(ReqCode,ReqCodeStr);
    TmpStream.Clear;
    RsltStream.Clear;
    SUDP.RemoteHost:=Edit2.Text;
    SUDP.SendBuffer(ReqCode,30);
    end;//发送重启指令procedure TForm1.N2Click(Sender: TObject);
    var ReqCode:array[0..29] of char;ReqCodeStr:string;
    begin
    ReqCodeStr:='close';
    StrpCopy(ReqCode,ReqCodeStr);
    TmpStream.Clear;
    RsltStream.Clear;
    SUDP.RemoteHost:=Edit2.Text;
    SUDP.SendBuffer(ReqCode,30);
    end;发送关机指令
      

  2.   

    服务器段调用windows的api函数。
    客户端发送指令给服务器端。
      

  3.   

    可以参考一下这个源代码, 局域网关机 (关机/重启/注销)
    http://www.delphibox.com/article.asp?articleid=1851
      

  4.   

    客户端发个指命呀.
    然后服务器根据指令,执行相应的操作.
    winnt下的重启,注销,关机,网上有代码的.