GARANTIR DESCONTO

Fórum Problemas utilizando PostMessage #212121

06/02/2004

0

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

Responder

Posts

06/02/2004

Nildo

Alguem tem alguma solução para isso?


Responder

Gostei + 0

06/02/2004

Beppe

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)


Responder

Gostei + 0

06/02/2004

Nildo

Com o SendMessage tb nao funciona =(


Responder

Gostei + 0

06/02/2004

Beppe

Não entendo porque MeuFormularioPrincipal.Handle não recebe a mensagem. Checou o valor de retorno do SendMessage? Tenta passar HWND_BROADCAST como Hwnd.


Responder

Gostei + 0

06/02/2004

Nildo

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?


Responder

Gostei + 0

06/02/2004

Beppe

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


Responder

Gostei + 0

06/02/2004

Nildo

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]


Responder

Gostei + 0

06/02/2004

Beppe

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?


Responder

Gostei + 0

06/02/2004

Nildo

Eh que eu pensava que usava com o PostMesage mas acho que era com o SendMessage mesmo. Por isso disse que derrepente parou


Responder

Gostei + 0

06/02/2004

Beppe

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?


Responder

Gostei + 0

07/02/2004

Nildo

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


Responder

Gostei + 0

07/02/2004

Nildo

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


Responder

Gostei + 0

07/02/2004

Beppe

Falou! :P


Responder

Gostei + 0

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

Aceitar