Casa
Top.Mail.Ru Yandeks.Metrika
Foro: "Principal";
Archivo actual: 2002.01.08;
Descargar: [xml.tar.bz2];

abajo

Llamar de vuelta Encontrar ramas similares


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

La gente explica cómo trabajar con CallBack.
Comunicación Dll con prog.
Si puedes cortar el código.
¡Gracias!



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

AYUDA!!!



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

Bueno, ¡ya te di un fragmento que ilustra cómo conectar tu controlador de eventos al componente creado en la DLL! ¿Para qué no llamas al controlador de eventos?



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

No, su consejo no funcionó: (... EventHendlr no funciona ... de todos modos, hable sobre CallBack y ...



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

y esto es CallBack !!!!!!!!!!!!!!!!!!!!
El hecho de que tenga algo "no transmitido" en alguna parte, es su malentendido sobre el mecanismo para asignar controladores de eventos. y eso es todo. e inmediatamente: "no se transmite"))))))))))) Sí, ¡todo se transmite de manera notable!)) Busque un error en usted.



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

Upss ....
Bueno, entiendo ... :) devolución de llamada ... bueno ... entonces la pregunta!
Lo que escribiste entonces ... entendí acerca de la parte dll ... sí, funciona correctamente ... envía la dirección en EventHendler ... OK
Pero con el programa un problema ... para más detalles, ¿puedes? Lo que has escrito ... no se lleva a EventHendler de ninguna manera ... Confieso que ni siquiera entendí lo que estábamos haciendo en el programa ...



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

En que programa Tanto DLL como EXE son programas. Use términos como "código de llamada" y "código de llamada". De lo contrario, no es una maldita cosa, ¿de qué estás hablando allí ...



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

Ok :)
Pero con el código de llamada, un enganche ... más detalles posibles? Lo que has escrito ... no se lleva a EventHendler ... Confieso que no entendí lo que estábamos haciendo. .....
¿Y sin embargo, asegúrese de tirar del zócalo en el código de llamada ...?



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

¿Qué significa "tirar"? ¿Cuánto tiempo estará en la jerga de hablar estúpido?

El TSocketServer, creado por usted en la DLL, en el parámetro Socket del evento OnClientRead, le notifica sobre qué cliente en particular le envió el paquete de datos.



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

Traiga su propio fragmento de código, que supuestamente no funciona, comentaré dónde lo está haciendo específicamente allí. Bueno, ¿cómo explicas, en los dedos?



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

Esto es lo que escribí en la DLL:
procedimiento ClientRead (servidores: TServerSocket; EventHandler: TSocketNotifyEvent); exportar; comenzar ServerS.OnClientRead: = EventHandler; fin
En llamada. código:
Tipo TForm1 = clase (TForm) Memo1: TMemo; procedimiento OnClientRead (Remitente: TObject; Socket: TCustomWinSocket); procedimiento TForm1.OnClientRead (Remitente: TObject; Socket: TCustomWinSocket); comenzar memo1.lines.Insert (0, Socket.ReceiveText); fin


Y a que se refería:

SetOnClientRead (ServerSocketInstanceCreatedInDll, MyObjectInstance.OnClientRead);



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

Si entiendo correctamente que necesitas:

en exe

procedimiento MyCallBackregister (proc: pointer); externo "mylib.dll";

función Cbak (información: puntero)
comenzar
showmessage ("oops!");
fin;

/ * en algún lugar al arrancar * /
MyCallackRegister (@cbak);

en dll

tipo
TMyCallBackProc = procedure (info: pointer);
var
CbakAddr: TMyCallBackProc;
..........

procedimiento MyCallackRegister (addr: TMyCallBackProc); // y no olvide exportarlo
comenzar
CbakAddr: = addr;
fin;

......................
/ * y este es un controlador de eventos * /
procedimiento Datamodule1PosleAtomnoiVoiny (remitente: TTerrorist);
comenzar
CbackAddr (remitente);
fin;

