Технология создания плагинов и программ-дополнений

Здесь обсуждаются графические оболочки, боты, языковые файлы и другие дополнения к CommFort 4.
Аватара пользователя
HukpoFuJl
Сообщения: 90
Зарегистрирован: 15:29, 17.10.2008
Откуда: Белaрусь, Гомель
Контактная информация:

Re: Технология создания плагинов и программ-дополнений

Сообщение HukpoFuJl »

О, отлично, доходчиво объяснил, спасиб огромное :)
Кстать,
Потом сам текст (длина + текст)
12 - длина текста - 18 байт
Далее 18 байт этого текста 28 30 5F EE 29 20 E3 E0 EC E0 F1 FF F7 E5 F1 F2 E2 EE (это (0_о) гамасячество)
Это не сам текст. а название канала :)

Сам текст (Длина + текст)
03 - длина текста - 3 байта
Далее 3 байта этого текста 31 32 33 (это 123)

Ещё раз спасибо, не ожидал так быстро добиться добиться подробного объяснения :)

ЗЫ: как я понял промежутки в виде 00 00 00 - это пропуски =)
              Последний раз редактировалось HukpoFuJl 11:25, 29.08.2010, всего редактировалось 1 раз.
              ~Alien~
              Сообщения: 39
              Зарегистрирован: 19:47, 22.01.2010

              Re: Технология создания плагинов и программ-дополнений

              Сообщение ~Alien~ »

              ZigZagkms наверное нельзя найти через функцию FindWindowEx окно именно того канала, который вам нужен. Так как оно не имеет названия. Видимо -=SJ=- просто проверяет с помощью спец. функции CommFortGetData активный на данный момент канал.
              ЗЫ: как я понял промежутки в виде 00 00 00 - это пропуски =)
              Нет. Просто длина текста должна быть представлена 4 байтами. Например, 05 00 00 00 (длина текста). Вот из-за этого и появляются эти нолики.
              Аватара пользователя
              HukpoFuJl
              Сообщения: 90
              Зарегистрирован: 15:29, 17.10.2008
              Откуда: Белaрусь, Гомель
              Контактная информация:

              Re: Технология создания плагинов и программ-дополнений

              Сообщение HukpoFuJl »

              ~Alien~ писал(а):Нет. Просто длина текста должна быть представлена 4 байтами. Например, 05 00 00 00 (длина текста). Вот из-за этого и появляются эти нолики.
              Кхм, тоесть сумма dec значений hex последовательности 4 байт? т.е.
              05 00 00 00 = 5 + 0 + 0 + 0 = 5

              Я правильно понял?
              ZigZagkms
              Сообщения: 109
              Зарегистрирован: 08:23, 11.12.2008
              Откуда: Комсомольск-на-Амуре
              Контактная информация:

              Re: Технология создания плагинов и программ-дополнений

              Сообщение ZigZagkms »

              HukpoFuJl писал(а):Кхм, тоесть сумма dec значений hex последовательности 4 байт? т.е.
              05 00 00 00 = 5 + 0 + 0 + 0 = 5

              Я правильно понял?
              Не совсем так, для того чтобы перевести число 05 00 00 00 (представим в виде 0 5 0 0 0 0 0 0 и умножая каждое число на 10 в степени позиции числа с правой стороны) в десятичное:

              (0 *10^8) + (5 *10^7) + (0 * 10^6) + (0 * 10^5) + (0 * 10^4) + (0 * 10^3) + (0 * 10^2) + (0 * 10^1) = 5

              Используя ваш неверный способ максимальное число (FF FF FF FF) которое возможно передать (FF + FF + FF + FF = 1020)
              На самом же деле максимальное 32 разрядное число - 4 294 967 295 (умещается в 4 байта)

              upd: что то я тут напутал) вообщем неверно сказал =)
              Последний раз редактировалось ZigZagkms 11:20, 02.02.2010, всего редактировалось 2 раза.
              Забросил, всем спасибо, исходники раздаю кому надо https://github.com/ZigZagkms
              Аватара пользователя
              -=SJ=-
              Сообщения: 246
              Зарегистрирован: 02:21, 06.04.2007

              Re: Технология создания плагинов и программ-дополнений

              Сообщение -=SJ=- »

              В дополнение к своему предыдущему посту (о том как встроить окно плагина в чат) выкладываю исходник с комментариями на Delphi.
              В этом примере создается простая форма, которая привязывается к определенному каналу (канал sticky) и просто кнопка, которая размещается на главной форме чата.
              Sticky.zip
              (232.38 КБ) 367 скачиваний
              Аватара пользователя
              HukpoFuJl
              Сообщения: 90
              Зарегистрирован: 15:29, 17.10.2008
              Откуда: Белaрусь, Гомель
              Контактная информация:

              Re: Технология создания плагинов и программ-дополнений

              Сообщение HukpoFuJl »

              Так, с получением сообщений от коммфорта разгрёбся... Назрел новый вопрос: Как их отсылать коммфорту?

              Попробовал по обратному принципу, от принципа получения сообщения:
              Например: ID: 100 (публикация в Events) Блок данных: число(стиль)+число(время)+число(тип протоколирования)+текст(текст публикации)

              Код: Выделить всё

                            кол-во символов в тексте v
                     0х(64 00 00 00) (00) (00) (01) (03) (2B 2B 2B)
              ID события^        стиль^время^   ^протоколир. ^текст
              
              Вроде всё правильно, отправляю строку 0х64000000000001032B2B2B и ничего не происходит :(
              Где я ошибся?


              UPD: Заметил, что отсылаемый ботом код бот сам и принимает :( Может я не туда его просто шлю??
              Аватара пользователя
              -=SJ=-
              Сообщения: 246
              Зарегистрирован: 02:21, 06.04.2007

              Re: Технология создания плагинов и программ-дополнений

              Сообщение -=SJ=- »

              HukpoFuJl писал(а):Так, с получением сообщений от коммфорта разгрёбся... Назрел новый вопрос: Как их отсылать коммфорту?

              Попробовал по обратному принципу, от принципа получения сообщения:
              Например: ID: 100 (публикация в Events) Блок данных: число(стиль)+число(время)+число(тип протоколирования)+текст(текст публикации)

              Код: Выделить всё

                            кол-во символов в тексте v
                     0х(64 00 00 00) (00) (00) (01) (03) (2B 2B 2B)
              ID события^        стиль^время^   ^протоколир. ^текст
              
              Вроде всё правильно, отправляю строку 0х64000000000001032B2B2B и ничего не происходит :(
              Где я ошибся?


              UPD: Заметил, что отсылаемый ботом код бот сам и принимает :( Может я не туда его просто шлю??
              Нет не правильно любое числовое значение в отправляемом сообщении должно быть 4х байтным

              Код: Выделить всё

                            кол-во символов в тексте v
                     0х(64 00 00 00) (00 00 00 00) (00 00 00 00) (01 00 00 00) (03 00 00 00) (2B 2B 2B)
              ID события^        стиль^        время^                ^протоколир. ^текст
              
              Аватара пользователя
              HukpoFuJl
              Сообщения: 90
              Зарегистрирован: 15:29, 17.10.2008
              Откуда: Белaрусь, Гомель
              Контактная информация:

              Re: Технология создания плагинов и программ-дополнений

              Сообщение HukpoFuJl »

              Да, я это заметил почти сразуже, ток в посте исправить не успел...
              Всё равно одна и таже хрень, отправляю коммфорту строку 0x64000000000000000000000001000000030000002B2B2B. А ему как горохом в стену... Бот принимает свойже пакет, а коммфорт нет... Попробовал открыть на коммфорте ещё один порт отдельно, по которому мой бот не принимает сообщения... Отправляю строку на этот порт - результат тотже =(( никакого эффекта...
              Аватара пользователя
              -=SJ=-
              Сообщения: 246
              Зарегистрирован: 02:21, 06.04.2007

              Re: Технология создания плагинов и программ-дополнений

              Сообщение -=SJ=- »

              HukpoFuJl писал(а):Да, я это заметил почти сразуже, ток в посте исправить не успел...
              Всё равно одна и таже хрень, отправляю коммфорту строку 0x64000000000000000000000001000000030000002B2B2B. А ему как горохом в стену... Бот принимает свойже пакет, а коммфорт нет... Попробовал открыть на коммфорте ещё один порт отдельно, по которому мой бот не принимает сообщения... Отправляю строку на этот порт - результат тотже =(( никакого эффекта...
              Во первых порт бота на который бот принимает пакеты и с которого отправляет должен быть одним и тем же.
              Во вторых слать сообщение надо на тот порт коммфорта с которого было принято сообщение от него. т.е. этот порт не задан фиксированно и от подключения к подключению может меняться, поэтому его надо определять программно.
              Аватара пользователя
              HukpoFuJl
              Сообщения: 90
              Зарегистрирован: 15:29, 17.10.2008
              Откуда: Белaрусь, Гомель
              Контактная информация:

              Re: Технология создания плагинов и программ-дополнений

              Сообщение HukpoFuJl »

              Блин, суть я понял, спасибо :) То-то я тоже думал, как могут приложения вдвоём на одном порту работать нормально :)))
              Но всё равно меня тупит по ужасу...
              Пишу на AutoIT, эт скриптовый язык, по сути до ужоса упрощённый С...

              В общем функции обработки UDP там такие:
              ======================================
              UDPBind
              Создать UDP сокет, связанный со входящим подключением.
              Синтаксис: UDPBind ( $IPAddr, $port )

              Параметры:
              $IPAddr - Адрес протокола интернет (Internet Protocol -IpV4) в виде "192.162.1.1".
              $port - номер порта, соответствующего открываемому сокету.

              Возвращаемое значение:
              Идентификатор главного сокета. В случае ошибки возвращается -1, а значение @error устанавливается равным номеру ошибки согласно Windows API функции WSAGetLasterror.

              ======================================
              UDPOpen
              Открыть сокет, соответствующий подключению к имеющемуся серверу.
              Синтаксис: UDPOpen ( $IPAddr, $port )

              Параметры такиеже как и в UDPBind

              Возвращаемое значение:
              Массив array, в котором $array[1] равен реальному сокету, $array[2] - указанный IP адрес, а $array[3] - порт. Эта информация требуется в последующих вызовах UDPSend(). В случае ошибки массив array, в котором $array[1] равен -1, а значение @error устанавливается равным номеру ошибки согласно Windows API функции WSAGetLasterror.

              Замечания:
              Используется обмена данными приложения-клиента с сервером.

              ======================================
              UDPRecv
              Получить данные, используя открытый ранее сокет
              Синтаксис: UDPRecv ( $socket, $maxlen )

              Параметры:
              $socket - Главный идентификатор сокета (SocketID), возвращаемый функцией UDPBind.
              $maxlen - Максимальное число получаемых символов

              Возвращаемое значение:
              Строка данных, переданных через сокет. В случае ошибки возвращается пустая строка "", а значение @error устанавливается равным номеру ошибки согласно Windows API функции WSAGetLasterror.

              ======================================
              UDPSend
              Выслать данные, используя открытый ранее сокет
              Синтаксис: UDPSend ( $socket, $data )

              Параметры:
              $socket - Главный идентификатор сокета (SocketID), возвращаемый функцией UDPOpen.
              $data - Содержание строки передаваемого текста или бинарной строки в сокет подключения

              Возвращаемое значение:
              Количество переданных через сокет данных. В случае ошибки возвращается 0, а значение @error устанавливается равным номеру ошибки согласно Windows API функции WSAGetLasterror.
              ======================================
              Ну это в кратце нужные функции...

              В общем делаю(в кратце):

              $bindport = UDPBind (127.0.0.1, 16770) ;открываю порт для приёма данных.
              $openport = UDPOpen (127.0.0.1, 16770) ;получаю массив из: $openport[1] = порт по которому коммфорт отправляет данные, $openport[2] = !Р адрес, $openport[3] = порт по которому я отсылаю данные(16770)

              $datarecive = UDPRecv ($bindport, 100000) ;запрос на получение данных (у меня он в цикле)

              ; $datarecive = строка отправляемая коммфортом...
              ; далее бла-бла-бла, тело программы...
              ; и потом выполнение отсылки готового кода $datasend

              UDPSend ($openport[1], $datasend)

              ;в результате 0 эффекта, $datasend имеет правильный формат, всё по госту короче :) Но коммфорт молчит, хотьбы ошибку выдал чтоли...

              Спасите заблудшую душу :oops:
                          Последний раз редактировалось HukpoFuJl 11:28, 29.08.2010, всего редактировалось 1 раз.
                          Maxim Mirgorodsky
                          Администратор
                          Сообщения: 6869
                          Зарегистрирован: 09:56, 27.06.2005

                          Re: Технология создания плагинов и программ-дополнений

                          Сообщение Maxim Mirgorodsky »

                          При подключении к серверу CommFort client отправляет всем программам-дополнениям первый пакет по которому можно узнать адрес (порт), по которому необходимо слать сообщения CommFort'у. При этом отправлять сообщения необходимо строго с того адреса (и порта), который указан в UDPAddons.ini.
                          DeBugger
                          Сообщения: 3
                          Зарегистрирован: 22:54, 13.02.2010
                          Откуда: Оттуда
                          Контактная информация:

                          Re: Технология создания плагинов и программ-дополнений

                          Сообщение DeBugger »

                          Я просмотрел всю тему, но что то не нашел ни одного примера не дельфе, который реализовывал бы простейшего UPD бота. Ткните носом пожалуйста, если я пропустил

                          Добавлено:
                          Какбэ мне бы только саму работу с UDP а то не компилится не один пример. Среда Delphi 2009
                          DeBugger
                          Сообщения: 3
                          Зарегистрирован: 22:54, 13.02.2010
                          Откуда: Оттуда
                          Контактная информация:

                          Re: Технология создания плагинов и программ-дополнений

                          Сообщение DeBugger »

                          ~Alien~ писал(а):Вот http://www.commfort.com/ru/forum/viewto ... 6&start=45. Предпоследний пост от dv.
                          Собственно, UDP.pas оттуда и не компилится =)

                          http://s002.radikal.ru/i198/1002/d7/79eecbb001a9.png
                          Аватара пользователя
                          dv
                          Сообщения: 1845
                          Зарегистрирован: 10:28, 11.05.2007
                          Откуда: Краснодар

                          Re: Технология создания плагинов и программ-дополнений

                          Сообщение dv »

                          [Сообщение yдалено]
                          Последний раз редактировалось dv 19:05, 25.06.2012, всего редактировалось 1 раз.
                          Дополнения для CommFort
                          Адрес чата: chat.telered.ru




                          .
                          Закрыто