|
Программирование C / C++ / Visual C++ / Delphi / Visual Basic / ASM / Windows / Pascal |
|
Опции темы | Рейтинг: |
28.05.2007, 06:59 | #1 |
Участник
Регистрация: 06.08.2006
Сообщений: 243
ICQ: 272727765 Репутация: 406
|
TICQClient - исправления, дополнения и прочее
В этой теме будут выкладываться исправления и дополнения к компоненту TICQClient от Кобана для Delphi.
Компонент, актуально работающий на 13.08.2010 скачать: TICQClient Пример работы с компонентом: скачать: СheatICQ Официальный хелп от coban2k скачать: TICQClientHelp.rar ============================== Оригинальный компонент (с демо): скачать Компонент с работающими прокси и кодировками скачать тут Компонент от Romen'a (с демо): - движок на ICQ - к архиве есть все необходимые модули (для WSocket'a от ICS 1.4, плюс из RxLib несколько модулей) - из компонента убрано все "лишнее" скачать Демки делались в Turbo Delphi 2006, поэтому если вы будете собирать их под Delphi 7 и ниже не забудте в насткойках проекта указать пути, иначе среда не найдет эти модули и будет ругаться на их отсутствие. 1) Project -> Options 2) Закладка Directories/Conditionals 3) -> Units output directory: Units -> Search path: ICQClient Последний раз редактировалось DjFly; 04.02.2012 в 20:23. |
20.06.2008, 15:43 | #226 |
Участник
Регистрация: 31.10.2003
Сообщений: 568
Репутация: 1627
|
Нужны 3 объекта для этого.
TMemoryStream *stream; TJpegImage *jpg; TBitmap *BMP; Буфер из этого TLV($0002) копируешь в стрим, потом из стрима в TJpegImage. Код:
stream->Clear(); stream->SetSize(тут длина буфера в этом TLV); stream->Position = 0; stream->Write((VOID*)указатель на этот буфер, длина буфера); stream->Position = 0; try { jpg->LoadFromStream(stream); BMP->Assign(jpg); } catch(...) { // обработка исключения с джпегом } ADD: На дельфи примерно то же самое. С синтаксисом боюсь прошибиться. Буквально стрелочки на точечки заменить + по мелочи. Последний раз редактировалось metal; 20.06.2008 в 15:49. |
Плюсанул metal : |
20.06.2008, 17:45 | #227 |
Участник
Регистрация: 12.12.2007
Сообщений: 6
Репутация: 2
|
metal
спасибо, кстати на Delpi этот код выглядит так: Код:
function GetImageFromPacket(p: PPack): TPicture; var MS: TMemoryStream; TempImage: TJPEGImage; begin MS := TMemoryStream.Create(); MS.write(p^.data, p^.length); MS.Position := 0; TempImage := TJPEGImage.Create(); TempImage.LoadFromStream(MS); Result := TPicture.Create(); Result.Assign(TempImage); TempImage.Destroy; MS.Destroy; end; |
20.06.2008, 23:47 | #228 |
Участник
Регистрация: 15.06.2008
Сообщений: 17
ICQ: 117868 Репутация: 34
|
Я посмотрел повнимательнее с помощью ICQMenace и увидел, что если в ICQ6 менять XStatus, то второй ICQ6 получает 2 пакета SNAC(03,0B), причём в одном из них - icqmood. А если я в своей программе пытаюсь поставить XStatus, то ICQ6 получает всего 1 пакет SNAC(03, 0B). Пакеты установки XStatus'а почти совпадают (за исключением FLAP, см. выше). В чём проблема - непонятно... Подскажите, пожалуйста.
|
Плюсанул Tsar_Ioann_XIII : |
21.06.2008, 11:37 | #229 |
Участник
|
Tsar_Ioann_XIII, ну так разбери в Menace этот пакет, и сделай в TICQClient, это очень просто ;)
__________________
Хочешь знать как работает ICQ? Читай документацию по протоколу в OSCAR. |
Плюсанул .fry : |
21.06.2008, 12:52 | #230 |
Участник
Регистрация: 15.06.2008
Сообщений: 17
ICQ: 117868 Репутация: 34
|
Разобрал, но в чём причина, остаётся загадкой.
Когда я ставлю XStatus в ICQ6, то qip8060 принимает SNAC(03,0B), где в конце - TLV13 (в нём капабилити), TLV29 (в нём текст XStatus'а) и снова TLV13 (в нём две Unknown (для Menace) капабилити, в первой icqmood). Когда я ставлю XStatus в своей программе, то qip8060 принимает SNAC(03,0B), где в конце - TLV13 (в нём капабилити), TLV15 и TLV3 (в них Time). Про XStatus нет и речи... Тем не менее пакеты установки XStatus'а одинаковы и у ICQ6, и у моей проги (их я приводил здесь - http://forum.asechka.ru/showpost.php...&postcount=244 ). В чём же проблема тогда? Добавлено через 3 минуты Кстати, народ, у кого-то ведь работает? Посмотрите, пожалуйста, до сих пор работает? Если да, то будьте так любезны, выложите сырцы. Последний раз редактировалось Tsar_Ioann_XIII; 21.06.2008 в 12:55. Причина: Добавлено сообщение |
Плюсанул Tsar_Ioann_XIII : |
23.06.2008, 08:35 | #231 |
Участник
Регистрация: 04.02.2008
Сообщений: 11
Репутация: 1
|
Sax-mmS, там уже есть глобальная константа, однако по неизвестной причине в самой программе вместо неё используется прямое указание значения...
Вопрос по поводу ошибки "Recived malformed packet" остаётся открытым. Пробовал закоментировать проверку условия - начинает вылетать Access violation. Сообщение возникает когда я требую у сервера офф-лайн сообщения... |
23.06.2008, 15:56 | #232 |
Участник
Регистрация: 15.06.2008
Сообщений: 17
ICQ: 117868 Репутация: 34
|
Моя проблема (по поводу XStatus'ов) похоже решена! Я взял TICQClient от Romen'а - там всё работает!
Добавлено через 13 минут А теперь я понял, почему у меня не работало! Не надо было понтиться с версией протокола (я поставил 666). Ставим 8 или 11, и всё работает. Пока я бился над своим компонентом, я переделал уже почти всё "по образу и подобию" пакетов ICQ6, а надо было всего лишь поменять одну цифирю. Я благодарен всем, кто пытался дать мне совет или помочь (без этой моральной поддержки я бы ничего не добился). Llirik81, щас повожусь над твоей проблемой... Последний раз редактировалось Tsar_Ioann_XIII; 23.06.2008 в 16:10. Причина: Добавлено сообщение |
Плюсанул Tsar_Ioann_XIII : |
27.06.2008, 11:47 | #233 |
Участник
Регистрация: 15.06.2008
Сообщений: 17
ICQ: 117868 Репутация: 34
|
Llirik81, учёл, что в функциях GetInt, GetLInt и GetStr написано 8100?
__________________
http://progs.volkov.spb.su/ticqclient/ |
Плюсанул Tsar_Ioann_XIII : |
27.06.2008, 13:15 | #234 |
Регистрация: 27.06.2007
Сообщений: 311
ICQ: 888944 |
%)
Вы что, не читаете посты, которые с верху? Ухо ведь написал, что нужно исправлять здесь:
Код:
procedure TICQNet.HandleFlapData(Buffer: Pointer; BufLen: LongWord); Код:
if FNewFlap.DataLen > 998192 then // исправленно с 8192 {Как видите, из продседуры, если размер пакета больше 8192, то вызвать ошибку! Ставим вместо 8192 число, которое намного больше и ошибка не вылетит!} begin if Assigned(OnError) then OnError(Self, ERR_PROTOCOL, ICQLanguages[FErrLang].Translate(IMSG_EPROTO_LEN), IMSG_EPROTO_LEN); FSocket.Disconnect; Exit; end;
__________________
|
Плюсанул bART : |
27.06.2008, 13:31 | #235 | |
Участник
Регистрация: 04.02.2008
Сообщений: 11
Репутация: 1
|
[.BarT], читай внимательнее пожалуйста, я уже указал, что ошибку с размером пакета я исправил указанным методом...
Tsar_Ioann_XIII, сейчас стоит вопрос не о размере пакета, а о том, что у меня вылетает ошибка во фрагмете: Цитата:
|
|
29.06.2008, 14:15 | #236 |
Участник
Регистрация: 15.06.2008
Сообщений: 17
ICQ: 117868 Репутация: 34
|
Ты меня запутал... Она у тебя вылетает именно в ситуации приёма больших пакетов или всегда?
__________________
http://progs.volkov.spb.su/ticqclient/ |
Плюсанул Tsar_Ioann_XIII : |
29.06.2008, 14:24 | #237 |
Участник
|
Llirik81, да у тебя просто приходит не пакет ICQ, успокойся.
в заголовке нет 2A это *, начало любого ICQ-пакета
__________________
Хочешь знать как работает ICQ? Читай документацию по протоколу в OSCAR. |
Плюсанул .fry : |
29.06.2008, 17:14 | #238 |
Участник
Регистрация: 04.02.2008
Сообщений: 11
Репутация: 1
|
Tsar_Ioann_XIII, она у меня вылетает тогда, когда в оффлайне скапливается очень много сообщений и я пытаюсь их вычитать...
.fry, да вот проблема заключается в том, что в ответ на то, что приходит такой пакет компонент отключается от сервера, а если закоментить строку, в которой происходит отключение от сервера, то на следующих пакетах, в случайном порядке начинает вылетать Access Violation... |
01.07.2008, 23:54 | #240 |
Участник
|
kaleostra, а что с ним? ты о чем? %)
Добавлено через 5 минут Хм, я запустил делфю, проверил.. всё компилится, номера выходят в онлайн... Добавлено через 7 минут Llirik81, это "не правильный" пакет, советую переподключиться если получаешь такой пакет, или это повторяется каждый раз?..
__________________
Хочешь знать как работает ICQ? Читай документацию по протоколу в OSCAR. Последний раз редактировалось .fry; 02.07.2008 в 00:01. Причина: Добавлено сообщение |
Плюсанул .fry : |
02.07.2008, 00:16 | #241 |
Участник
|
На крайний случай ;)
кусочками переписанный..
__________________
Хочешь знать как работает ICQ? Читай документацию по протоколу в OSCAR. |
Плюсанул .fry : |
02.07.2008, 12:55 | #242 |
Участник
Регистрация: 02.07.2008
Сообщений: 4
Репутация: 1
|
socks proxy
уважаемые, а есть компонента с рабочей реализацией проксей?
в целом у меня всe работает, но при добавлении прокси висит PHP код:
|
02.07.2008, 13:11 | #243 |
Участник
Регистрация: 11.06.2007
Сообщений: 1
Репутация: 1
|
сори все пашет, у меня просто в компоненте не было ScreenName, а зачем эту переменную ввели?
Только вот что-то не работает ICQClient1.SearchByUIN('...'). .. Последний раз редактировалось ewrrrr; 02.07.2008 в 13:39. |
02.07.2008, 13:40 | #244 |
Участник
|
ewrrrr, в мой TICQClient можно логиниться с AIM-Screen name, что довольно полезно, это единственное отличие..
НО, у меня вообще не работают прокси..
__________________
Хочешь знать как работает ICQ? Читай документацию по протоколу в OSCAR. |
Плюсанул .fry : |
02.07.2008, 14:25 | #245 |
Участник
Регистрация: 15.06.2008
Сообщений: 17
ICQ: 117868 Репутация: 34
|
Так! Для пользователей "козачка" (см. стр. 2):
Перед кодом: Код:
{signon errors} if (T = $8) and (Length(FValue) >= 2) then begin case ord(FValue[2]) of Код:
if (T = $8) and (Length(FValue) >= 2) and (Ord(FValue[2]) = $1C) then begin //do nothing end else
__________________
http://progs.volkov.spb.su/ticqclient/ |
Плюсанул Tsar_Ioann_XIII : |
02.07.2008, 15:20 | #247 |
Участник
Регистрация: 15.06.2008
Сообщений: 17
ICQ: 117868 Репутация: 34
|
Ну уж не знаю, как поэлегантнее... Суть в том, что когда нам пишут TLV(8), а в нём $1C, то мы это не воспринимаем как ошибку, а просто игнорируем.
Кстати, свой TICQClient я переписал - теперь это компонент с сайта "козачок", правленый мною (например очень важно было поменять пакеты при загрузке и их порядок).
__________________
http://progs.volkov.spb.su/ticqclient/ |
Плюсанул Tsar_Ioann_XIII : |
02.07.2008, 16:02 | #248 | |
Участник
Регистрация: 02.07.2008
Сообщений: 4
Репутация: 1
|
Цитата:
|
|
02.07.2008, 16:10 | #249 |
Участник
Регистрация: 04.02.2008
Сообщений: 11
Репутация: 1
|
.fry, рассказываю подробно:
данная проблема всплывает в двух случаях: 1. Ошибочный процесс при авторизации (что решается повторным реконнектом) 2. После подключения при вычитке с сервера оффлайновых сообщений (количеством больше 100). В этом случае компонент делает попытку уйти в глубокий даун... с одной стороны сервер считает, что клиент уже в сети и шлёт ему данные, с другой стороны - компонент ничего не позволяет принимать и отправлять... в лучшем случае он просто выдаёт дисконнект... в худшем - начинает выпихивать Access Violation |
Метки |
delphi, ticqclient |
Опции темы | |
Оценка этой теме | |
|
|