Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.11.2009, 14:32   #1
Maxs
Заблокирован
 
Регистрация: 06.04.2009
Сообщений: 130
По умолчанию TICQClient

Пытаюсь сделать icq клиент на Delphi 7. При поиске использую вот такой код:
For i:=1 to edtk do
begin
ProgressBar1.Position:=i;
ICQClient.SearchWhitePages('','','' ,'',StrToInt(Edit5.Text),StrToInt(E dit6.Text),Combobox1.ItemIndex,Edit 8.Text,Edit9.Text,ComboBox2.Items.S trings[ComboBox2.ItemIndex],Edit11.Text, Edit12.Text, Edit13.Text, Edit14.Text,Edit15.Text,'','','','' ,true);
end;
В событии о нахождении юзера контакты добавляются в чекбокс, проверяются на дубликаты...
Но если искать больше 100 раз (страниц) (если edtk>100), то программа зависает. Что это за ограничение в 100 запросов? Как его можно обойти? Или после каждых 100 пользователей переконнективаться и продолжать добавлять юзеров в список?
Maxs вне форума Ответить с цитированием
Старый 18.11.2009, 16:44   #2
Alex2009
Proger Man
Форумчанин
 
Аватар для Alex2009
 
Регистрация: 07.03.2009
Сообщений: 584
По умолчанию

В ICQ Works
Код:
{Do an extensive search for a user one. ADV}
procedure CreateCLI_SEARCHWP_(Pkt: PRawPkt; UIN: LongWord; MinAge, MaxAge: Word;
  Gender: Byte; Language: Word; City: String; Country: Word; Online: Byte; var Seq, Seq2: Word);
var
  lpkt: TRawPkt;
  lpkt2: TRawPkt;
begin
  if (Gender <> GEN_MALE) and (Gender <> GEN_FEMALE) then
    Gender := 0;                        //Don't care about gender
  PktInitRaw(@lpkt);                    //Initialize temporary packet
  PktInt(@lpkt, $a00F, 2);              //CLI_SEARCHBYPERSINF, Channel: 2, SNAC(21,2) 2000/4000
  PktInitRaw(@lpkt2);                    //Initialize temporary packet

  if City <> '' then begin PktInt(@lpkt2, $00a0, 2); PktNTS(@lpkt2, City); end;                                         //City/State
  if Country <> 0 then begin PktInt(@lpkt2, $00be, 2); PktInt(@lpkt2, $0004, 2); PktInt(@lpkt2, Country, 4); end;         //Country
  if Language <> 0 then begin PktInt(@lpkt2, $00FA, 2); PktInt(@lpkt2, $0002, 2); PktInt(@lpkt2, Language, 2); end;       //Language
  if Gender <> 0 then begin PktInt(@lpkt2, $0082, 2); PktInt(@lpkt2, $0001, 2); PktInt(@lpkt2, Gender, 1);  end;           //Gender
  if (MinAge <> 0) and (MaxAge <> 0) then begin PktInt(@lpkt2, $0154, 2); PktInt(@lpkt2, $0004, 2); PktInt(@lpkt2, MaxAge, 2); PktInt(@lpkt2, MinAge, 2); end;      //Age
  if Online = 1 then begin PktInt(@lpkt2, $0136, 2); PktInt(@lpkt2, $0002, 2); PktInt(@lpkt2, $0001, 2); end;                //Search only online users

  PktLInt(@lpkt, lpkt2.Len + 26, 2);

  PktInt(@lpkt, $05b90fa0, 4);
  PktInt(@lpkt, $00000000, 4);
  PktInt(@lpkt, $00000000, 4);
  PktInt(@lpkt, $04e30000, 4);
  PktInt(@lpkt, $00020002, 4);
  PktInt(@lpkt, Seq2, 2);
  PktInt(@lpkt, $0001, 2);
  PktInt(@lpkt, lpkt2.Len, 2);

  PktAddArrBuf(@lpkt, @lpkt2, lpkt2.Len);

  CreateCLI_TOICQSRV_(Pkt, UIN, $07D0, @lpkt, lpkt.Len, Seq, Seq2); 
end;


procedure CreateCLI_TOICQSRV_(Pkt: PRawPkt; UIN: LongWord; Command: Word; Data: Pointer; DataLen: LongWord; var Seq, Seq2: Word);
var
  lpkt: TRawPkt;
  len: Word;
begin
  PktInit(Pkt, 2, Seq);                         //Channel 2
  PktSnac(Pkt, $15, $02, $00000000, 0);       //Snac: Type x15/x02, ID x00000000, Flags 0
  PktInitRaw(@lpkt);
  Inc(lpkt.Len, 2);
  PktInt(@lpkt, Swap32(UIN), 4);
  PktInt(@lpkt, Swap16(Command), 2);
  PktInt(@lpkt, Swap16(0), 2);
  PktAddArrBuf(@lpkt, Data, DataLen);
  //Store remaining size
  len := lpkt.Len;
  lpkt.Len := 0;
  PktLInt(@lpkt, len - 2, 2);
  lpkt.Len := len;
  //--
  PktTLV(Pkt, 1, lpkt.Len, @lpkt);
  PktFinal(Pkt);
  Inc(Seq2);
end;
и в ICQ Client
Код:
procedure TICQClient.HSnac1503(Flap: TFlapHdr; Snac: TSnacHdr; Pkt: PRawPkt);
.....
          $a401, $ae01: //SRV_METAFOUND Channel: 2, SNAC(21,3) 2010/420 or Channel: 2, SNAC(21,3) 2010/430
          begin
              ........
          end;

          $b40f, $aa0f: //SRV_METAFOUND Channel: 2, SNAC(21,3) 2010/420 or Channel: 2, SNAC(21,3) 2010/430
          begin
            if GetInt(Pkt, 1) <> $0a then
            begin
              if Assigned(OnUserNotFound) then
                FOnUserNotFound(Self);
              Exit;
            end;
            Inc(Pkt^.Len, 2);                   //Length of the following data.
            UIN := GetStr(Pkt, 23);   //skip all not needed  -- не расшифровывал
            foundedcnt := GetInt(Pkt, 2);  // количество результатов в поиске
            UIN := GetStr(Pkt, 8);   //skip all not needed -- не расшифровывал
            UIN := trim(GetWStr(Pkt));   //The user's UIN.
            if UIN = '' then
            begin
              if Assigned(OnUserNotFound) then
                FOnUserNotFound(Self);
              Exit;
            end;
            if Assigned(OnUserFound) then
              FOnUserFound(Self, UIN, '', '', '', '', foundedcnt, 0, 0, cmd = $b40f, false);
          end;
ShowMessage('Добро пожаловать!');
Alex2009 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
TICQClient __@cmd@__ Компоненты Delphi 3 20.08.2009 16:03
свежий TIcqClient andrey4623 Софт 4 19.08.2009 17:22
TICQClient Xandr Работа с сетью в Delphi 11 04.07.2008 13:28
скачать TICQClient andrey4623 Компоненты Delphi 9 03.07.2008 14:26
Проблемка с TIcqClient BlackOmen Работа с сетью в Delphi 6 02.03.2008 18:29