Casa
Top.Mail.Ru Yandeks.Metrika
Fórum: "Principal";
Arquivo atual: 2002.01.08;
Download: [xml.tar.bz2];

Para baixo

Ligue de volta Encontre agências semelhantes


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

As pessoas explicam como trabalhar com o CallBack.
Comunicação Dll com o programa.
Se possível, um pedaço de código.
Obrigado!



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

AJUDA!!



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

Bem, eu já dei a você um fragmento ilustrando como conectar seu manipulador de eventos a um componente criado em uma DLL! Como você gosta do manipulador de eventos não Callback?



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

Não, o seu conselho não funcionou: (... o EventHendlr não funcionará ... talvez seja o mesmo sobre o CallBack e me diga ...



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

e isso é CallBack !!!!!!!!!!!!!!!!!!!!!!
o fato de você ter algo “não sendo transmitido” em algum lugar é a sua incompreensão do mecanismo para designar manipuladores de eventos. e apenas isso. e você imediatamente - "não transmitido"))))))))))) Sim, tudo é maravilhoso transmitido!)) Procure por um erro em casa.



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

Upss ....
Ok, eu entendi ... :) callback ... ok ... então a pergunta!
O que você escreveu então .... sobre a parte dll entendi .. sim funciona corretamente .... ele envia um endereço para EventHendler .... OK
Mas aqui está um engate com o programa ... para mais detalhes? O que você escreveu ... não percebe EventHendler .... confesso que nem entendi o que estamos fazendo no programa .....



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

EM QUE PROGRAMA? Ambas DLL e EXE são programas. Use, por exemplo, termos como "código de chamada" e "código chamado". Caso contrário - não é uma maldita coisa é claro o que você está falando ....



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

OK :)
Mas com o código de chamada, um engate ... posso dar mais detalhes? O que você escreveu ... não percebe o EventHendler ... Confesso que nem entendi o que estamos fazendo nele. .....
E também é obrigatório puxar o Socket ... no código de chamada?



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

O que significa "puxar"? Quanto tempo vamos falar estupidamente no jargão?

O TSocketServer que você criou na DLL informa a você no parâmetro Socket do evento OnClientRead sobre qual cliente específico enviou o pacote de dados.



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

Traga seu fragmento de código supostamente quebrado - comentarei onde você está especificamente. Bem, como você explica nos dedos?



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

Aqui está o que eu escrevi na DLL:
procedimento ClientRead (servidores: TServerSocket; EventHandler: TSocketNotifyEvent); exportar; começar ServerS.OnClientRead: = EventHandler; fim;
No desafio código:
Digite TForm1 = classe (TForm) Memo1: TMemo; procedimento OnClientRead (Sender: TObject; Soquete: TCustomWinSocket); procedimento TForm1.OnClientRead (Sender: TObject; Soquete: TCustomWinSocket); começar memo1.lines.Insert (0, Socket.ReceiveText); fim;


E o que mais significou:

SetOnClientRead (ServerSocketInstanceCreatedInDll, MyObjectInstance.OnClientRead);



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

Se bem entendi o que você precisa:

em exe

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

função cbak (info: pointer)
começar
showmessage ("oops!");
end;

/ * em algum lugar na inicialização * /
MyCallackRegister (@cbak);

em dll

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

procedimento MyCallackRegister (addr: TMyCallBackProc); // e não se esqueça de exportá-lo
começar
CbakAddr: = addr;
end;

......................
/ * e este é um manipulador de eventos * /
procedimento Datamodule1PosleAtomnoiVoiny (remetente: TTerrorist);
começar
CbackAddr (remetente);
end;

!!! Eu escrevi aqui, talvez onde o fio, o fio-dental não cresce juntos, mas a ideia não sofre com isso



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

> petr_v_a
Tudo está bem ... só os machados que woleyshon estavam cansados ​​de ...

Pergunta ruim
o que você quis dizer

função cbak (info: pointer) começar showmessage ("oops!"); fim;

onde não está terminado ... que função .... mas é tão uma falha ..
e como assustar esses acessos?
Eu não sei o que pensar
O programa se inclina em um momento semelhante a este em seu código ... CbakAddr: = addr;



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

Sim, acesse voleyshon zadolbali :-)



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

> Eugene Zelikovsky
e eu avisei :) a ideia plantado que tudo está em code corretamente, eu não respondo.



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

> Eugene Zelikovsky ©
Você não pode usar o método como funções de retorno de chamada, mas passar como parâmetro um link separado para o objeto de chamada e o endereço da função de adaptador linear. É ainda melhor usar a convenção stdcall para trabalhar com Dll (conseguiremos uma melhor compatibilidade com outras ferramentas de desenvolvimento). Por exemplo, assim (apenas uma abordagem geral):

tipo
TMyCallback = procedure (referência: ponteiro); stdcall; // procedimento do adaptador de retorno de chamada

Procedimento exportado:

procedure SomeProc (Referência: ponteiro; MyCbk: TMyCallback); stdcall;

Ligue para ela assim:

procedimento TMyObject.CallSomeProc;
começar
SomeProc (Self, @MyCallback);
end;

procedimento TMyObject.SomeMethod;
começar
// alguma ação
end;

Manipulador de procedimento de retorno de chamada:

procedure MyCallback (Referência: ponteiro); stdcall;
começar
TMyObject (referência) .SomeMethod;
end;

Talvez você goste desta opção mais :)



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

> macio-y
Mas "as funções de retorno de chamada do método não são apenas" não podem ser usadas "e, se você usá-las, o acessório é garantido



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

> petr_v_a
Em geral, eu fiz o método que você sugeriu trabalhar ... mas apenas uma vez ... então ele não liga ... não responde ...
> macio-y
Eu não entendi o seu método
o que você quis dizer:
procedure MyCallback (Referência: ponteiro); stdcall; começar --- TMyObject (referência) .SomeMethod; --- // aqui fim;



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

