Fórum Enviar msg p/ uma dll #243456

16/07/2004

0

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 !!!


Persist

Persist

Responder

Posts

16/07/2004

Nildo

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.


Responder

Gostei + 0

16/07/2004

Persist

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.


Responder

Gostei + 0

16/07/2004

Nildo

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.


Responder

Gostei + 0

16/07/2004

Persist

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!!!


Responder

Gostei + 0

16/07/2004

Beppe

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.


Responder

Gostei + 0

16/07/2004

Persist

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?


Responder

Gostei + 0

16/07/2004

Beppe

Vc quer passar um THandle? Tipo, o thread manda um THandle e recebe outro de volta?

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


Responder

Gostei + 0

16/07/2004

Nildo

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.


Responder

Gostei + 0

16/07/2004

Persist

Entendí, vc manda o endereço da variável convertido para um Integer.
E este valor de endereço nunca ultrapassa o High(Integer) ?


Responder

Gostei + 0

16/07/2004

Nildo

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 )


Responder

Gostei + 0

16/07/2004

Beppe

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.


Responder

Gostei + 0

16/07/2004

Persist

Ok, pessoal muiiíssimo obrigado a todos.
:D


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar