Что нового

Помогите разобраться с работой с ICQ DLL

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Re: ICQ DLL

Ок, пересмотрел исходники и примеры, вот так вроде не вылетает, но у меня почему то постоянно указывает на @error = 1 (ошибка вызова Dll'ки):

Код:
Const $ICQMOD_DLL = @ScriptDir & '\IcqMod.dll'

Const $PROXY_TYPE_SOCKS_4 = 1
Const $PROXY_TYPE_SOCKS_5 = 2

Const $ICQ_CONNECT_STATUS_OK = 0xFFFFFFFF
Const $ICQ_CONNECT_STATUS_RECV_ERROR = 0xFFFFFFFE
Const $ICQ_CONNECT_STATUS_SEND_ERROR = 0xFFFFFFFD
Const $ICQ_CONNECT_STATUS_CONNECT_ERROR = 0xFFFFFFFC
Const $ICQ_CONNECT_STATUS_AUTH_ERROR = 0xFFFFFFFB

Const $ICQ_CLIENT_STATUS_CONNECTED = 1
Const $ICQ_CLIENT_STATUS_DISCONNECTED = 2

Const $stICQ_CLIENT = DllStructCreate("byte status;ushort sequence;ulong sock")
Const $stPROXY_INFO = 0 ;DllStructCreate("ulong ProxyType;ulong ProxyIp;ushort ProxyPort")

;~ DllStructSetData($stPROXY_INFO, "ProxyType", $PROXY_TYPE_SOCKS_4)
;~ DllStructSetData($stPROXY_INFO, "ProxyIp", @IPAddress1)
;~ DllStructSetData($stPROXY_INFO, "ProxyPort", 8080)

$sLogin = 'НОМЕР'
$sPass = 'пароль'

$aRet = DllCall($ICQMOD_DLL, "none", "ICQConnect", _
	"ptr", DllStructGetPtr($stICQ_CLIENT), _
	"char", "login.icq.com", _
	"ushort", 5190, _
	"char", $sLogin, _
	"char", $sPass, _
	"ptr", $stPROXY_INFO)

If Not @error Then
	$vStatus = DllStructGetData($stICQ_CLIENT, "status")
	
	If $vStatus = $ICQ_CLIENT_STATUS_CONNECTED Then
		MsgBox(64, "Status", "Connected!")
	Else
		MsgBox(64, "Status", "Not Connected!")
	EndIf
Else
	MsgBox(16, 'Error', 'DllCall Error (' & @error & ')')
EndIf
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
Re: ICQ DLL

ICQConnect() - возвращает dword, собственно как и все остальные функции из этой dll
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Re: ICQ DLL

Kaster [?]
ICQConnect() - возвращает dword
Какая разница что он возвращает, проблема не в этом, а в том что DllCall не вызывает Dll'ку. Всё ровно возвращаться должен массив, а в нашем случае @error = 1, поэтому массива нет, и нет смысла его даже проверять.
 

Nik_rus

Python The Snake.
Сообщения
214
Репутация
62
Re: ICQ DLL

2 CreatoR: спс, стырил исходник :smile:
Мухаха возрадуйтесь :smile:
Код:
Const $ICQMOD_DLL = 'IcqMod.dll'

Const $PROXY_TYPE_SOCKS_4 = 1
Const $PROXY_TYPE_SOCKS_5 = 2

Const $ICQ_CONNECT_STATUS_OK = 0xFFFFFFFF
Const $ICQ_CONNECT_STATUS_RECV_ERROR = 0xFFFFFFFE
Const $ICQ_CONNECT_STATUS_SEND_ERROR = 0xFFFFFFFD
Const $ICQ_CONNECT_STATUS_CONNECT_ERROR = 0xFFFFFFFC
Const $ICQ_CONNECT_STATUS_AUTH_ERROR = 0xFFFFFFFB

Const $ICQ_CLIENT_STATUS_CONNECTED = 1
Const $ICQ_CLIENT_STATUS_DISCONNECTED = 2

Const $stICQ_CLIENT = DllStructCreate("byte status;ushort sequence;ulong sock")
Const $stPROXY_INFO = 0 ;DllStructCreate("ulong ProxyType;ulong ProxyIp;ushort ProxyPort")

;~ DllStructSetData($stPROXY_INFO, "ProxyType", $PROXY_TYPE_SOCKS_4)
;~ DllStructSetData($stPROXY_INFO, "ProxyIp", @IPAddress1)
;~ DllStructSetData($stPROXY_INFO, "ProxyPort", 8080)

$sLogin = 'UIN'
$sPass = 'password'

$aRet = DllCall($ICQMOD_DLL, "dword", "ICQConnect", _
    "ptr", DllStructGetPtr($stICQ_CLIENT), _
    "str", "login.icq.com", _
    "word", "5190", _
    "str", $sLogin, _
    "str", $sPass, _
    "ptr", $stPROXY_INFO)

If Not @error Then
    $vStatus = DllStructGetData($stICQ_CLIENT, "status")
    
    If $vStatus = $ICQ_CLIENT_STATUS_CONNECTED Then
        MsgBox(64, "Status", "Connected!")
    Else
        MsgBox(64, "Status", "Not Connected!")
    EndIf
Else
    MsgBox(16, 'Error', 'DllCall Error (' & @error & ')')
EndIf



Добавлено:
Сообщение автоматически объединено:

Кхм у меня такой вопрос:
Код:
function ICQReadMsg(var client : ICQ_CLIENT; UIN : PAnsichar; msg : PAnsichar; var msglen : integer) : dword; stdcall; external ICQMOD_DLL; 

Проверка на сообщение. 
client - описание состояния 
UIN - адрес буфера куда будет помещен UIN человека от которого пришло сообщение. желательно чтобы был 10 байт. 
msg - адрес буфера куда будет записано сообщение. 
msglen - переменная в которую будет записана длинна сообщения. 

Функция возвращает: 
0 - сообщения нет 
1 - сообщение получено. 

Данная функция извлекает данне из сокета если они есть. И если это сообщение то парсит его.
А как собственно взять UIN, msg?
 

SECTOR

Продвинутый
Сообщения
399
Репутация
59
Re: ICQ DLL

[box title=ЗЫ]Плиз выложите на другой ресурс, а то ссылка не открывается[/box]
 

ynbIpb

Скриптер
Сообщения
399
Репутация
110
Re: ICQ DLL

Seen, что Дллку? IcqMod.rar
з.ы.

классно, уже работает. конектится и отправляет месаги.
набросал небольшой шаблон клиента
Код:
#NoTrayIcon
#include <GUIConstants.au3>
#include <EditConstants.au3>
#include <WindowsConstants.au3>
#include <ICQ.au3> ; для работы с ДЛЛкой

If Not FileExists (@ScriptDir & "\ICQ_Client.ini") Then
$ini_file = FileOpen (@ScriptDir & "\ICQ_Client.ini", 2)
FileWrite ($ini_file, "[settings]"&@CRLF&"server=login.icq.com:5190"&@CRLF&"uin="&@CRLF&"pass="&@CRLF _ 
&"master="&@CRLF&"[proxy]"&@CRLF&"enable=0"&@CRLF&"adddres="&@CRLF&"type=")
FileClose ($ini_file)
EndIf
$ICQ_Client_ini = @ScriptDir & "\ICQ_Client.ini"
$icq_server = IniRead ($ICQ_Client_ini, "settings", "server", "")
$uin = IniRead ($ICQ_Client_ini, "settings", "uin", "")
$pass = IniRead ($ICQ_Client_ini, "settings", "pass", "")
$master = IniRead ($ICQ_Client_ini, "settings", "master", "")

$status = ICQConnect($icq_server, $uin, $pass)

$Form1 = GUICreate("ICQ Client v.0.1", 305, 209, 511, 167)
$Edit1 = GUICtrlCreateEdit("", 12, 8, 281, 89, BitOR ($ES_AUTOVSCROLL, $ES_READONLY, $WS_VSCROLL))
GUICtrlSetData ($Edit1, "System: Status - "&$status&@CRLF, 1)
$Edit2 = GUICtrlCreateEdit("", 8, 104, 285, 53,BitOR ($ES_AUTOVSCROLL, $ES_WANTRETURN, $WS_VSCROLL) )
$Button1 = GUICtrlCreateButton("Send", 212, 172, 75, 25, 0)
GUISetState(@SW_SHOW)

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			ICQClose()
			Exit
        Case $Button1
			_sendICQMSG()
	EndSwitch
; проверка входящих сообщений в цикле
$ICQ_msg = ICQReadMsg()
if $ICQ_msg<>0 Then
if $ICQ_msg[0] = $master Then
GUICtrlSetData ($Edit1, $ICQ_msg[0]&": "&$ICQ_msg[1]&@CRLF, 1)
EndIf
EndIf
WEnd

Func _sendICQMSG()
$ICQmessage = GUICtrlRead ($Edit2)
If $ICQmessage = "" Then
	GUICtrlSetData ($Edit1, "System: nothing to send!"&@CRLF, 1)
	GUICtrlSetState ($Edit2, $GUI_FOCUS)
	Return
EndIf
$ICQmessageBin = StringToBinary($ICQmessage, 4); преобразуем в UTF-8
$ICQmessageUtf = BinaryToString ($ICQmessageBin , 1)
ICQSendMsg($master,$ICQmessageUtf)
GUICtrlSetData ($Edit2, ""); очищаем поле ввода
GUICtrlSetData ($Edit1, "You: "&$ICQmessage&@CRLF, 1); записываем в историю
GUICtrlSetState ($Edit2, $GUI_FOCUS)
EndFunc
 

Nik_rus

Python The Snake.
Сообщения
214
Репутация
62
Re: ICQ DLL

А вот и либа ICQ.au3
Коннектит ICQ.dll
Код:
#include <ICQ.au3>

Все те же функции что и в DLL
Код:
ICQConnect($server,$login,$password) - войти и залогиниться
ICQClose() - разлогиниться
ICQSendMsg($to,$msg) - посладь сообщение
ICQReadMsg() - Просмотр входящих сообщений (удобно в цикле)
ICQAuth($who,$auth) - авторизировать контакт ($auth = $AUTH_OK или $AUTH_NO)
ICQAskAuth($who,$msg) - запросить авторизацию и аргументировать это $msg'ом :)
 

Guezt

Продвинутый
Сообщения
335
Репутация
82
Re: ICQ DLL

Если не сложно... простой пример, как принять и обработать сообщение и как авторизовать контакт? ...как то не смог разобраться :(
 

ynbIpb

Скриптер
Сообщения
399
Репутация
110
Re: ICQ DLL

так в моём сообщении есть пример приёма (я дополнил)
Код:
$ICQ_msg = ICQReadMsg()
if $ICQ_msg<>0 Then
if $ICQ_msg[0] = $master Then
GUICtrlSetData ($Edit1, $ICQ_msg[0]&": "&$ICQ_msg[1]&@CRLF, 1)
EndIf
EndIf

тоесть тут если вернулся ноль, то нет сообщения, если не ноль, то вернулся массив из двух элементов: 0- уин, 1 - сообщение
 

Nik_rus

Python The Snake.
Сообщения
214
Репутация
62
Re: ICQ DLL

(Пишу с телефона, сильно не пинать)
все очень просто:
Код:
$status = ICQConnect("login.icq.com:5190","UIN","password") ; подключаемся...
MsgBox(0,"Info","Status: " & $status)
ICQAskAuth("UIN","Auth :)") ; просим контакт нас афторизировать
Sleep(10000)
ICQAuth("UIN") ; и дополнительно сами его афторайзим
ICQSendMsg("UIN","Message") ; собсно месаг
$online = 1
while $online = 1
$msg = ICQReadMsg() ; читаем входящие сообщения
if $msg<>0 Then
ICQSendMsg($msg[0],"[ " & $msg[0] & " ]: " & $msg[1]) ; шлем присланный месаг
$online = 0
EndIf
ICQClose() ; закрываем...
 

Guezt

Продвинутый
Сообщения
335
Репутация
82
Re: ICQ DLL

CreatoR сказал(а):
У меня по прежнему DllCall возвращает @error = 1.

я тоже как не пытался у меня тоже самое выдавало...
добавил в твой пример это:
Код:
#include <Array.au3>

вроде заработало, хотя уже не могу сказать точно, как заработало все это :wacko:
 

Nik_rus

Python The Snake.
Сообщения
214
Репутация
62
Re: ICQ DLL

Юзайте либу мою либу ICQ.au3, у меня все работает, читает и отправляет месаги :smile:
 

ynbIpb

Скриптер
Сообщения
399
Репутация
110
Re: ICQ DLL

CreatoR [?]
Кто я?
undecided.gif
Он в первом сообщений выложен.
Он имел ввиду что повзаимствовал твой исходник (пример)
У меня тоже какието сомнительные дела работает тока в Бэте: 3.3.1.6
В 3.3.0.0 - ошибка вызова ДЛЛ
 

Guezt

Продвинутый
Сообщения
335
Репутация
82
Re: ICQ DLL

ynbIpb сказал(а):
У меня тоже какието сомнительные дела работает тока в Бэте: 3.3.1.6
В 3.3.0.0 - ошибка вызова ДЛЛ

Тоже может быть, но я поставил между этим делом версию 3.3.2.0 финал релиз :smile:
 

Nik_rus

Python The Snake.
Сообщения
214
Репутация
62
Re: ICQ DLL

У меня AutoIt v3.3.2.0...
В Extras есть AutoUpdateIt - юзаю с параметром /release, недавно скачал новую версию...


Добавлено:
Сообщение автоматически объединено:

А вот и кое-что новенькое :smile:
ICQ.au3 0.2 - вправлены соксы, маленькие баги исправлены
Код:
ICQConnect('login.icq.com:5190','UIN','password','proxy_ip:proxy_port',$PROXY_TYPE_SOCKS_4)
$PROXY_TYPE_SOCKS_4 - Socks прокси 4
$PROXY_TYPE_SOCKS_5 - и 5 соответственно
Дабы не было трабл, выкладываю архив:
Код:
ICQ.au3 - библиотека для AutoIt
ICQ.dll - DLL библиотека
client.au3 - немного помоденый мною клиент от [url=http://autoit-script.ru/index.php?action=profile;u=14]ynbIpb[/url]
test.au3 - мини-тест, показывающий основные функции
 

ynbIpb

Скриптер
Сообщения
399
Репутация
110
Re: ICQ DLL

Updated Client.
Добавлено:
- постоянные попытки подключение каждые 10 сек, если не подключается.
- обнаружение дисконекта во время работы и подключение снова.
советы по оптимизации приветствуются!
Код:
#NoTrayIcon
#include <GUIConstants.au3>
#include <EditConstants.au3>
#Include <GuiEdit.au3>
#include <WindowsConstants.au3>
#include <ICQ.au3> ; для работы с ДЛЛкой
$begin = 0 ; переменная таймера

If Not FileExists (@ScriptDir & "\ICQ_Client.ini") Then
	$ini_file = FileOpen (@ScriptDir & "\ICQ_Client.ini", 2)
	FileWrite ($ini_file, "[settings]"&@CRLF&"server=login.icq.com:5190"&@CRLF&"uin="&@CRLF&"pass="&@CRLF _ 
	&"master="&@CRLF&"[proxy]"&@CRLF&"enable=0"&@CRLF&"adddres="&@CRLF&"type=")
	FileClose ($ini_file)
EndIf
$ICQ_Client_ini = @ScriptDir & "\ICQ_Client.ini"
$icq_server = IniRead ($ICQ_Client_ini, "settings", "server", "")
$uin = IniRead ($ICQ_Client_ini, "settings", "uin", "")
$pass = IniRead ($ICQ_Client_ini, "settings", "pass", "")
$master = IniRead ($ICQ_Client_ini, "settings", "master", "")

$status = ICQConnect($icq_server, $uin, $pass,0)
If $status = 0 Then $begin = TimerInit()
$online = DllStructGetData ($stICQ_CLIENT, "status")

$Form1 = GUICreate("ICQ Client v.0.1", 640, 480)
$Edit1 = GUICtrlCreateEdit("", 8, 8, 623, 427, BitOR ($ES_AUTOVSCROLL, $ES_READONLY, $WS_VSCROLL))
GUICtrlSetData ($Edit1, "System: Status - "&$status&" "&$online&@CRLF, 1)
$Edit2 = GUICtrlCreateEdit("", 8, 445, 524, 27,BitOR ($ES_AUTOVSCROLL, $ES_WANTRETURN, $WS_VSCROLL) )
$Button1 = GUICtrlCreateButton("Send", 543, 445, 88, 27, 0)
GUISetState(@SW_SHOW)

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
		Case $GUI_EVENT_CLOSE
			ICQClose()
            Exit
        Case $Button1
            _sendICQMSG()
	EndSwitch
$otvett = __ReadMsg()
If  $otvett <> "" Then GUICtrlSetData ($Edit1, $otvett&@CRLF, 1)
WEnd

Func _sendICQMSG()
$ICQmessage = GUICtrlRead ($Edit2)
If $ICQmessage = "" Then
    GUICtrlSetData ($Edit1, "System: nothing to send!"&@CRLF, 1)
    GUICtrlSetState ($Edit2, $GUI_FOCUS)
    Return
EndIf
$ICQmessageBin = StringToBinary($ICQmessage, 4); преобразуем в UTF-8
$ICQmessageUtf = BinaryToString ($ICQmessageBin , 1)
ICQSendMsg($master,$ICQmessageUtf)
GUICtrlSetData ($Edit2, ""); очищаем поле ввода
GUICtrlSetData ($Edit1, "You: "&$ICQmessage&@CRLF, 1); записываем в историю
GUICtrlSetState ($Edit2, $GUI_FOCUS)
EndFunc

Func __ReadMsg()
    If $status = 0 Then
		If TimerDiff($begin) >= 10000 Then
			$status = ICQConnect($icq_server, $uin, $pass,0)
			If $status = 0 Then
				$begin = TimerInit()
				Return "System: could not connect!"
			Else
				Return "System: connected!"
			EndIf
		EndIf
	EndIf
	If DllStructGetData ($stICQ_CLIENT, "status") = 1 Then
		$sMsg = ICQReadMsg()
		If $sMsg<>0 Then
			If $sMsg[0] = $master Then
				$otvet = "Master: "&$sMsg[1]
				Return $otvet
			EndIf
		EndIf
	ElseIf $status = 1 Then
		$status = 0
		Return "Disconnected!"
	EndIf
	Return ""
EndFunc
 

Guezt

Продвинутый
Сообщения
335
Репутация
82
Re: ICQ DLL

Ну можно добавить кнопку с параметрами либо в скрипт либо в .ini файл вкл\выкл преобразование в UTF-8

Код:
Global $sToUTF
$sToUTF = 1 ; 1-выкл 0-вкл

$Button2 = GUICtrlCreateButton("UTF",,,,, 0) ; кнопка вкл\выкл UTF-8 


Case $Button2
	if $sToUTF = 0 Then
		$sToUTF = 1
		$labelUTF = GUICtrlCreateLabel("UTF On",,,,, 0) 
	Else 
		$sToUTF =0
	    $labelUTF = GUICtrlCreateLabel("UTF Off",,,,, 0)
	EndIf


    if $sToUTF = 1 then
       $ICQmessageBin = StringToBinary($ICQmessage, 4); преобразуем в UTF-8
       $ICQmessageUtf = BinaryToString ($ICQmessageBin , 1)
	   ICQSendMsg($master,$ICQmessageUtf)
    Else
	ICQSendMsg($master,$ICQmessage)
    EndIf


:smile:
 

ynbIpb

Скриптер
Сообщения
399
Репутация
110
Re: ICQ DLL

Поднимаю тему.
Возникла проблема: на версии AutoIt 3.3.2.0 Dll с UDF работают изумительно. Но вот попробовал на AutoIt 3.3.4.0 и при подключении через секунду сразу дисконектит бота от сервера.
Хотелось бы разобраться в причине, так как надо идти в ногу со временем и использовать свежие версии.
Кто что думает по этому поводу?
 

Guezt

Продвинутый
Сообщения
335
Репутация
82
Re: ICQ DLL

ynbIpb
странно у меня работают проверил UDF с ICQ.dll на версии 3.3.4.0
 
Верх