AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Wake On Lan (WOL) für Delphi 2007 / Indy
Thema durchsuchen
Ansicht
Themen-Optionen

Wake On Lan (WOL) für Delphi 2007 / Indy

Ein Thema von berens · begonnen am 2. Jul 2007 · letzter Beitrag vom 7. Sep 2016
Antwort Antwort
berens

Registriert seit: 3. Sep 2004
434 Beiträge
 
Delphi 10.4 Sydney
 
#1

Wake On Lan (WOL) für Delphi 2007 / Indy

  Alt 2. Jul 2007, 12:47
Hi, ich versuche gerade den Code aus der Library umzuschreiben, so dass man ihn mit Delphi 2007 und der aktuellen Indy benutzen kann (die bei Delphi 2007 dabei ist).

Problem: lUDPClient.SendBuffer(lUDPClient.Host, lUDPClient.Port, bs);
"Es gibt keine Überladene Version blabla" --> bs sollte vom falschen Typ sein. In der CodeVervollständigung steht zwar der Typ TBytes drinnen, die Indy-Hilfe sagt jedoch ich solle TIdBytes verwenden. Egal wie, das Programm mag weder mit dem Einen, noch mit dem anderen Typen kompilieren.

Irgendeine Idee?

Edit: Falls ich wirklich alles mit TidBytes fülle kommt der I/O Fehler 105. Was auch immer das bedeutet.
Edit2: Es geht um Indy10. Indy9 würde wohl funktionieren laut den anderen Beispielen. Ich hasse Indy *grummel*


Delphi-Quellcode:
unit uWakeOnLan;

interface

implementation

uses
  WinTypes, Messages, SysUtils, Classes, IdBaseComponent,
  IdComponent, IdUDPBase, IdUDPClient;


Function HexToInt(S:String): LongInt;
const
  DecDigits: Set Of '0'..'9' = ['0'..'9'];
  HexVals: Array [0..$F] Of Integer = (0, 1, 2, 3, 4, 5, 6, 7,
     8, 9, $A, $B, $C, $D, $E, $F);
  UpCaseHexLetters: Set Of 'A'..'F' = ['A'..'F'];
  LowCaseHexLetters: Set Of 'a'..'f' = ['a'..'f'];
var
  v: LongInt;
  i: integer;
  LookUpIndex: integer;
begin
  if length(S) <= 8 then
  begin
    v := 0;
    for i := 1 to length(S) do
    begin
      {$R-}
        v := v Shl 4;
      {$R+}
      if S[i] in DecDigits then
      begin
          LookUpIndex := Ord(S[i]) - Ord('0');
      end else
      begin
        if S[i] in UpCaseHexLetters then
        begin
          LookUpIndex := Ord(S[i]) - Ord('A') + $A;
        end else
        begin
          if S[i] in LowCaseHexLetters then
          begin
            LookUpIndex := Ord(S[i]) - Ord('a') + $A;
          end else
          begin
            LookUpIndex := 0;
          end;
        end;
      end;
      v := v Or HexVals[LookUpIndex];
    end;
    result := v;
  end else
  begin
    result := 0;
  end;
end;

procedure WakeUPComputer(aMacAddress: string);
var
  i, j: Byte;
  lBuffer: array[1..116] of Byte;
  lUDPClient: TIdUDPClient;
  bs: TBytes;
begin
  try
    SetLength(bs, 116);
    for i := 0 to 5 do
    begin
      bs[i] := HexToInt(aMacAddress[(i * 2) - 1] + aMacAddress[i * 2]);
    end;
    bs[6] := $00;
    bs[7] := $74;
    bs[8] := $FF;
    bs[9] := $FF;
    bs[10] := $FF;
    bs[11] := $FF;
    bs[12] := $FF;
    bs[13] := $FF;
    for j := 1 to 16 do
    begin
      for i := 1 to 6 do
      begin
        bs[14 + (j - 1) * 6 + (i - 1)] := bs[i];
      end;
    end;
    bs[115] := $00;
    bs[114] := $40;
    bs[113] := $90;
    bs[112] := $90;
    bs[111] := $00;
    bs[110] := $40;
    try
      lUDPClient := TIdUDPClient.Create(nil);
      lUDPClient.BroadcastEnabled := true;
      lUDPClient.Host := '255.255.255.255';
      lUDPClient.Port := 2050;
      lUDPClient.SendBuffer(lUDPClient.Host, lUDPClient.Port, bs); // <-- hier das Problem
      writeln('Trying to wake-up remote host: ' + aMacAddress);
    finally
      lUDPClient.Free;
    end;
  except
   on E: Exception do writeln('There was an error');
  end;
end;

end.
  Mit Zitat antworten Zitat
berens

Registriert seit: 3. Sep 2004
434 Beiträge
 
Delphi 10.4 Sydney
 
#2

Re: Wake On Lan (WOL) für Delphi 2007 / Indy

  Alt 3. Jul 2007, 11:43
Habe das Problem lösen können, unter anderem mit Hilfe von http://www.swissdelphicenter.ch/torr...de.php?id=1556 .

Hier die komplette Unit, vielleicht mag das ja mal jemand als Aktualisierung in die Library hinzufügen:

Delphi-Quellcode:
unit uWakeOnLan;

interface

uses
  WinTypes, Messages, SysUtils, Classes, IdBaseComponent,
  IdComponent, IdUDPBase, IdUDPClient, IdGlobal;

procedure WakeUPComputer(aMacAddress: string);

implementation

procedure WakeUPComputer(aMacAddress: string);
var
  Data: string;
  temp: string;
  k, n: integer;
  idUDPClient: TIdUDPClient;
