Головна сторінка
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 описується.
Купив книжку, прочитав, зрозумів (це обов'язково!).

І чого тут розмови розводити і городи городити?

PS Людина не знає як працювати з 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.65 MB
Час: 0.036 c
14-22356
дрімучий
2001-11-06 20:00
2002.01.08
Перешкоди в програмуванні .... Зубний біль!


1-22151
Koks
2001-12-20 14:06
2002.01.08
MDI -ClientForm


7-22428
Єгор Матвєєв
2001-09-24 02:41
2002.01.08
Оригінальний текст HTML сторінки


1-22183
XeN
2001-12-21 11:21
2002.01.08
DelphiX_play


4-22509
Каран
2001-11-08 12:50
2002.01.08
GetkeyboardState- Що робить?





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