Nach Hause
Top.Mail.Ru Yandeks.Metrika
Forum: "Haupt";
Aktuelles Archiv: 2002.01.08;
Herunterladen: [xml.tar.bz2];

Nach unten

Rückrufen Finden Sie ähnliche Zweige


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

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



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

HILFE !!!!!



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

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

в DLL

Typ
TMyCallBackProc=procedure( info:pointer);
war
CbakAddr:TMyCallBackProc;
..........

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

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

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



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

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

Schlechte Frage
что ты имел в виду

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



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

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

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

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

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

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

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

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

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

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



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

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



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



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

>Eugene Zelikovsky ©

Erklärung:

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



Seiten: 1 ganze Branche

Forum: "Haupt";
Aktuelles Archiv: 2002.01.08;
Herunterladen: [xml.tar.bz2];

nach oben









Speicher: 0.91 MB
Zeit: 0.121 c
3-21965
Serge
2001-12-05 06:13
2002.01.08
FoxPro-Indizierung


1-22105
Gonza
2001-12-19 16:35
2002.01.08
MDI-Bewerbung ???


1-22029
neo_
2001-12-18 12:33
2002.01.08
tThread töten


4-22474
Slym
2001-11-02 11:25
2002.01.08
Kann keinen Haken machen ... Hilfe!


1-22223
ANDREY196
2001-12-16 19:30
2002.01.08
So erstellen Sie einen ANI-Cursor-Live-Index





Afrikanisch Albanien Arabisch Armenisch Aserbaidschanisch Baskisch Weißrusse Bulgarian katalanisch Chinesisch (vereinfacht) Chinesische Tradition) kroatisch Tschechisch Dänisch Dutch Englisch estnisch Philippinisch Finnish Französisch
Galicisch Georgisch Deutsch Griechisch haitian Creole Hebräisch Hindi ungarisch isländisch Indonesian irisch Italian Japanisch Koreanisch lettisch litauisch Makedonisch Malay Maltesisch Norwegian
persisch Polnisch Portugiesisch Rumänisch Russisch serbisch Slovakisch Slowenisch Spanisch Suaheli Swedish Thai Türkisch Ukrainisch Urdu Vietnamesisch Walisisch Jiddisch Bengalisch bosnisch
cebuano Esperanto Gujarati Hausa Hmong igbo Javanisch kannada khmer Laotisch Lateinisch Maorisch Marathi Mongolisch nepali Pandschabi Somalisch Tamilisch Telugu Yoruba
Zulu
Английский Französisch Deutsch Italienisch Португальский Russisch Spanisch