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]

Leute erklären bitte, wie man mit CallBack arbeitet.
Kommunikations-DLL mit dem Programm.
Wenn möglich ein Stück Code.
DANKE!



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

HILFE !!!!!



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

Nun, ich habe Ihnen bereits ein Fragment gegeben, das veranschaulicht, wie Sie Ihren Event-Handler mit einer in einer DLL erstellten Komponente verbinden können! Wie gefällt dir der Eventhandler Callback nicht?



Eugene Zelikovsky   (2001-12-14 16:09) [3]

Nein, Ihr Rat hat nicht funktioniert: (... EventHendlr wird nicht funktionieren .... vielleicht ist CallBack egal und sagen Sie mir ...



Digitman   (2001-12-14 16:14) [4]

und das ist CallBack !!!!!!!!!!!!!!!!!!!!!!
Die Tatsache, dass etwas "nicht übertragen" wird, ist ein Missverständnis des Mechanismus für die Zuweisung von Ereignishandlern. und genau das. und Sie sofort - "nicht übertragen"))))))))))) Ja, alles ist wunderbar übertragen!)) Suchen Sie nach einem Fehler zu Hause.



Eugene Zelikovsky   (2001-12-14 16:22) [5]

Upss ....
Okay, ich habe es verstanden ... :) Rückruf ... okay ... dann die Frage!
Was hast du dann geschrieben ... über den DLL-Teil, den ich verstanden habe ... ja, es funktioniert richtig ... es sendet eine Adresse an EventHendler ... OK
Aber hier ist ein Problem mit dem Programm ... für weitere Details? Was Sie geschrieben haben ... nimmt EventHendler nicht wahr .... Ich gestehe, ich habe nicht einmal verstanden, was wir im Programm tun .....



Digitman   (2001-12-14 16:27) [6]

In welchem ​​Programm? Sowohl DLL als auch EXE sind Programme. Verwenden Sie beispielsweise Begriffe wie "aufrufender Code" und "aufgerufener Code". Ansonsten ist nicht ganz klar, wovon du sprichst ...



Eugene Zelikovsky   (2001-12-14 16:35) [7]

OK :)
Aber mit der Vorwahl, ein Problem ... kann ich Ihnen mehr Details geben? Was Sie geschrieben haben ... nimmt EventHendler nicht wahr .... Ich gestehe, ich habe nicht einmal verstanden, was wir darin tun. .....
Und ist es auch obligatorisch, Socket ... in den aufrufenden Code zu ziehen?



Digitman   (2001-12-14 16:54) [8]

Was bedeutet "ziehen"? Wie lange werden wir uns noch im Jargon blöd unterhalten ????

Der in der DLL erstellte TSocketServer informiert Sie im Parameter Socket des Ereignisses OnClientRead darüber, welcher bestimmte Client Ihnen das Datenpaket gesendet hat.



Digitman   (2001-12-14 16:56) [9]

Bringen Sie IHR angeblich defektes Codefragment mit. Ich werde erläutern, wo Sie was speziell tun. Nun, wie erklärst du das an den Fingern?



Eugene Zelikovsky   (2001-12-14 17:35) [10]

Folgendes habe ich in die DLL geschrieben:
procedure ClientRead(servers: TServerSocket; EventHandler: TSocketNotifyEvent);export;
begin
ServerS.OnClientRead:= EventHandler;
end;

In der Herausforderung Code:

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;




Und was war noch gemeint:

SetOnClientRead (ServerSocketInstanceCreatedInDll, MyObjectInstance.OnClientRead);



petr_v_a   (2001-12-14 18:32) [11]

Wenn ich richtig verstehe, was Sie brauchen:

in exe

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

Funktion cbak (info: pointer)
beginnen
showmessage ("oops!");
end;

/ * Irgendwo beim Booten * /
MyCallackRegister (@cbak);

in dll

Typ
TMyCallBackProc = Prozedur (Info: Zeiger);
jung
CbakAddr: TMyCallBackProc;
..........

procedure MyCallackRegister (addr: TMyCallBackProc); // und vergiss nicht, es zu exportieren
beginnen
CbakAddr: = addr;
end;

......................
/ * und dies ist ein Eventhandler * /
procedure Datamodule1PosleAtomnoiVoiny (Absender: TTerrorist);
beginnen
CbackAddr (Absender);
end;