Trabalhar com DLL em qualquer livro mais ou menos decente no Delphi é descrito.
Eu comprei um livro, li, compreendi (é necessário!).

E por que estamos falando e plantando jardins aqui?

PS Uma pessoa não sabe como trabalhar com uma DLL - deixe-o estudar, e então ele já pensa se vale a pena rechear os sockets lá.



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

> IZEN
em um livro não menos decente, o trabalho com uma DLL é descrito como:
você pode colocar essa função sim que te contará 2 + 2 ...
и т.п.
E o trabalho com retorno de chamada é escrito principalmente na seção COM / DCOM e isso é tudo ... com o qual estou apenas começando a aprender ...
Bem, não quando eu não usei CALLBACK e .... agora eu quero aprender ....
e não há nada para ser indignado ... Se inteligente me diga ... se não houver silêncio ...



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

> Eugene Zelikovsky Por que uma vez, é na lógica do programa, olha, além de vocês, eles estão mentindo, quem vai descobrir, pelo menos, é outra questão. Trabalhe duro, depure mais se, e não preste atenção a ninguém :)



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

callback - o chamado "retorno de chamada". Ele foi inventado para que qualquer programa pudesse “destacar” sua função (seu endereço) para outro programa, de modo que o último (outro programa) pudesse chamá-lo no primeiro sem recompilar e / ou analisar o código do primeiro programa - isso é rude.

Os retornos de chamada são usados ​​em qualquer programa de janela com manipulação de eventos: por exemplo, manipuladores de eventos escritos por um programador são participantes diretos em chamadas de retorno de chamada da função principal do manipulador de eventos de janela do Windows. Isso é tudo.

Sim, mesmo ao escrever um manipulador de eventos de botão no Delphi, você escreve um procedimento de retorno de chamada, que o compilador atribuirá às funções da janela de botão.

Mesmo no início de Pascal, o tipo de procedimento é usado para fornecer o mecanismo de retorno de chamada (retorno de chamada ou chamada tardia):
digitar TMyProcedure = procedure (a: Inteiro; b: Char; c: String [23]); var MyHandler: TMyProcedure; procedimento OtherProcedure (a: Integer; b: Char; c: String [83]); começar WriteLn (a); WriteLn (b); WriteLn (c); fim; COMEÇAR ... MyHandler: = OutroProcedimento; ... MyHandler (10, "f", "Saudações do fundo do meu coração!"); END.

Então, é melhor primeiro estudar o trabalho com a DLL, será mais lógico.



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

Eu aconselho você a não ligar os conceitos de callback e COM / DCOM, isso não ajuda muito no estudo do problema.



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

> TMyProcedure = procedure (a: Inteiro; b: Char; c: String [23]);
Correção:
tipo
TMyProcedure = procedure (a: Inteiro; b: Char; c: String [83]);



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

> Eugene Zelikovsky ©

Explicação:

A biblioteca não precisa conhecer o tipo de nosso objeto, portanto, simplesmente passamos um ponteiro não digitado quando o procedimento é chamado pela biblioteca. Existem linguagens nas quais os tipos de referência estão completamente ausentes - neste caso vale a pena converter um ponteiro para o nosso objeto para Integer.

procedimento TMyObject.CallSomeProc; começar SomeProc (Self, @MyCallback); fim;

No código DLL:

procedure SomeProc (Referência: ponteiro; MyCbk: TMyCallback); stdcall; começar // ... Algumas ações MyCbk (referência); // Call Callback fim;

Assim, no manipulador de procedimento de retorno de chamada, executamos explicitamente a conversão de tipo

procedure MyCallback (Referência: ponteiro); stdcall; começar TMyObject (referência) .SomeMethod; // aqui !!! fim;

Em COM / DCOM, a propósito, mecanismos completamente diferentes são usados ​​para propósitos similares.



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

Obrigado a todos, ganhei !!!!!!!
> petr_v_a
Sua abordagem acabou por ser o mais funcional .... com pequenas correções para o meu programa ...
> iZEN
E obrigada pela ajuda ... e uma excursão pela história !!!!



Страницы: 1 filial inteira

Fórum: "Principal";
Arquivo atual: 2002.01.08;
Download: [xml.tar.bz2];

em cima









Memória: 0.65 MB
Hora: 0.033 c
4-22508
Gluka
2001-11-06 00:18
2002.01.08
É possível mudar o cursor sobre a janela de outra pessoa?


1-22191
stalker_boss
2001-12-16 02:50
2002.01.08
Som


1-22246
Andrey196
2001-12-16 22:03
2002.01.08
Como criar um cursor de cor no editor de imagens da Borland


1-22018
Delphig
2001-12-18 01:51
2002.01.08
Imprimir texto de Memo! Eu tenho algo errado ....


7-22427
KLM
2001-09-20 06:34
2002.01.08
Proteção contra cópia





afrikaans albanês Arabic armênio azerbaijano basco belarusian Bulgarian catalão Chinês simplificado) Chinês tradicional) croata checo dinamarquês Dutch Inglês estoniano filipino Finnish French
Galego georgiano German grego crioulo haitiano hebraico hindi húngaro islandês Indonesian irlandês Italian Japanese Korean letão lituano macedónio Malay maltês Norwegian
persa polonês Portuguese romeno Russa sérvio Slovak esloveno espanhol swahili sueco tailandês turco ucraniano urdu vietnamita galês ídiche bengali bósnio
cebuano esperanto gujarati hausa hmong igbo javanês kannada khmer lao latino maori marata mongol Nepali punjabi somali tâmil telugu yoruba
zulu
Английский francês Alemão Italiano Португальский russo Espanhol