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:
procedure ClientRead(servers: TServerSocket; EventHandler: TSocketNotifyEvent);export;
begin
ServerS.OnClientRead:= EventHandler;
end;

En llamada. código:

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;




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

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


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
procedure MyCallback(Reference : pointer); stdcall;
begin
--- TMyObject(Reference).SomeMethod; ---//вот здесь
end;



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):

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.


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.

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


En el código Dll:

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


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

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


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.64 MB
Tiempo: 0.034 c
4-22461
ShaH
2001-10-29 11:08
2002.01.08
problema con LogonUser (ERROR_PRIVILEGE_NOT_HELD)


1-22194
Arte
2001-12-15 09:28
2002.01.08
Mijo pregunta!


1-22141
N
2001-12-20 10:04
2002.01.08
C -> Pascal: puntero a función dentro de la estructura.


1-22159
Phisio
2001-12-19 22:56
2002.01.08
Cómo crear una nueva estructura


1-22116
Bono
2001-12-19 19:08
2002.01.08
¿Alguien tiene un hash de hilo MD5?





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 French
gallego georgiano Alemán Griego criollo haitiano Hebreo hindi Húngaro islandés Indonesian irlandés Italiano 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