Bonsoir,

Je poste ici pour demander un peu d'aide car je suis vraiment bloqué par un problème que je n'arrive pas à résoudre ... Je m'explique : j'ai crée un record comme ceci:
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
Type
   T_CMD_AUTH_LOGON_CHALLENGE = packed Record
      Opcode          : byte;
      Error           : byte;
      Size            : word;
      GameName        : array [0..3] of byte;
      Gameversion     : array [0..2] of byte;
      GameBuild       : word;
      Platform        : array [0..3] of byte;
      OperatingSystem : array [0..3] of byte;
      Area            : array [0..3] of byte;
      TimeZone        : Cardinal;
      ClientIP        : array [0..3] of byte;
      AccoutNameLen   : byte;
      AccountName     : array of byte;
   end;
Donc le champ AccountName est un tableau dynamique apres je complète tout ca grace a ma procedure :
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
Procedure Send_CMD_AUTH_LOGON_CHALLENGE;
Var
   CMD_AUTH_LOGON_CHALLENGE : T_CMD_AUTH_LOGON_CHALLENGE;
   PacketSize : word;
   i : word;
   lst : TStringList;
Begin
   CMD_AUTH_LOGON_CHALLENGE.Opcode := 0;
   CMD_AUTH_LOGON_CHALLENGE.Error := 3;
   PacketSize := (SizeOf(CMD_AUTH_LOGON_CHALLENGE)-SizeOf(CMD_AUTH_LOGON_CHALLENGE.AccountName))+length(AccountName);
   CMD_AUTH_LOGON_CHALLENGE.Size := PacketSize-(4);
   Fill_array(CMD_AUTH_LOGON_CHALLENGE.GameName, 'WoW', true);
   lst := TStringList.Create;
   lst.Text:= Game_Version;
   lst.text := StringReplace(lst.text,'.',#13#10,[rfReplaceAll]);
   for i:=0 to lst.count-1 do begin
      CMD_AUTH_LOGON_CHALLENGE.Gameversion[i]:=StrToInt(lst.Strings[i]);
   end;
   CMD_AUTH_LOGON_CHALLENGE.GameBuild := Game_Build;
   Fill_array(CMD_AUTH_LOGON_CHALLENGE.Platform, 'x86', true);
   Fill_array(CMD_AUTH_LOGON_CHALLENGE.OperatingSystem, 'Win', true);
   Fill_array(CMD_AUTH_LOGON_CHALLENGE.Area, 'frFR', true);
   CMD_AUTH_LOGON_CHALLENGE.TimeZone := 60;
   Local_IP := GStack.LocalAddress;
   lst.Text:= Local_IP;
   lst.Text := StringReplace(lst.text,'.',#13#10,[rfReplaceAll]);
   for i:=0 to lst.count-1 do begin
      CMD_AUTH_LOGON_CHALLENGE.ClientIP[i] := StrToInt(lst.Strings[i])
   end;
   SetLength(CMD_AUTH_LOGON_CHALLENGE.AccountName, length(AccountName));
   CMD_AUTH_LOGON_CHALLENGE.AccoutNameLen := length(AccountName);
   for i:=Low(CMD_AUTH_LOGON_CHALLENGE.AccountName) to High(CMD_AUTH_LOGON_CHALLENGE.AccountName) do begin
      CMD_AUTH_LOGON_CHALLENGE.AccountName[i] := byte(Upcase(AccountName[i+1]));
   end;
   Form1.IdTCPClient1.WriteBuffer(CMD_AUTH_LOGON_CHALLENGE, PacketSize, true);
   lst.Free;
End;
Voilà Donc quand j'envoi mon paquet ( a l'heure actuelle j'utilise netcat avec les paramètre nc.exe -l -p 3724 -o dump.txt pour avoir un serveur et identifier correctement les paquets ) le record est parfaitement compléter dans le programme ( vérifié avec le debuggueur ) mais le paquet recu est bien jusqu'au champ AccountName , j'ai l'impression que ce qu'il envoit c'est la valeur du pointeur mais j'en suis absolument pas sure .

Merci beacoups de vos réponses.

P.S : Les sources ne sont pas toutes ici les variable qui ne sont pas déclarer ici sont déclarer plus loin ^^, AccountName est un string.