Autor Beitrag
thomaskroger
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Do 08.03.12 15:21 
Hallo,
folgender Code funktionierte eine Zeitlang auf Delphi 7 und Windows 7.
Doch auf einmal geht nichts mehr.

Ein Ping, also die Fkt "IcmpSendEcho" wird mit korrekten Parametern aufgerufen aber kommt ohne Timeout, also sofort mit dem Ergebnis 0 zurück, also ohne.

Der Ping vom cmd-Fenster aus geht.
Auch wenn ich mein Delphi-Programm als Admin ausführe, geht "IcmpSendEcho" nicht.


ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
uses
  ping, WinSock;
// ICMP-Echo-API-Wrapper (Ping) für Delphi V1.04 vom 08.09.2011, (C) by Narses

RTT := Ping.Execute('192.168.2.241',1000);

...

IPv4: in_addr;
Timeout: Word;
Handle: THandle;
ReplyBuffer: array[0..MAX_ECHO_REPLY] of TIcmpEchoReply;
ReplyCount,i: Integer;

       ReplyCount := IcmpSendEcho(Handle,
                                   IPv4,
                                   NIL0,
                                   NIL,
                                   @ReplyBuffer[0], SizeOf(ReplyBuffer),
                                   Timeout);

danach ist ReplyCount:=0


Das gleich mit folgendem Code zum Ermitteln der MAC:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
uses
  WinSock;

//external:
function SendARP (DestIp: DWORD; srcIP: DWORD; pMacAddr: pointer; PhyAddrLen: Pointer): DWORD;stdcallexternal 'iphlpapi.dll';


  res,dwRemoteIP: cardinal;
  PhyAddrLen: Longword;
  pMacAddr : array [0..1of Longword;

  dwRemoteIP := cardinal(inet_addr(PChar(address)));
  ...
  res:=SendARP(dwremoteIP, 0, @pMacAddr, @PhyAddrLen);


danach ist res:=1 (NO_ERROR ist :=0)
"SendARP" gibt keinen korrekten Wert zurück.


Ich habe in der Zwischenzeit eine Menge geändert aber nicht innerhalb der nun toten Funktionen.
Welcher Seiteneffekt kann das sein?
Martok
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 3661
Erhaltene Danke: 604

Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
BeitragVerfasst: Do 08.03.12 21:14 
Die Wrapper-Funktionen von Windows versuche ich immer zu vermeiden, hat man nur Ärger mit ;)


Was sagt GetLastError und (falls die da Gültigkeit hat) WSAGetLastError?

Funktionierts auf anderen Rechnern?

Ist eventuell eine Firewall im Weg, die die Requests direkt abbricht?

_________________
"The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
thomaskroger Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Fr 09.03.12 18:34 
Die Funktionen ergeben folgende GetLastError_Ergebnisse:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
res:=SendARP(dwremoteIP, 0, @pMacAddr, @PhyAddrLen);
ShowMessage('GetLastError:'+IntToStr(GetLastError)+':'+SysErrorMessage(GetLastError));

RTT:=Ping.Execute(EditIP.Text, StrToInt(EditTimeout.text));
ShowMessage('GetLastError:'+IntToStr(GetLastError)+':'+SysErrorMessage(GetLastError));


Auf dem Entwicklungsrechner mit Windows 7 und IPHLPAPI.DLL vom 03.10.2003:
Mit GetLastError und WSAGetLastError gleich:
________________
res:=SendARP:
GetLastError=0=der Vorgang wurde erfolgreich beendet
res=1 (ERROR_INVALID_FUNCTION)
________________
RTT:=Ping.Execute:
RTT=-2 (Systemfehler)

das heißt in der unit ping:
ReplyCount:=IcmpSendEcho(bla..) gibt 0 zurück, also noReply und
GetLastError=1=unzulässige Funktion (ERROR_INVALID_FUNCTION))
________________


Auf dem Testrechner mit Windows XP funktionieren beide Funktionen problemlos!
Ping.Execute kümmert sich wenig um Timeout unter 1000ms, es dauert immer mindestens etwa 500ms.

"ZoneAlarm" ist komplett ausgestellt.
"arp -a" zeigt die korrekten IPs und MACs.

Was hat sich auf dem Windows7-PC verändert da das Ping.Execute einmal schon funktionierte?
bummi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1248
Erhaltene Danke: 187

XP - Server 2008R2
D2 - Delphi XE
BeitragVerfasst: Fr 09.03.12 18:51 
Was ist wenn Du das Programm als Administrator ausführst?

_________________
Das Problem liegt üblicherweise zwischen den Ohren H₂♂
DRY DRY KISS
thomaskroger Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Fr 09.03.12 20:23 
Auch als Admin ist das Problem unverändert. Ich habe den Eindruck, es ist außerhalb von Delphi im Windows-System zu suchen da ja schon die APIs durchfallen.