[Delphi (Object Pascal)] Delphi远程唤醒电脑的代码 →→→→→进入此内容的聊天室

来自 , 2020-11-05, 写在 Delphi (Object Pascal), 查看 141 次.
URL http://www.code666.cn/view/545e91a1
  1. //远程唤醒函数,用到winsock单元
  2. procedure TForm1.WakeUp(SAddr:string);
  3. var
  4.   WSAData: TWSAData;
  5.   MSocket: TSocket;
  6.   SockAddrIn: TSockAddrIn;
  7.   RetVal, OptVal, i: Integer;
  8.   MacAddr: array[0..5] of Byte;
  9.   MagicData: array[0..101] of Byte;
  10.   Position: Longint;
  11. begin
  12.   try
  13.     if Length(SAddr) <> 17 then Abort;
  14.     for i := 1 to Length(SAddr) do
  15.       if i in [3, 6, 9, 12, 15] then
  16.         if SAddr[i] <> '-' then Abort;
  17.           for i := 0 to High(MacAddr) do
  18.             begin
  19.             if Pos('-', SAddr) > 0 then
  20.               MacAddr[i] := StrToInt(HexDisplayPrefix + Copy(SAddr, 1, Pos('-', SAddr) - 1))
  21.             else
  22.               MacAddr[i] := StrToInt(HexDisplayPrefix + SAddr);
  23.             Delete(SAddr, 1, Pos('-', SAddr));
  24.             end;
  25.       except
  26.         application.MessageBox('网卡地址错误','警告',MB_ICONWARING);
  27.         exit;
  28.       end;
  29.      try
  30.       CheckWinSockResult(WSAStartup($0101, WSAData), 'WSAStartup');
  31.       MSocket := socket(AF_INET, SOCK_DGRAM, IPPROTO_IP);
  32.       if MSocket = INVALID_SOCKET then CheckWinSockResult(MSocket, 'socket');
  33.       OptVal := 1;
  34.       CheckWinSockResult(setsockopt(MSocket, SOL_SOCKET, SO_BROADCAST,
  35.       PChar(@OptVal), SizeOf(OptVal)), 'setsockopt');
  36.       FillChar(MagicData, SizeOf(MagicData), $FF);
  37.       Position := LEN_PHYSADDR;
  38.     while Position < SizeOf(MagicData) do
  39.       begin
  40.       Move(MacAddr, Pointer(Longint(@MagicData) + Position)^, LEN_PHYSADDR);
  41.       Inc(Position, LEN_PHYSADDR);
  42.       end;
  43.     SockAddrIn.sin_family := AF_INET;
  44.     SockAddrIn.sin_addr.S_addr := Longint(INADDR_BROADCAST);
  45.     RetVal := sendto(MSocket, MagicData, SizeOf(MagicData), 0, SockAddrIn, SizeOf(SockAddrIn));
  46.     if RetVal = SOCKET_ERROR then CheckWinSockResult(RetVal, 'sendto');
  47.     CheckWinSockResult(closesocket(MSocket), 'closesocket');
  48.     CheckWinSockResult(WSACleanup, 'WSACleanup');
  49.   except
  50.      exit;
  51.   end;
  52. end;
  53.  
  54. //错误时进行提示
  55. function TForm1.CheckWinSockResult(ResultCode: Integer;
  56.   const FuncName: string): Integer;
  57. begin
  58.   if ResultCode <> 0 then
  59.      begin
  60.      Result := WSAGetLastError;
  61.      ShowMessage(Format(#13#10'Windows socket函数''%s''错误: %s (%d)',[FuncName,SysErrorMessage(Result), Result]));
  62.      Abort;
  63.      end else Result := 0;
  64. end;
  65. //delphi/6839

回复 "Delphi远程唤醒电脑的代码"

这儿你可以回复上面这条便签

captcha