casa
Top.Mail.Ru Yandeks.Metrika
Forum: "Principale";
Archivio attuale: 2002.01.08;
Scarica: [xml.tar.bz2];

giù

Richiama Trova rami simili


Eugene Zelikovsky   (2001-12-14 13:58) [0]

Народ пожалуйста объясните как работать с CallBack.
Общение Dll с прогой.
Если можно кусочек кода.
Grazie!



Eugene Zelikovsky   (2001-12-14 14:52) [1]

AIUTO!!



Digitman   (2001-12-14 14:54) [2]

Ну я ж тебе уже дал фрагмент, иллюстрирующий, как подключить свой обработчик событий к компоненту, создаваемому в DLL ! Чем тебе обработчик событий не Callback ?



Eugene Zelikovsky   (2001-12-14 16:09) [3]

Нет твой совет не заработал :(... EventHendlr не перадется.... может всетаки про CallBackи расскажите ....



Digitman   (2001-12-14 16:14) [4]

а это и есть CallBack !!!!!!!!!!!!!!!!!!!!
то, что у тебя чего-то там куда-то "не передается", это - твое недопонимание механизма назначения обработчиков событий. и всего-то. а ты сразу - "не передается")))))))))) Да все замечательно передается !)) Ищи ошибку у себя.



Eugene Zelikovsky   (2001-12-14 16:22) [5]

Upss....
Ладно понял ... :) callback ... хорошо... тогда вопрос!
То что ты тогда написал .... про dll-ую часть я понял .. да правлно она работает....она в EventHendler передает адресс.... ОК
Но вот с программой заминка... по подробней можно? То что у тебя написанно ... никак не воспринимает EventHendler .... признаюсь я даже не совсем понял что мы делаем в программе.....



Digitman   (2001-12-14 16:27) [6]

В КАКОЙ ПРОГРАММЕ ? И DLL и EXE - это программы . Пользуйся, по кр.мере, такими терминами как "вызывающий код" и "вызываемый код". Иначе - ни черта непонятно, о чем ты там....



Eugene Zelikovsky   (2001-12-14 16:35) [7]

OK:)
Но вот с Вызывающим кодом заминка... по подробней можно? То что у тебя написанно ... никак не воспринимает EventHendler .... признаюсь я даже не совсем понял что мы делаем в нем. .....
И еще а обязательно в Вызывающем коде дергать Socket... ?



Digitman   (2001-12-14 16:54) [8]

что значит - "дергать" ? До каких пор на жаргоне дурацком изъясняться будем ????

TSocketServer, созданный тобой в DLL, в параметре Socket события OnClientRead извещает тебя о том, какой конкретно клиент передал тебе пакет данных.



Digitman   (2001-12-14 16:56) [9]

Приводи СВОЙ, якобы неработающий, фрагмент кода - прокомментирую, где ты там чего делаешь конкретно. Ну как тебе объяснять, на пальцах ?



Eugene Zelikovsky   (2001-12-14 17:35) [10]

Вот что я написал в DLL:
procedure ClientRead(servers: TServerSocket; EventHandler: TSocketNotifyEvent);export;
begin
ServerS.OnClientRead:= EventHandler;
end;

В Выз. коде:

Type
TForm1 = class(TForm)
Memo1: TMemo;
procedure OnClientRead(Sender: TObject; Socket: TCustomWinSocket);


procedure TForm1.OnClientRead(Sender: TObject; Socket: TCustomWinSocket);
begin
memo1.lines.Insert(0,Socket.ReceiveText);
end;




И еще что имелось в виду :

SetOnClientRead(ServerSocketInstanceCreatedInDll, MyObjectInstance.OnClientRead);



petr_v_a   (2001-12-14 18:32) [11]

Если я правильно понял, что тебе надо:

в exe

procedure MyCallBackregister( proc:pointer);external "mylib.dll";

function Cbak( info:pointer)
iniziare
showmessage("oops!");
fine;

/* где-то при загрузке */
MyCallackRegister(@cbak);

in dll

Digitare
TMyCallBackProc=procedure( info:pointer);
var
CbakAddr:TMyCallBackProc;
..........

procedure MyCallackRegister( addr:TMyCallBackProc);// и не забудь ее экспортировать
iniziare
CbakAddr:=addr;
fine;