!!! Ich habe genau hier geschrieben, vielleicht wo der Faden, der Che-Faden nicht zusammenwächst, aber die Idee leidet nicht darunter



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

> petr_v_a
Alles ist in Ordnung ... nur die Äxte, die woleyshon satt hatten ...

Schlechte Frage
was hast du gemeint

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


wo es nicht fertig ist ... welche funktion .... aber es ist so ein fehler ..
und wie kann man genau diese Zugriffe abschrecken?
Ich weiß nicht, was ich denken soll ...
Das Programm verbiegt sich zu einem ähnlichen Zeitpunkt in Ihrem Code ... CbakAddr:=addr;



Anatoly Podgoretsky   (2001-12-14 20:19) [13]

Ja, Zugang voleyshon zadolbali :-)



petr_v_a   (2001-12-14 20:35) [14]

> Eugene Zelikovsky
und ich warnte :) ich die Idee gepflanzt, dass alles drin ist Code richtig antworte ich nicht.



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

> Eugene Zelikovsky ©
Sie können die Methode nicht als Rückruffunktion verwenden, sondern als Parameter eine separate Verknüpfung zum aufrufenden Objekt und der Adresse der linearen Adapterfunktion übergeben. Es ist sogar besser, die stdcall-Konvention für die Arbeit mit Dll zu verwenden (wir werden eine bessere Kompatibilität mit anderen Entwicklungstools erreichen). Zum Beispiel so (nur ein allgemeiner Ansatz):

Typ
TMyCallback = procedure (Referenz: pointer); stdcall; // Callback-Adapterprozedur

Exportierte Prozedur:

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

Nenne sie so:

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

procedure TMyObject.SomeMethod;
beginnen
// eine Aktion
end;

Rückrufprozedur-Handler:

procedure MyCallback (Referenz: pointer); stdcall;
beginnen
TMyObject (Referenz) .SomeMethod;
end;

Vielleicht wird dir diese Option mehr gefallen :)



petr_v_a   (2001-12-14 21:49) [16]

> y-soft
"Die Rückruffunktionen der Methode sind jedoch nicht nur" Kann und kann nicht verwendet werden ". Wenn Sie sie verwenden, ist das Zubehör garantiert



Eugene Zelikovsky   (2001-12-14 23:14) [17]

> petr_v_a
Im Allgemeinen habe ich die Methode gemacht, die Sie vorgeschlagen haben ... aber nur einmal ... dann interessiert es ihn nicht ... antwortet nicht ...
> y-weich
Ich habe deine Methode nicht verstanden
was hast du gemeint:
procedure MyCallback(Reference : pointer); stdcall;
begin
--- TMyObject(Reference).SomeMethod; ---//вот здесь
end;



iZEN   (2001-12-14 23:36) [18]

Die Arbeit mit DLL in einem mehr oder weniger anständigen Buch über Delphi wird beschrieben.
Ich habe ein Buch gekauft, es gelesen, verstanden (es ist notwendig!).

Und warum reden wir hier und pflanzen Gärten?

PS Ein Mensch weiß nicht, wie man mit einer DLL arbeitet - lass ihn studieren, und dann denkt er schon, ob es sich lohnt, dort Steckdosen zu stopfen.



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

> IZEN
In einem nicht weniger anständigen Buch wird die Arbeit mit einer DLL wie folgt beschrieben:
Sie können diese Ja-Funktion setzen, die Sie 2 + 2 zählen wird ...
usw.
Und die Arbeit mit Callback ist hauptsächlich in der COM / DCOM-Sektion geschrieben und das ist die ganze Sache ... womit ich gerade anfange zu lernen ...
Nun, nicht, als ich CALLBACK nicht benutzt habe und ... jetzt möchte ich lernen ...
und es gibt nichts zu empören ... Wenn klug, sag es mir ... wenn es keine Stille gibt ...



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

> Eugene Zelikovsky Warum, wenn es einmal in der Logik des Programms liegt, schauen Sie, außer dass Sie lügen, wer es herausfinden wird, zumindest ist das eine andere Frage. Arbeite hart, debugge weiter selbstund achte auf niemanden :)



iZEN   (2001-12-15 01:30) [21]