begin
  try

    SetLength(Data, 255);
    for k := 0 to 5 do
    begin
      Data := Data + Chr(StrToInt('$FF')); // 6x add a FF / 6x ein FF hinzufügen
    end;
    temp := StringReplace(aMacAddress, '-', '', [rfReplaceAll]);
    for k := 0 to 15 do
    begin
      temp := StringReplace(aMacAddress, '-', '', [rfReplaceAll]);
      for n := 0 to 5 do
      begin
        // 16x add Target-Mac-Adress / 16x die Ziel-Macadresse hinzufügen
        Data := Data + Chr(StrToInt('$' + temp[1] + temp[2]));
        Delete(temp, 1, 2);
      end;
    end;

    try
      idUDPClient := TIdUDPClient.Create(NIl);
      idUDPClient.BroadcastEnabled := true;
      idUDPClient.Host := '255.255.255.255';
      idUDPClient.Port := 80;
      idUDPClient.Send(Data);
    finally
      FreeAndNil(idUDPClient);
    end;
  except
  end;
end;

end.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.053 Beiträge
 
Delphi 12 Athens
 
#3

AW: Wake On Lan (WOL) für Delphi 2007 / Indy

  Alt 5. Mai 2014, 14:57
So richtig gut wurde aber nicht von Torry abgeschrieben.
Am Anfang die 255 Zeichen waren da noch nicht drin.

Das Create gehört gefälligst vor das Try und das erste Temp := ist auch nutzlos.
Da hat wohl jemand nicht auf das gehört, das der Compiler einem zu sagen hat.


----------------

Ursache: http://www.delphipraxis.net/180255-w...n-problem.html

Code für Indy 10 und Unicode-Delphis:
Delphi-Quellcode:
procedure WakeOnLAN(MacAddr: string; Port: TIdPort=80; Host: string='255.255.255.255');
var
  MacAddr: string;
  Data: TIdBytes;
  Temp: array[0..5] of Byte;
  i: Integer;
begin
  MacAddr := StringReplace(MacAddr, '-', '', [rfReplaceAll]);
  Assert(Length(MacAddr) = 6 * 2);
  SetLength(Data, (1 + 16) * 6);

  FillChar(Temp, 6, $FF);
  Move(Temp, Data[0], 6); // 6x FF (1x FFFFFFFFFFFF)

  HexToBin(PChar(MacAddr), Temp, 6);
  for i := 1 to 16 do
    Move(Temp, Data[i * 6], 6); // 16x Target-MAC-Adress

  IdUDPClient1.SendBuffer(MacAddr, Port, Data);
end;
(ich hoffe mal der funktioniert auch, da blind dahingetippt und ungetestet)
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu ( 5. Mai 2014 um 15:01 Uhr)
  Mit Zitat antworten Zitat
Darlo

Registriert seit: 28. Jul 2008
Ort: München
1.196 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#4

AW: Wake On Lan (WOL) für Delphi 2007 / Indy

  Alt 6. Sep 2016, 22:05
Hallo,

ich grabe mal den Thread hier aus, da das WakeOnLan bei mir nicht mehr funktioniert.
Im letztem Codebeispiel habe ich den kleinen Vertipper
IdUDPClient1.SendBuffer(MacAddrHost, Port, Data);
korrigiert, leider startet der Rechner nicht.

Gegeben:
Delphi 10.1 Enterprise
Win10 Pro 64 bit
Schnellstart deaktiviert
BIOS und Energieeinstellungen überprüft.

Über die FritzBox kann ich den Rechner per WOL starten, leider nicht mit Delphi.
Kennt jemand das Problem, liegt es ggf. am 64 Bit System?
Philip
  Mit Zitat antworten Zitat
Benutzerbild von Tonic1024
Tonic1024

Registriert seit: 10. Sep 2003
Ort: Cuxhaven
559 Beiträge
 
RAD-Studio 2009 Ent
 
#5

AW: Wake On Lan (WOL) für Delphi 2007 / Indy

  Alt 7. Sep 2016, 09:22
Im letztem Codebeispiel habe ich den kleinen Vertipper
IdUDPClient1.SendBuffer(MacAddrHost, Port, Data);
korrigiert, leider startet der Rechner nicht.
Und du siehst da keinen Zusammenhang?

WOL funktioniert nur mit MAC Adressen. Aber Wie Himitsu schon sagte, er hat es nicht getestet. Und ich glaub es fehlt auch was. Du müsstest den oberen Code um seine Ergänzungen erweitern/ändern. dann sollte das klappen.

Ich verwende seit Jahren diese Unit aus meiner persönlichen Codesammlung erfolgreich. Ich glaub die stammt auch aus der DP. Möglich, dass ich dran herum optimiert hab. Das sähe mir ähnlich. Falls der Autor sie wieder erkennt: Dickes, dickes Dankeschön!

Gruß,

Toni
Angehängte Dateien
Dateityp: pas WOL.pas (3,6 KB, 168x aufgerufen)
Der frühe Vogel fängt den Wurm, richtig.
Aber wird nicht auch der frühe Wurm vom Vogel gefressen?

Geändert von Tonic1024 ( 7. Sep 2016 um 09:33 Uhr) Grund: gruseliges deutsch beseitigt
  Mit Zitat antworten Zitat
Darlo

Registriert seit: 28. Jul 2008
Ort: München
1.196 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#6

AW: Wake On Lan (WOL) für Delphi 2007 / Indy

  Alt 7. Sep 2016, 15:22
Hast Du auch eine Crossplattform-Lösung?
Philip
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:23 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz