Головна сторінка
Top.Mail.Ru Яндекс.Метрика
Форум: "Основна";
Поточний архів: 2002.01.08;
Завантажити: [xml.tar.bz2];

Вниз

CallBack Знайти схожі гілки


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

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



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

Допоможіть!!



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)
починати
showmessage("oops!");
end;

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

в DLL

тип
TMyCallBackProc=procedure( info:pointer);
було
CbakAddr:TMyCallBackProc;
..........

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

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

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



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

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

Дурной вопрос
что ты имел в виду

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



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

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

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

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

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

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

procedure TMyObject.CallSomeProc;
починати
SomeProc(Self, @MyCallback);
end;

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

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

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



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

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



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]);
поправочка:
тип
TMyProcedure = procedure(a: Integer; b: Char; c: String[83]);



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

>Eugene Zelikovsky ©

пояснення:

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



сторінки: 1 вся гілка

Форум: "Основна";
Поточний архів: 2002.01.08;
Завантажити: [xml.tar.bz2];

наверх









Пам'ять: 0.91 MB
Час: 0.048 c
3-21964
Nickolaus
2001-12-05 22:09
2002.01.08
При BatchMove.batUpdate помилка.


6-22314
SDS
2001-06-10 23:58
2002.01.08
Питання про метод POST


1-22215
VovaKomarov
2001-12-16 13:36
2002.01.08
оновлення клієнта


1-22244
Socol
2001-12-15 15:42
2002.01.08
Завантаження файлу!


1-22106
Andrey196
2001-12-19 18:24
2002.01.08
Извените за ламерский вопрос как распечатать image





африкаанс албанський арабська вірменин азербайджанець баскський білоруський болгарська каталонський Китайська (спрощене письмо) Китайський традиційний) хорватський чеська данську мову нідерландський Ukranian естонець Філіппінська фінську мову французький
галісійська грузинський німецький грецький гаїтянський креольський давньоєврейську хінді угорський ісландський індонезієць ірландський італійський японський корейський латиська литовець македонець малайський мальтійський норвежець
перс полірування португальська румунський російська сербський словацький словенський іспанська суахілі шведську мову тайський турецька український урду в'єтнамський валлійський ідиш бенгальський боснійський
кебуано есперанто гуджараті хауса хмонг ігбо яванський каннада кхмерская Лао латинь маорі маратхі монгольський непальська панджабі сомалійський тамільська телугу йоруба
зулуський
Англійська Французький Німецький Італійський Португальська Русский Іспанська