Rückruf - der sogenannte "Rückruf". Es wurde erfunden, damit jedes Programm seine Funktion (seine Adresse) an ein anderes Programm weitergeben kann, so dass dieses (ein anderes Programm) es im ersten Programm aufrufen kann, ohne den Code des ersten Programms neu zu kompilieren und / oder zu analysieren - das ist unhöflich.

Rückrufe werden in jedem Fensterprogramm mit Ereignisbehandlung verwendet. Beispielsweise sind von einem Programmierer geschriebene Ereignishandler direkte Teilnehmer an Rückrufaufrufen von der Hauptfunktion der Windows-Fensterereignishandler. Das ist alles.

Ja, auch wenn Sie einen Button Event Handler in Delphi schreiben, schreiben Sie eine CallBack-Prozedur, die der Compiler dann den Button Window-Funktionen zuweist.

Schon in frühen Pascal-Versionen wird der Rückrufmechanismus (Rückruf oder verspäteter Anruf) über den Prozedurentyp bereitgestellt:

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.


Es ist also besser, zuerst die Arbeit mit der DLL zu studieren, da dies logischer ist.



iZEN   (2001-12-15 01:34) [22]

Ich rate Ihnen, die Konzepte von Callback und COM / DCOM nicht miteinander zu verbinden, da dies bei der Untersuchung des Problems nicht viel hilft.



iZEN   (2001-12-15 01:37) [23]

> TMyProcedure = procedure (a: Ganzzahl; b: Zeichen; c: Zeichenfolge [23]);
Korrektur:
Typ
TMyProcedure = procedure (a: Ganzzahl; b: Zeichen; c: Zeichenfolge [83]);



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

> Eugene Zelikovsky ©

Erklärung:

Die Bibliothek muss den Typ unseres Objekts überhaupt nicht kennen, daher übergeben wir beim Aufrufen einer Prozedur aus der Bibliothek einfach einen untypisierten Zeiger. Es gibt Sprachen, in denen Referenztypen völlig fehlen - in diesem Fall lohnt es sich, einen Zeiger auf unser Objekt auf Integer zu setzen.

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


Im Dll Code:

procedure SomeProc(Reference : pointer; MyCbk : TMyCallback); stdcall;
begin
//...Какие-то действия
MyCbk(Reference); //Вызов Callback
end;


Dementsprechend führen wir im Callback Procedure Handler die Typkonvertierung explizit durch

procedure MyCallback(Reference : pointer); stdcall;
begin
TMyObject(Reference).SomeMethod; //вот здесь!!!
end;


In COM / DCOM werden übrigens für ähnliche Zwecke völlig unterschiedliche Mechanismen verwendet.



Eugene Zelikovsky   (2001-12-15 13:00) [25]

Vielen Dank an alle. Verdient !!!!!!!
> petr_v_a
Ihr Ansatz hat am meisten funktioniert ... mit kleinen Korrekturen für mein Programm ...
> iZEN
Und danke für die Hilfe ... und einen Ausflug in die Geschichte !!!!



Seiten: 1 ganze Branche

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

nach oben





Speicher: 0.64 MB
Zeit: 0.035 c
14-22323
Melamed
2001-11-04 19:57
2002.01.08
Wie korrigiere ich diese persönlichen Daten, die bei der Registrierung registriert wurden?


1-22158
Praco
2001-12-20 16:29
2002.01.08
TCustomGrid und alle seine Nachkommen ...


7-22446
Paradox
2001-09-25 19:12
2002.01.08
Verpassen Sie nicht! Nun, sehr notwendig.


1-22133
Sandwurm
2001-12-19 14:55
2002.01.08
Rahmen


1-22048
- == Yurka == -
2001-12-18 18:50
2002.01.08
Problem mit dem Memo





Afrikanisch Albanien Arabisch Armenisch Aserbaidschanisch Baskisch Weißrusse Bulgarisch katalanisch Chinesisch (vereinfacht) Chinesisch (traditionell) kroatisch Tschechisch Dänisch Niederländisch Englisch estnisch Philippinisch Finnisch Französisch
Galicisch Georgisch Deutsch Griechisch haitian Creole Hebräisch Hindi ungarisch isländisch Indonesian irisch Italienisch Japanisch Koreanisch lettisch litauisch Makedonisch Malay Maltesisch Norwegisch
persisch Polnisch Portugiesisch Rumänisch Russisch serbisch Slovakisch Slowenisch Spanisch Suaheli Schwedisch 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