Bonjour;

J'aimerais l'aide de tout le monde afin de corriger ce code, je veux l'adresse Mac d'un ensemble d'ordinateurs de mon réseau dont les uns sont sous l'Unix et les autres sur Win (1------------255 adresse IP). Le code compile mais toutefois dès qu'il rencontre une adresse IP qui n'est pas associée à une machine dans l’intervalle (1---255), le code se plante et s'arrête du coup.

Je veux votre aide c'est pour un devoir à rendre ce vendredi.

Merci

CHARLES

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, Buttons;
 
type
 
    TForm1 = class(TForm)
    MemoMAC: TMemo;
    Edit1: TEdit;
    SpeedButton1: TSpeedButton;
    ListBox1: TListBox;
    procedure SpeedButton1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
function GetMACAdresses(const Adresses:TStrings;const MachineName:string=''):integer;
function GetMACAdress(const MachineName:string=''):string;
 
 var
  Form1: TForm1;
 
implementation
 
{$R *.DFM}
 
uses
NB30;
 
type
 ENetBIOSError=class(Exception);
 
function NetBiosCheck(const b:char):char;
begin
  if b<>chr(NRC_GOODRET) then raise ENetBIOSError.create('NetBios error'#13#10'Error code '+inttostr(ord(b)));
  result:=b;
end;
 
function AdapterToString(const Adapter:PAdapterStatus):string;
begin
  with Adapter^ do Result
  :=Format('%2.2x-%2.2x-%2.2x-%2.2x-%2.2x-%2.2x',[Integer(adapter_address[0]),
  Integer(adapter_address[1]),Integer(adapter_address[2]),
  Integer(adapter_address[3]),Integer(adapter_address[4]),
  Integer(adapter_address[5])]);
end;
 
 
procedure MachineNameToAdapter(Name:string;var AdapterName:array of char);
begin
  if Name='' then Name:='*' else Name:=ansiuppercase(Name);
  Name:=Name+StringOfChar(' ',length(AdapterName)-Length(Name));
  move(Name[1],AdapterName[0],length(AdapterName));
end;
 
 
function GetMACAdresses(const Adresses:TStrings;const MachineName:string=''):integer;
var
    i:integer;
    NCB: PNCB;
    Adapter:PAdapterStatus;
    Lenum:PLanaEnum;
    RetCode:char;
begin
  Adresses.clear;
  New(NCB);
  New(Adapter);
  New(Lenum);
 try
   Fillchar(NCB^,SizeOf(TNCB),0);
   fillchar(Lenum^,SizeOf(TLanaEnum),0);
   NCB.ncb_command:=chr(NCBENUM);
   NCB.ncb_buffer:=Pointer(Lenum);
   NCB.ncb_length:=SizeOf(Lenum^);
   NetBiosCheck(Netbios(NCB));
   result:=ord(Lenum.Length);
 
   for i:=0 to result-1 do
   begin
     Fillchar(NCB^,SizeOf(TNCB),0);
     Ncb.ncb_command:=chr(NCBRESET);
     Ncb.ncb_lana_num:=lenum.lana[i];
     NetBiosCheck(Netbios(Ncb));
 
     FillChar(NCB^,SizeOf(TNCB),0);
     FillChar(Adapter^,SizeOf(TAdapterStatus),0);
 
     Ncb.ncb_command:=chr(NCBASTAT);
     Ncb.ncb_lana_num:=lenum.lana[i];
     MachineNameToAdapter(MachineName,Ncb.ncb_callname);
     Ncb.ncb_buffer:=Pointer(Adapter);
     Ncb.ncb_length:=SizeOf(TAdapterStatus);
     RetCode:=Netbios(NCB);
     if RetCode in [chr(NRC_GOODRET),chr(NRC_INCOMP)] then
     Adresses.add(AdapterToString(Adapter));
   end;
 finally
     Dispose(NCB);
     Dispose(Adapter);
     Dispose(Lenum);
  end;
end;
 
 
function GetMACAdress(const MachineName:string=''):string;
  var stringlist:tstringlist;
begin
   stringlist:=tstringlist.create;
   try
     if GetMACAdresses(stringlist,MachineName)=0 then result:='' else
     result:=stringlist[0];
   finally
     Stringlist.Free();
   end;
end;
 
procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
  MemoMAC.Clear();
  GetMACAdresses(MemoMAC.Lines,Edit1.Text);
end;
 
end.