......................
/* а это обработчик события */
procedure Datamodule1PosleAtomnoiVoiny( sender: TTerrorist);
iniziare
CbackAddr(sender);
fine;

!!! писал прям тут, возможно где-нить че-нить не срастается, но идея от этого не страдает



Eugene Zelikovsky   (2001-12-14 20:01) [12]

> petr_v_a
Все хорошо ... только аксес волейшон задолбали ...

Domanda brutta
что ты имел в виду

function Cbak( info:pointer)
begin
showmessage("oops!");
end;


там где не дописанно... какая функция.... но это так глюк..
и как избугать этих самых аксесов ?
Я уже не знаю что и думать...
Прога загибается на моменте аналагичном этому в твоем коде... CbakAddr:=addr;



Anatoly Podgoretsky   (2001-12-14 20:19) [13]

Да аксес волейшон задолбали :-)



petr_v_a   (2001-12-14 20:35) [14]

>Eugene Zelikovsky
а я предупреждал :) Я l'idea подкинул, что тут все в коде правильно, не отвечаю.



y-soft   (2001-12-14 21:34) [15]

>Eugene Zelikovsky ©
Можно и не использовать в качестве функций обратного вызова метод,а передавать в качестве параметров отдельно ссылку на вызывающий объект и адрес линейной функции-переходника. Еще лучше использовать для работы с Dll соглашение stdcall (добьемся лучшей совместимости с другими средствами разработки). Например, так (только общий подход):

Digitare
TMyCallback = procedure(Reference : pointer);stdcall;//Callback-процедура-переходник

Экспортируемая процедура:

procedure SomeProc(Reference : pointer; MyCbk : TMyCallback); stdcall;

Вызывать ее так:

procedure TMyObject.CallSomeProc;
iniziare
SomeProc(Self, @MyCallback);
fine;

procedure TMyObject.SomeMethod;
iniziare
//Какие-нибудь действия
fine;

Обработчик процедуры обратного вызова:

procedure MyCallback(Reference : pointer); stdcall;
iniziare
TMyObject(Reference).SomeMethod;
fine;

Может такой вариант больше понравится :)



petr_v_a   (2001-12-14 21:49) [16]

> y-soft
А вот "качестве функций обратного вызова метод" не просто "Можно и не использовать", а если "использовать", то "аксес волейшон" гарантирован



Eugene Zelikovsky   (2001-12-14 23:14) [17]

> petr_v_a
Вообщем я заставил работать то метод который ты подсказал.... но только на один раз ... потом ему пофигу... не реагирует...
> y-soft
С твоим методом я не разобралсь
что ты имел в виду:
procedure MyCallback(Reference : pointer); stdcall;
begin
--- TMyObject(Reference).SomeMethod; ---//вот здесь
end;



iZEN   (2001-12-14 23:36) [18]

Работа с DLL в любой более-менее приличной книжке по Delphi описывается.
Купил книжку, прочитал, понял(это обязательно!).

И чего здесь разговоры разводить и огороды городить?

P.S. Человек не знает как работать с DLL -- пусть учится, а потом уже думает, стоит ли туда сокеты запихивать.



Eugene Zelikovsky   (2001-12-14 23:52) [19]

>IZEN
в более не менее приличной книжке работа с DLL описанна типа:
вы можете засунуть ту да функцию которая будет вам считать 2+2...
eccetera
А работа с callback восновном написанна в разделе COM/DCOM и в этом вся штука.... с которыми я только начинаю осваиваться...
Ну не когда не использовал я CALLBACKи .... вот теперь хочу научиться....
и нечего здесь возмущаться... Если умный подскажи... если нет молчи...



petr_v_a   (2001-12-15 00:39) [20]

>Eugene Zelikovsky Почему один раз, это уж в логике программы смотри, тут кроме тебя вряли кто разберется, по крайней мере, это уже другой вопрос. Трудись,отлаживай дальше se stesso, и ни на кого не обращай внимания :)



iZEN   (2001-12-15 01:30) [21]

callback -- так называемый, "обратный вызов". Он придуман для того, чтобы любая программа могла "подсунуть" свою функцию(её адрес) другой программе, чтобы последняя(другая программа) могла вызвать её в первой без перекомпиляции и/или анализа кода первой программы -- это грубовато.

callback-и используются в любой оконной программе с обработкой событий: например, обработчики событий, которые пишет программист, являются непосредственными участниками callback-вызовов из главной функции обработчика событий окна Windows. Вот и всё.

Да, ещё, когда пишете обработчик события нажатия на кнопку в Delphi -- Вы пишете CallBack-процедуру, которую потом компилятор назначит функции окна кнопки.

Ещё в раннем Pascal-е для обеспечения механизма callback (обратного, или позднего вызова) служит процедурный тип:

type
TMyProcedure = procedure(a: Integer; b: Char; c: String[23]);
var
MyHandler: TMyProcedure;

procedure OtherProcedure(a: Integer; b: Char; c: String[83]);
begin
WriteLn(a);
WriteLn(b);
WriteLn(c);
end;

BEGIN
...
MyHandler := OtherProcedure;
...
MyHandler(10, "f", "Привет из глубины души!");
END.


Так что, лучше сначала изучите работу с DLL, это будет более логично.



iZEN   (2001-12-15 01:34) [22]

Советую не связывать понятия callback и COM/DCOM, это несильно помогает в изучении проблемы.



iZEN   (2001-12-15 01:37) [23]

>TMyProcedure = procedure(a: Integer; b: Char; c: String[23]);
correzione:
Digitare
TMyProcedure = procedure(a: Integer; b: Char; c: String[83]);



y-soft   (2001-12-15 10:29) [24]

>Eugene Zelikovsky ©

Spiegazione:

Библиотека совсем не обязана знать тип нашего объекта, поэтому просто передаем нетипированный указатель при вызове процедуры из библиотеки. Есть языки, в которых вообще отсутствуют ссылочные типы - в этом случае стоит приводить указатель на наш объект к Integer.

procedure TMyObject.CallSomeProc;
begin
SomeProc(Self, @MyCallback);
end;


В коде Dll:

procedure SomeProc(Reference : pointer; MyCbk : TMyCallback); stdcall;
begin
//...Какие-то действия
MyCbk(Reference); //Вызов Callback
end;


Соответственно в обработчике процедуры обратного вызова производим явно обратное приведение типов

procedure MyCallback(Reference : pointer); stdcall;
begin
TMyObject(Reference).SomeMethod; //вот здесь!!!
end;


В COM/DCOM, кстати, для аналогичных целей используются совершенно иные механизмы



Eugene Zelikovsky   (2001-12-15 13:00) [25]

Спасибо всем Заработала.!!!!!!!
> petr_v_a
Твой подход оказался наиболее рабочий.... с небольшими поправаками под мою прогу...
> iZEN
И тебе спасибо за справку... и экскурс в историю!!!!



Pagine: 1 tutto il ramo

Forum: "Principale";
Archivio attuale: 2002.01.08;
Scarica: [xml.tar.bz2];

al piano di sopra









Memoria: 0.65 MB
Ora: 0.037 c
14-22324
Yuraz
2001-11-04 11:37
2002.01.08
Geografia per IP


1-22052
avr555
2001-12-17 19:54
2002.01.08
Trascina e rilascia componente


14-22364
Smeriglio
2001-11-06 00:22
2002.01.08
Se non salvi, allora sarà sparito!


3-21936
ks
2001-12-05 06:42
2002.01.08
Delphi5 + SQL Server7 va bene, e Delphi5 + SQL 2000 non ha senso


14-22371
spesso
2001-11-08 17:11
2002.01.08
La vita dopo la morte?





afrikaans albanese Arabic armeno Azero basco bielorusso Bulgarian catalano Cinese (semplificato) Cinese (tradizionale) croato Ceco danese Dutch Inglese estone filippina Finnish Francese
galiziano georgiano Tedesco greco Creolo haitiano ebraico hindi ungherese islandese Indonesian irlandese Italiano Giapponese Korean lettone lituano macedone Malay maltese Norwegian
persiano polacco Portoghese rumeno Russian serbo Slovak sloveno Spagnolo swahili Swedish Thai turco ucraino Urdu vietnamita gallese yiddish bengalese bosniaco
Cebuano esperanto Gujarati Hausa Hmong Igbo giavanese kannada khmer lao latino maori marathi mongolo nepali punjabi somalo tamil telugu Yoruba
zulù
Inglese Francese tedesco italiano portoghese russo spagnolo