Problemas utilizando PostMessage

Delphi

06/02/2004

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

Nildo

Curtidas 0

Respostas

Nildo

Nildo

06/02/2004

Alguem tem alguma solução para isso?


GOSTEI 0
Beppe

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

Nildo

06/02/2004

Com o SendMessage tb nao funciona =(


GOSTEI 0
Beppe

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

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?


GOSTEI 0
Beppe

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


GOSTEI 0
Nildo

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]


GOSTEI 0
Beppe

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

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

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?


GOSTEI 0
Nildo

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


GOSTEI 0
Nildo

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


GOSTEI 0
Beppe

Beppe

06/02/2004

Falou! :P


GOSTEI 0
POSTAR