|
|
导航: |
论坛 -> 网络通讯
斑竹:liumazi,sephil |
|
作者: |
|
2023/4/19 21:15:17 |
标题: |
WOL 唤醒代码,编译成32位程序可以,64位不行? |
浏览:872 |
|
加入我的收藏 |
楼主: |
参考: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
----------------------------------------------
- |
作者: |
|
2023/4/19 23:40:02 |
1楼: |
我觉得吧是不是你没搞清楚32 64之间的差异 做兼容纯粹直接拿32套64来用了。
----------------------------------------------
-
|
作者: |
|
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;
整理一下,供大家参考。非常感谢楼上两位回复帮助!!!
----------------------------------------------
-
|
|