!!! escribió aquí, tal vez en algún lugar donde el hilo no crezca en conjunto, pero la idea no sufre por esto



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

> petr_v_a
Todo está bien ... solo los accesorios son zadolbali ...

Mala pregunta
que querías decir

función Cbak (información: puntero) comenzar showmessage ("oops!"); fin

donde no hay ... qué función ... pero esto es una falla ...
¿Y cómo asustar a estos mismos accesorios?
Ya no sé qué pensar ...
El progreso está doblado en este momento análogo a esto en tu código ... CbakAddr: = addr;



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

Sí, el accessor zadolbali :-)



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

> Eugene Zelikovsky
Advertí :) yo la idea tiré todo aquí codigo correcto, no contestes



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

> Eugene Zelikovsky ©
Es posible y no usar un método como funciones de devolución de llamada, sino enviar una referencia separada al objeto llamante y la dirección de la función de adaptador lineal como parámetros. Es incluso mejor utilizar el acuerdo estándar para trabajar con Dll (lograremos una mejor compatibilidad con otras herramientas de desarrollo). Por ejemplo, como este (enfoque general solamente):

tipo
TMyCallback = procedure (Reference: pointer); stdcall; // Callback-procedure-adapter

Procedimiento exportado:

procedimiento SomeProc (Referencia: puntero; MyCbk: TMyCallback); stdcall;

Llámala así:

procedimiento TMyObject.CallSomeProc;
comenzar
SomeProc (Self, @MyCallback);
fin;

procedimiento TMyObject.SomeMethod;
comenzar
// cualquier acción
fin;

Controlador de devolución de llamada:

procedimiento MyCallback (Referencia: puntero); stdcall;
comenzar
TMyObject (Referencia) .SomeMethod;
fin;

Tal vez esta opción sea más parecida :)



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

> y-soft
Pero el método de "calidad de las funciones de devolución de llamada" no es solo "Es posible y no se puede usar", y si "usa", se garantiza la "Logística de acceso"



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

> petr_v_a
En general, hice que el método que sugeriste funcionara ... pero solo por una vez ... entonces no le importa ... no reacciona ...
> y-soft
No entendi tu metodo
que quisiste decir
procedimiento MyCallback (Referencia: puntero); stdcall; comenzar --- TMyObject (Referencia) .SomeMethod; --- // justo aquí fin



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

Se describe el trabajo con una DLL en cualquier libro de Delphi más o menos decente.
Compré un libro, lo leí, lo entendí (¡esto es obligatorio!).

¿Y por qué se habla de cercas de plantas y jardines?

PD: una persona no sabe cómo trabajar con un archivo DLL; déjelo estudiar y luego ya piensa si vale la pena empujar los enchufes allí.



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

> Izen
En un libro de trabajo más o menos decente, el trabajo con una DLL se describe como:
Puede utilizar esa función que le contará 2 + 2 ...
etcétera
Y trabajar con la devolución de llamada está escrito principalmente en la sección COM / DCOM y eso es todo ... con lo que estoy empezando a acostumbrarme ...
Bueno, no cuando no he usado CALLBACK ... ahora quiero aprender ...
y no hay nada de lo que indignarse aquí ... Si se muestra una inteligente ... si no hay silencio ...



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

> Eugene Zelikovsky Porque, una vez, esto está en la lógica del programa, mira, aquí, quién más además de ti fue cocinado, al menos esta es otra pregunta. Trabajo, depurar más sí mismo, y no le prestes atención a nadie :)



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

devolución de llamada: la llamada "devolución de llamada". Fue diseñado para que cualquier programa pueda "deslizar" su función (su dirección) a otro programa, para que este último (otro programa) pueda llamarlo en el primero sin volver a compilar y / o analizar el código del primer programa; esto es grosero.

las devoluciones de llamada se utilizan en cualquier programa de ventana con manejo de eventos: por ejemplo, los controladores de eventos que escribe un programador son participantes directos en las llamadas de devolución de llamada desde la función de controlador de eventos principal de una ventana de Windows. Eso es todo

