AlexADM | Дата: Пятница, 18.11.2011, 04:21 | Сообщение # 1 |
Новичок
Зарегистрирован: 18.11.2011
Группа: Пользователи
Сообщений: 3
Статус: Offline
| Доброго время суток форумчани. Ситуация такая, начну самого начала нужно в советник Метатрайдера (Клиент для рынка FOREX, язык для написание скриптов, торговых экспертов - MQL4 ) в эксперта вставить возможность отправку на аську информацию и получение её . MQL подержует импорт с dll. Нашел компонюху ICQClient. Вроде как сделал прием и отсылку без размещения на форме компонента (может и криво, ну как сумел) код ниже, осталось малое нужно класс запихать в DLL, вместо procedure TForm1.Button1Click(Sender: TObject) – экспортируемые функций. Создал модуль для dll вставил все ну за исключением формы (TForm1 = class(TForm) и т.д.), начал ругаться компилятор на var ICQClient:TMYICQ; Вопросов не сколько. Это реально, сможет ICQClient работать из DLL, если да то как правильно подправить? Класс TMYICQ = class(TICQClient) делал сам посмотрите, пожалуйста может как то можно лучше его составить где то подправить, к примеру глобальная переменная S для вывода сообщения, мне не нравится ну пока не придумал как её лучше заменить (опыта мало, даже простые задачи не сразу вижу). В принципе в такую ДЛЛку можно вложить нужный функционал и грузить с тем же винлогоном и асю использовать как терминал.
Заранее всем спасибо!!! Если кто заинтересуется сделать подобное, потестить или просто так ссылка на компонент ICQClient http://sourceforge.net/projects/ticqlib/ сайт автора компонента http://www.cobans.net. К компоненту идёт в придачу русский и английский хелп.
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs,ICQClient,ICQWorks, StdCtrls, ExtCtrls; type TMYICQ = class(TICQClient) private { Private declarations } public F:Boolean; s:String; procedure Login(Sender: TObject);overload; procedure ActiveICQ(PConvertToPlaintext:Boolean;PICQServer,PPassword,PUIN:String;PICQPort: Word) ; function outICQ (Msg,UIN: String):string; procedure MessageRecv(Sender: TObject; Msg,UIN: String); procedure ConnectionFailed(Sender: TObject); procedure Error(Sender: TObject; ErrorType: TErrorType;ErrorMsg: String); { Public declarations } end; var ICQClient:TMYICQ; Type // Если вставлять в ДЛЛ убрать TForm1 = class(TForm) Button1: TButton; Memo1: TMemo; Button2: TButton; Timer1: TTimer; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure Conect(Login,Pass:String); begin ICQClient:=TMYICQ.Create(ICQClient); ICQClient.OnMessageRecv:=ICQClient.MessageRecv; ICQClient.OnLogin:=ICQClient.Login; ICQClient.OnError:=ICQClient.Error; ICQClient.ActiveICQ(true,'login.icq.com',Pass,Login,5190); end; procedure MesedgOUT (UIN,Msg:String); begin if ICQClient.F then ICQClient.outICQ(Msg,UIN) ; end; {function MesedgIn ():String;//Нормально не работает begin Result:=''; if ICQClient <> nil then begin if ICQClient.s <> then Result:=ICQClient.s; end; end;} function TMYICQ.outICQ (Msg,UIN: String):string; begin if (not ICQClient.LoggedIn) then // если не залогинились begin MessageBox(0, 'Please, login before sending a message', 'Ошибка конекта', MB_ICONERROR); Exit; end; ICQClient.SendMessage(StrToInt(UIN), Msg);// послать сообщение end; procedure TMYICQ.ActiveICQ(PConvertToPlaintext:Boolean;PICQServer,PPassword,PUIN:String;PI CQPort:Word) ; begin ICQClient.ConvertToPlaintext:=PConvertToPlaintext; ICQClient.ICQServer:=PICQServer; ICQClient.ICQPort:=PICQPort; ICQClient.Password:=PPassword; ICQClient.UIN:=StrToInt(PUIN); ICQClient.Login; end; procedure TMYICQ.Login(Sender: TObject); begin f:=True; end; procedure TMYICQ.MessageRecv(Sender: TObject; Msg,UIN: String);//события возникает когда приходит сообщение begin s:=''; s:=UIN+': '+Msg; end; procedure TMYICQ.ConnectionFailed(Sender: TObject); begin s:=''; s:='Не могу подключиться к ICQ серверу либо сервер вас отключил по другим причинам'; end; procedure TMYICQ.Error(Sender: TObject; ErrorType: TErrorType;ErrorMsg: String); begin s:=''; if ErrorType = ERR_WARNING then s:='Warning: ' + ErrorMsg else s:='Error: ' + ErrorMsg; end; procedure TForm1.Button1Click(Sender: TObject); begin Conect('Логин', 'Пароль'); end; procedure TForm1.Button2Click(Sender: TObject); begin MesedgOUT('Номер АСЬКИ',Сообщение) end; end.
|
|
| |
dolphin | Дата: Суббота, 19.11.2011, 12:50 | Сообщение # 2 |
Администратор
Сообщений: 906
Статус: Offline
| Реализовать то можно, но вопрос в том подхватит ли ваша программа Делфовскую dll, сама программа на каком языке написана? Если не на делфи скорее всего могут быть проблемы с совместимостью.
Система: Windows 10 x64, Kali Linux Среды программирования: Delphi 7, Delphi 10.x
Я не профессионал, я всего лишь любитель Я не вредитель, я всего лишь теоретик
|
|
| |
AlexADM | Дата: Воскресенье, 20.11.2011, 23:00 | Сообщение # 3 |
Новичок
Зарегистрирован: 18.11.2011
Группа: Пользователи
Сообщений: 3
Статус: Offline
| Скорее всего на с++
|
|
| |