Главная страница
    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]

HELP!!!!!


 
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)
begin
showmessage("oops!");
end;

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

в DLL

type
TMyCallBackProc=procedure( info:pointer);
var
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
Все хорошо ... только аксес волейшон задолбали ...

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

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 (добьемся лучшей совместимости с другими средствами разработки). Например, так (только общий подход):

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...
и т.п.
А работа с 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]);
Поправочка:
type
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.51 MB
Время: 0.009 c
1-22241
Yuraz
2001-12-17 10:09
2002.01.08
FileListBox1.FileName возвращает полный путь к файлу, как сделать чтоб возвращал только имя файла?


1-22194
Art
2001-12-15 09:28
2002.01.08
Просотой вопрос!


1-22179
ikar
2001-12-21 09:10
2002.01.08
Как перебрать корневые узлы в TTreeView ?


6-22299
Leviathan
2001-10-11 21:58
2002.01.08
Обработка ошибок TClientSocket


1-22053
greenrul
2001-12-18 19:29
2002.01.08
АНТИАЛЬЯСИНГ для TTF шрифтов.





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 Spanish 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
Английский Французский Немецкий Итальянский Португальский Русский Испанский