DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: vic_168999
今日帖子: 7
在线用户: 13
导航: 论坛 -> 网络通讯 斑竹:liumazi,sephil  
作者:
男 net1999 (好人) ★☆☆☆☆ -
普通会员
2023/4/19 21:15:17
标题:
WOL 唤醒代码,编译成32位程序可以,64位不行? 浏览:862
加入我的收藏
楼主: 参考:Delphi Winsock远程唤醒计算机的函数 https://www.delphitop.com/html/wangluo/4395.html ;这个给出的一个可用的函数(如下),它只适合于32位程序,当编译成64位程序时,运行出错。哪位大侠知道哪里要注意什么?感谢!

uses Winsock;

{远程唤醒函数   00-e0-4d-df-7e-8a}

procedure WakeUpPro(MacAddr: string);
var
  WSAData          : TWSAData;
  MSocket          : TSocket;
  SockAddrIn        : TSockAddrIn;
  i          : integer;
  MagicAddr         : array[0..5] of Byte;
  MagicData         : array[0..101] of Byte;
begin
  for i := 0 to 5 do
    MagicAddr[i] := StrToInt('$' + copy(MacAddr, i * 3 + 1, 2));
  try
    WSAStartup($0101, WSAData);
    MSocket := socket(AF_INET, SOCK_DGRAM, IPPROTO_IP); //创建一个UPD数据报SOCKET.
    if MSocket = INVALID_SOCKET then
      exit;
    i := 1;
    setsockopt(MSocket, SOL_SOCKET, SO_BROADCAST, PChar(@i), SizeOf(i)); //设置广播
    FillChar(MagicData, SizeOf(MagicData), $FF);
    i := 6;
    while i < SizeOf(MagicData) do
    begin
      Move(MagicAddr, Pointer(Longint(@MagicData) + i)^, 6);
      Inc(i, 6);
    end;
    SockAddrIn.sin_family := AF_INET;
    SockAddrIn.sin_addr.S_addr := Longint(INADDR_BROADCAST);
    sendto(MSocket, MagicData, SizeOf(MagicData), 0, SockAddrIn, SizeOf(SockAddrIn));
    closesocket(MSocket);
    WSACleanup;
  except
    on E: Exception do
      Memodebug.Lines.add('wakeup mac:' + MacAddr + ' except!' + E.message);
  end;
end;

出错信息类似于:

wakeup mac:00-0C-29-22-9F-54 except!Access violation at address 0000000000E4A070 in module 'NewViewerTC.exe'. Write of address FFFFFFFF9AD3ED8E
----------------------------------------------
-
作者:
男 1111111113 (1111111113) ▲△△△△ -
普通会员
2023/4/19 23:40:02
1楼: 我觉得吧是不是你没搞清楚32 64之间的差异 做兼容纯粹直接拿32套64来用了。
----------------------------------------------
-
作者:
男 codecoolie (CodeCoolie) ★☆☆☆☆ -
普通会员
2023/4/20 0:15:42
2楼: LongInt 改为 NativeUInt

LongInt 始终为32位的

NativeUInt 根据平台变化

在64位下,指针为64位的
----------------------------------------------
FFmpeg for Delphi http://www.CCAVC.com http://www.DelphiFFmpeg.com
作者:
男 net1999 (好人) ★☆☆☆☆ -
普通会员
2023/4/22 20:52:11
3楼: 解决了,把这句:
    Move(MagicAddr, Pointer(Longint(@MagicData) + i)^, 6);
改为:
    Move(MagicAddr, Pointer(NativeInt(@MagicData) + i)^, 6);
就不出错了。之前改的一个字节一个字节复制也可以:

       // 64位,32位都行。
      for j := 0 to 5 do
      begin
        MagicData[i + j] := MagicAddr[j];
      end;     

整理一下,供大家参考。非常感谢楼上两位回复帮助!!!
----------------------------------------------
-
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行85.9375毫秒 RSS