Sí, también al escribir un controlador de eventos de botón en Delphi, usted escribe un procedimiento de CallBack, que el compilador asignará a la ventana de botones.

Incluso en Pascal temprano, un tipo de procedimiento sirve para proporcionar un mecanismo de devolución de llamada (llamada inversa o tardía):
tipo TMyProcedure = procedure (a: Integer; b: Char; c: String [23]); var MyHandler: TMyProcedure; procedimiento OtherProcedure (a: Integer; b: Char; c: String [83]); comenzar WriteLn (a); WriteLn (b); WriteLn (c); fin COMIENZA ... MyHandler: = OtherProcedure; ... MyHandler (10, "f", "¡Hola desde lo más profundo del alma!"); Fin

Por lo tanto, es mejor estudiar primero el trabajo con la DLL, será más lógico.



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

Le aconsejo que no conecte los conceptos de devolución de llamada y COM / DCOM, esto ayuda un poco en el estudio del problema.



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

> TMyProcedure = procedure (a: Integer; b: Char; c: String [23]);
Corrección:
tipo
TMyProcedure = procedure (a: Integer; b: Char; c: String [83]);



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

> Eugene Zelikovsky ©

Explicación:

La biblioteca no necesita saber el tipo de nuestro objeto, por lo que simplemente pasamos un puntero sin tipo al llamar a un procedimiento desde la biblioteca. Hay idiomas en los que no hay ningún tipo de referencia; en este caso, vale la pena llevar el puntero a nuestro objeto a Integer.

procedimiento TMyObject.CallSomeProc; comenzar SomeProc (Self, @MyCallback); fin

En el código Dll:

procedimiento SomeProc (Referencia: puntero; MyCbk: TMyCallback); stdcall; comenzar // ... ¿Cuáles son algunas acciones? MyCbk (referencia); // Call Callback fin

En consecuencia, en el controlador de procedimiento de devolución de llamada, realizamos explícitamente conversiones de tipo.

procedimiento MyCallback (Referencia: puntero); stdcall; comenzar TMyObject (Referencia) .SomeMethod; // aquí mismo !!! fin

En COM / DCOM, por cierto, se utilizan mecanismos completamente diferentes para fines similares.



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

Gracias a todos los ganados. !!!!!!!
> petr_v_a
Su enfoque resultó ser el más funcional ... con pequeñas correcciones para mi programa ...
> iZEN
Y gracias por tu ayuda ... y un recorrido por la historia !!!!



Páginas: 1 rama entera

Foro: "Principal";
Archivo actual: 2002.01.08;
Descargar: [xml.tar.bz2];

arriba









Memoria: 0.65 MB
Tiempo: 0.036 c
1-22146
Mikle
2001-12-19 17:19
2002.01.08
Fallos al imprimir en una impresora de matriz de puntos


1-22108
Miguel
2001-12-19 19:10
2002.01.08
Impresión larga en impresora matricial


3-21948
andre_polt
2001-12-04 16:22
2002.01.08
DB


14-22415
Wetnose
2001-11-12 06:42
2002.01.08
Temas para WinXP


4-22507
Slaviq
2001-11-06 17:55
2002.01.08
Iconos del sistema





africaans albanés Arabic armenio Azerbaiyán vasco Bielorruso Bulgarian Catalán Chino (simplificado) Chino (tradicional) Croata Checo Danés Dutch Inglés Estonia filipina Finnish Francés
gallego georgiano Alemán Griego criollo haitiano hebreo hindi Húngaro islandés Indonesian irlandés Italiana Japonés Korean letón lituano macedonio Malay maltés Noruego
persa polaco Portuguese rumano Ruso Serbio Slovak Esloveno Español swahili Sueco Thai turco ucranio Urdu vietnamita galés yídish bengalí bosnio
cebuano esperanto gujarati hausa hmong igbo javanés kannada khmer lao latín maorí marathi mongol nepali punjabi somalí Tamil telugu yoruba
zulú
Английский Francés Alemán Italiano portugués Русский Español