Problemas utilizando PostMessage
Olá!
Não sei porque mas o PostMessage parou de funcionar aqui. Estou usando a mensagem Wm_CopyData para manter uma comunicação entre EXE/DLL.
Então na DLL eu fiz assim:
E no formulario do meu EXE eu coloquei no Private para interceptar o WM_COPYDATA:
Mas o problema é que não esta caindo na funcao Intercepta. Alguem sabe porque?
Eu tenho certeza absoluta de que o Handle_Do_Formulario_Do_Exe está certo.
Obrigado!
Não sei porque mas o PostMessage parou de funcionar aqui. Estou usando a mensagem Wm_CopyData para manter uma comunicação entre EXE/DLL.
Então na DLL eu fiz assim:
var MinhaEstrutura: TMinhaEstrutura; wmCopyData: TCopyDataStruct; begin wmCopyData.dwData := 0; wmCopyData.cbData := SizeOf( TMinhaEstrutura ); wmCopyData.lpData := @MinhaEstrutura; PostMessage( Handle_Do_Formulario_Do_Exe, WM_COPYDATA, 0, Integer( @WmCopyData ) ); end;
E no formulario do meu EXE eu coloquei no Private para interceptar o WM_COPYDATA:
Private procedure Intercepta(var Msg: TWMCopyData); message WM_COPYDATA;
procedure TMeuFormularioPrincipal.Intercepta(var Msg: TWMCopyData); begin ShowMessage( ´Mensagem recebida´ ); end;
Mas o problema é que não esta caindo na funcao Intercepta. Alguem sabe porque?
Eu tenho certeza absoluta de que o Handle_Do_Formulario_Do_Exe está certo.
Obrigado!
Nildo
Curtidas 0
Respostas
Nildo
06/02/2004
Alguem tem alguma solução para isso?
GOSTEI 0
Beppe
06/02/2004
Acredito que COPYDATA só é possível via SendMessage, já que a chamada must be síncrona(o windows precisa copiar os dados para o address space do processo recebendo)
GOSTEI 0
Nildo
06/02/2004
Com o SendMessage tb nao funciona =(
GOSTEI 0
Beppe
06/02/2004
Não entendo porque MeuFormularioPrincipal.Handle não recebe a mensagem. Checou o valor de retorno do SendMessage? Tenta passar HWND_BROADCAST como Hwnd.
GOSTEI 0
Nildo
06/02/2004
Só sei que com o PostMessage retorna False. Dae eu mando pegar o GetLastError e me retorna: ´Não é possivel abrir um arquivo que ja esta aberto´ :roll:
O que o sendMessage retorna? Ele retorna inteiro. Mas o que é este numero?
O que o sendMessage retorna? Ele retorna inteiro. Mas o que é este numero?
GOSTEI 0
Beppe
06/02/2004
O SendMessage retorna o que a janela que processou a mensagem mandou como resposta, isto é, se houve alguma janela.
Dá uma pesquisada por WM_COPYDATA e SendMessage em [url]http://msdn.microsoft.com/library[/url]. Tá lá com Windows User Interface(mas usa a busca).
Dá uma pesquisada por WM_COPYDATA e SendMessage em [url]http://msdn.microsoft.com/library[/url]. Tá lá com Windows User Interface(mas usa a busca).
GOSTEI 0
Nildo
06/02/2004
Olha só o que eu achei:
[quote:40fd37c750=´Um autor desconhecido´]It´s worth noting that the WM_COPYDATA message will work going to and from any combination of 6/32 bit applications. Finally, be aware that the call to SendMessage will not return untill the message is processed. [b:40fd37c750]Also be aware that you should never use PostMessage() with the WM_COPYDATA message[/b:40fd37c750].[/quote:40fd37c750]
[quote:40fd37c750=´Um autor desconhecido´]It´s worth noting that the WM_COPYDATA message will work going to and from any combination of 6/32 bit applications. Finally, be aware that the call to SendMessage will not return untill the message is processed. [b:40fd37c750]Also be aware that you should never use PostMessage() with the WM_COPYDATA message[/b:40fd37c750].[/quote:40fd37c750]
GOSTEI 0
Beppe
06/02/2004
Olha só o que eu achei:
[quote:690dd9259e=´Um autor desconhecido´]It´s worth noting that the WM_COPYDATA message will work going to and from any combination of 6/32 bit applications. Finally, be aware that the call to SendMessage will not return untill the message is processed. [b:690dd9259e]Also be aware that you should never use PostMessage() with the WM_COPYDATA message[/b:690dd9259e].
[/quote:690dd9259e]Exato. Pelo fato de que esta mensagem é interpretada pelo Windows(as outras são apenas mesnsagens). Quando chama SendMessage, o Windows aloca um bloco de memória no contexto do processo que recebe e copia os dados passados pra esse buffer. A janela que recebe a mensagem deve usar imediatamente o conteúdo do buffer, já que o Windows libera o buffer tão logo a mensagem é processada.
Mas você disse que ´parou de funcionar´...De repente?
GOSTEI 0
Nildo
06/02/2004
Eh que eu pensava que usava com o PostMesage mas acho que era com o SendMessage mesmo. Por isso disse que derrepente parou
GOSTEI 0
Beppe
06/02/2004
Será que Handle_Do_Formulario_Do_Exe não está sendo sebrescrita? Tenta depurar pra ver o que tem nela...
Como está passando este handle?
Como está passando este handle?
GOSTEI 0
Nildo
06/02/2004
Jah consegui arrumar!
Eh que se tratava de uma DLL. Dae eu estava colocando um valor nela em uma outra procedure. Dae eu estava chamando outra instancia dela que carregava na memoria outro valor do Handle do EXE. Agora eu estou compartilhando um espaco na memoria para poder ser lidaa atravez do EXE e da DLL ao mesmo tempo e o mesmo valor e funcionou =P
Valews
Eh que se tratava de uma DLL. Dae eu estava colocando um valor nela em uma outra procedure. Dae eu estava chamando outra instancia dela que carregava na memoria outro valor do Handle do EXE. Agora eu estou compartilhando um espaco na memoria para poder ser lidaa atravez do EXE e da DLL ao mesmo tempo e o mesmo valor e funcionou =P
Valews
GOSTEI 0
Nildo
06/02/2004
Jah consegui arrumar!
Eh que se tratava de uma DLL. Dae eu estava colocando um valor nela em uma outra procedure. Dae eu estava chamando outra instancia dela que carregava na memoria outro valor do Handle do EXE. Agora eu estou compartilhando um espaco na memoria para poder ser lidaa atravez do EXE e da DLL ao mesmo tempo e o mesmo valor e funcionou =P
Valews
Eh que se tratava de uma DLL. Dae eu estava colocando um valor nela em uma outra procedure. Dae eu estava chamando outra instancia dela que carregava na memoria outro valor do Handle do EXE. Agora eu estou compartilhando um espaco na memoria para poder ser lidaa atravez do EXE e da DLL ao mesmo tempo e o mesmo valor e funcionou =P
Valews
GOSTEI 0
Beppe
06/02/2004
Falou! :P
GOSTEI 0