Fórum Enviar msg p/ uma dll #243456
16/07/2004
0
Antecipados agradecimentos !!!
Persist
Curtir tópico
+ 0Posts
16/07/2004
Nildo
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
16/07/2004
Persist
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
16/07/2004
Nildo
Gostei + 0
16/07/2004
Persist
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
16/07/2004
Beppe
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
16/07/2004
Persist
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
16/07/2004
Beppe
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
16/07/2004
Nildo
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
16/07/2004
Persist
E este valor de endereço nunca ultrapassa o High(Integer) ?
Gostei + 0
16/07/2004
Nildo
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
16/07/2004
Beppe
Gostei + 0
16/07/2004
Persist
:D
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)