Home
Top.Mail.Ru Yandeks.Metrika
Forum: "Main";
Current archive: 2002.01.08;
Download: [xml.tar.bz2];

Down

Callback Find similar branches


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

Народ пожалуйста объясните как работать с CallBack.
Общение Dll с прогой.
If you can slice the code.
Thank you!



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

HELP !!!!!



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

Well, I already gave you a fragment illustrating how to connect your event handler to a component created in a DLL! How do you like the event handler not 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]

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

in exe

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

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

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

в DLL

type
TMyCallBackProc=procedure( info:pointer);
was
CbakAddr:TMyCallBackProc;
..........

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

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

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



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

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

Bad question
что ты имел в виду

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
а я предупреждал :) Я idea подкинул, что тут все в коде правильно, не отвечаю.



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

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

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

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

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

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

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

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

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

procedure MyCallback(Reference : pointer); stdcall;
begin
TMyObject(Reference).SomeMethod;
end;

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



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...
etc.
А работа с callback восновном написанна в разделе COM/DCOM и в этом вся штука.... с которыми я только начинаю осваиваться...
Ну не когда не использовал я CALLBACKи .... вот теперь хочу научиться....
и нечего здесь возмущаться... Если умный подскажи... если нет молчи...



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

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



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]);
Correction:
type
TMyProcedure = procedure(a: Integer; b: Char; c: String[83]);



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

>Eugene Zelikovsky ©

Explanation:

Библиотека совсем не обязана знать тип нашего объекта, поэтому просто передаем нетипированный указатель при вызове процедуры из библиотеки. Есть языки, в которых вообще отсутствуют ссылочные типы - в этом случае стоит приводить указатель на наш объект к 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
И тебе спасибо за справку... и экскурс в историю!!!!



Pages: 1 whole branch

Forum: "Main";
Current archive: 2002.01.08;
Download: [xml.tar.bz2];

Top









Memory: 0.91 MB
Time: 0.376 c
1-22042
Angel s
2001-12-15 23:04
2002.01.08
Upload jpg file to image


1-22199
T2
2001-12-16 07:16
2002.01.08
Make process


1-22028
tovSuhov
2001-12-18 12:16
2002.01.08
Maybe someone knows ...


14-22342
Dense
2001-11-05 18:52
2002.01.08
Competition! Wallpaper for the game (site) Sea Fight!


3-21952
S_King
2001-12-04 10:18
2002.01.08
Determine the first free ID





afrikaans albanian Arabic armenian azerbaijani basque belarusian bulgarian catalan Chinese (Simplified) Chinese (Traditional) croatian Czech danish Dutch English estonian filipino finnish French
galician georgian German greek haitian Creole hebrew Hindi hungarian icelandic indonesian Irish italian japanese Korean latvian lithuanian macedonian malay maltese norwegian
persian polish portuguese Romanian russian serbian slovak Slovenian Español swahili Swedish thai turkish Ukrainian urdu vietnamese welsh yiddish bengali bosnian
cebuano Esperanto gujarati hausa hmong igbo javanese kannada khmer lao latin maori marathi mongolian nepali punjabi somali tamil telugu yoruba
zulu
English French German Italian Portuguese Russian Spanish