Enviar msg p/ uma dll
Olá pessoal, alguém saberia me dizer como uma aplicação pode enviar uma mensagem para uma thread que está executando em uma dll?
Antecipados agradecimentos !!!
Antecipados agradecimentos !!!
Persist
Curtidas 0
Respostas
Nildo
16/07/2004
Para fazer isso você deve criar um controle (no caso o Form) que terá seu Handle, dentro da Thread. Só assim você poderá enviar mensagens para esse Form e seu Form vai capturar. Mas é claro, tudo isso invisível.
Mas depende do que você quer fazer pode utilizar FileMapping. Quer descrever a situação? Dependendo da situação eu te ensino a utilizar esse FileMapping.
Mas depende do que você quer fazer pode utilizar FileMapping. Quer descrever a situação? Dependendo da situação eu te ensino a utilizar esse FileMapping.
GOSTEI 0
Persist
16/07/2004
Por exemplo:
App.exe chama uma função na dll que instancia um objeto descendente de TThread. A thread na dll fica executando um cálculo x informado no parâmetro da função. Quando este cálculo x chega num determinado ponto, a dll avisa a App.exe que chegou no ponto p através de um SendMessage com o Handle do Form de App.exe, também informado como parâmetro na função. Até aí beleza, a thread se comunica com App.exe.
Acontece que App.exe tem que decidir como esse cálculo prosseguirá ou até mesmo terminar a execução da thread, dependendo do valor de WParam.
São threads pq App.exe pode ser chamado várias vezes e até mesmo um App.exe pode chamar a função na dll para executar cálculos diferentes.
Pensei no Handle da thread, mas não ví forma de enviar msgs com ele.
Pensei também no PostThreadMessage, mas ainda não o utilizei e não sei como funciona.
App.exe chama uma função na dll que instancia um objeto descendente de TThread. A thread na dll fica executando um cálculo x informado no parâmetro da função. Quando este cálculo x chega num determinado ponto, a dll avisa a App.exe que chegou no ponto p através de um SendMessage com o Handle do Form de App.exe, também informado como parâmetro na função. Até aí beleza, a thread se comunica com App.exe.
Acontece que App.exe tem que decidir como esse cálculo prosseguirá ou até mesmo terminar a execução da thread, dependendo do valor de WParam.
São threads pq App.exe pode ser chamado várias vezes e até mesmo um App.exe pode chamar a função na dll para executar cálculos diferentes.
Pensei no Handle da thread, mas não ví forma de enviar msgs com ele.
Pensei também no PostThreadMessage, mas ainda não o utilizei e não sei como funciona.
GOSTEI 0
Nildo
16/07/2004
Persist, quando você envia uma mensagem da DLL para o EXE, e o EXE deva responder, se eu não me engano você pode responder pelo LParam do SendMessage (se eu nao estiver enganado). Não precisa ficar numa thread separada porque quando vc chama SendMessage da DLL pro EXE, na DLL só vai passar pra próxima linha quando acabar de executar o CallBack do EXE.
GOSTEI 0
Persist
16/07/2004
Não precisa ficar numa thread separada porque quando vc chama SendMessage da DLL pro EXE, na DLL só vai passar pra próxima linha quando acabar de executar o CallBack do EXE.
Como assim thread separada?
Eu queria ter um jeito de App.exe mandar uma msg para a mesma thread que enviou o SendMessage.
Agora se App.exe puder modificar os parâmetros do SendMessage e essa modificação refletir no retorno na dll, então meu problema está resolvido.
Vou fazer um teste.
Obrigado!!!
GOSTEI 0
Beppe
16/07/2004
Para modificar um parâmetro de SendMessage, passe o ponteiro para uma estrutura para LParam(ou WParam) e caste pra Integer.
Ou:
No seu thread, crie um handle de janela para que possa receber mensagens(veja na implementação de TTimer em ExtCtrls para um idéia). Então defina as novas mensagens que seram processadas por esta janela, mensagens enviadas pelo App.exe.
Existem outras técnicas esta é só mais uma.
Ou:
No seu thread, crie um handle de janela para que possa receber mensagens(veja na implementação de TTimer em ExtCtrls para um idéia). Então defina as novas mensagens que seram processadas por esta janela, mensagens enviadas pelo App.exe.
Existem outras técnicas esta é só mais uma.
GOSTEI 0
Persist
16/07/2004
Olá Beppe!
Pensei nisso, em criar um Form ´fantasma´ na thread só p/ poder receber mensagens, mas iria ser um quebra-galho e queria ver se existiria outra maneira.
Outra coisa, vc disse em Cast p/ Integer; e se o parâmetro for um THandle, ou algo do tipo que requeira um DWord?
Pensei nisso, em criar um Form ´fantasma´ na thread só p/ poder receber mensagens, mas iria ser um quebra-galho e queria ver se existiria outra maneira.
Outra coisa, vc disse em Cast p/ Integer; e se o parâmetro for um THandle, ou algo do tipo que requeira um DWord?
GOSTEI 0
Beppe
16/07/2004
Vc quer passar um THandle? Tipo, o thread manda um THandle e recebe outro de volta?
Para acessar o handle passado dentro do App.exe:
Não importa o tipo de dados já que está passando um ponteiro, não os dados atuais. (importa se for string, variant ou interface, mas aí é outra história).
var H: THandle; ... H := ...; SendMessage(..., Integer(@H)); ...H... ...
Para acessar o handle passado dentro do App.exe:
THandle(Pointer(LParam)^)
Não importa o tipo de dados já que está passando um ponteiro, não os dados atuais. (importa se for string, variant ou interface, mas aí é outra história).
GOSTEI 0
Nildo
16/07/2004
Olá Beppe!
Pensei nisso, em criar um Form ´fantasma´ na thread só p/ poder receber mensagens, mas iria ser um quebra-galho e queria ver se existiria outra maneira.
Outra coisa, vc disse em Cast p/ Integer; e se o parâmetro for um THandle, ou algo do tipo que requeira um DWord?
Eu aconselho você a criar uma estrutura para o envio de mensagem. Quando ele disse castar para Inteiro ficaria assim:
SendMessage( blablabla, Integer( SuaVariavel ), blablabla );
onde SuaVariavel seria do tipo de sua estrutura. A DLL ficaria parada nessa linha e a execução agora passa para o EXE, e no EXE você faz as modificações necessarias nessa estrutura e vala que
WParam := Integer( SuaEstrutua_Alterada )
Estou meio ocupado para fazer um demo completo, mas é assim que se deve fazer.
GOSTEI 0
Persist
16/07/2004
Entendí, vc manda o endereço da variável convertido para um Integer.
E este valor de endereço nunca ultrapassa o High(Integer) ?
E este valor de endereço nunca ultrapassa o High(Integer) ?
GOSTEI 0
Nildo
16/07/2004
Entendí, vc manda o endereço da variável convertido para um Integer.
E este valor de endereço nunca ultrapassa o High(Integer) ?
Nunca.
Esse Integer( Pointeiro ) retorna a posição da memória do PC onde está esse ponteiro. Aqueles $FFFFFF que você vê é obtido assim:
´$´ + IntToHex( Integer( Ponteiro ), 6 )
GOSTEI 0
Beppe
16/07/2004
Não importa o valor como Integer, pq vc naum vai fazer aritmética nele. Na verdade, pode ser qualquer tipo numérico de 32 bite, como Cardinal ou DWORD ou LParam.
GOSTEI 0
Persist
16/07/2004
Ok, pessoal muiiíssimo obrigado a todos.
:D
:D
GOSTEI 0