SendMessage com problema no Windows 9x (nos demais está OK)
Galera,
Tenho o seguinte código:
[b:acf4d1e33d]procedure Envia;
var
CDS: TCopyDataStruct;
DebugWin: hWnd;
begin
DebugWin := FindWindow(´TForm1´, nil); //TFmDebug : Classe do Form ( T + Nome do form)
CDS.cbData := Length(´1´) + 4;
CDS.dwData := 0;
CDS.lpData := PChar(´1´+#0); //0 é necessário para indicar fim da mensagem pra quem recebe a mensagem;
[color=blue:acf4d1e33d]SendMessage(DebugWin, WM_COPYDATA, WPARAM(Application.Handle), LPARAM(@CDS));[/color:acf4d1e33d]
end;[/b:acf4d1e33d]
Meu problema é que o código acima FUNCIONA PERFEITAMENTE no Windows XP e no Windows 2000 mas, na última linha (a em azul no código acima) dá pau no Windows 98. O interessante é que o aplicativo que recebe a mensagem a recebe normalmente pois ele exibe a mensagem mas sempre que executo no Windows 98 dá pau. Alguma sugestão? Detalhe: essa procedure é chamada de dentro de uma DLL. A DLL foi compilada no Windows XP e depois no Windows 98 e problema continua.
Tenho o seguinte código:
[b:acf4d1e33d]procedure Envia;
var
CDS: TCopyDataStruct;
DebugWin: hWnd;
begin
DebugWin := FindWindow(´TForm1´, nil); //TFmDebug : Classe do Form ( T + Nome do form)
CDS.cbData := Length(´1´) + 4;
CDS.dwData := 0;
CDS.lpData := PChar(´1´+#0); //0 é necessário para indicar fim da mensagem pra quem recebe a mensagem;
[color=blue:acf4d1e33d]SendMessage(DebugWin, WM_COPYDATA, WPARAM(Application.Handle), LPARAM(@CDS));[/color:acf4d1e33d]
end;[/b:acf4d1e33d]
Meu problema é que o código acima FUNCIONA PERFEITAMENTE no Windows XP e no Windows 2000 mas, na última linha (a em azul no código acima) dá pau no Windows 98. O interessante é que o aplicativo que recebe a mensagem a recebe normalmente pois ele exibe a mensagem mas sempre que executo no Windows 98 dá pau. Alguma sugestão? Detalhe: essa procedure é chamada de dentro de uma DLL. A DLL foi compilada no Windows XP e depois no Windows 98 e problema continua.
Willian
Curtidas 0
Respostas
Nildo
01/11/2005
Na verdade, o erro é no seu CallBack. Pois se der erro lá, vai dar erro consequentemente na sua linha do SendMessage.
Coloca aqui o código do momento em que a aplicação recebe o wm_copydata!
Um abraço
Coloca aqui o código do momento em que a aplicação recebe o wm_copydata!
Um abraço
GOSTEI 0
Willian
01/11/2005
O código que recebe a mensagem é:
Sendo que a declaração ficou:
Se puder me ajudar, agradeço desde já.
Valeu.
procedure TForm1.WMCopyData(var Message: TWMCopyData); var Dados : TCopyDataStruct; ConteudoMensagem : PChar; Contador : Integer; Mensagem : String; begin Dados := Message.CopyDataStruct^; ConteudoMensagem := Dados.lpData; Mensagem := ´´; Contador := 1; While ConteudoMensagem[Contador] <> 0 do Begin Mensagem := Mensagem + ConteudoMensagem[Contador]; Contador := Contador + 1; End; ShowMessage(Mensagem); end;
Sendo que a declaração ficou:
type TForm1 = class(TForm) procedure WMCopyData(var Message: TWMCopyData); message WM_COPYDATA;
Se puder me ajudar, agradeço desde já.
Valeu.
GOSTEI 0
Nildo
01/11/2005
Faz assim: No [b:1180866547]dwData[/b:1180866547], passe o tamanho do texto que você quer passar. Daí na hora de ler, ao invez de usar um While para verificar o fim da String, copie exatamente os [b:1180866547]dwData[/b:1180866547] (como N) bytes recebidos pela mensagem. E remova a analogia do #0 para identificar o fim da string.
GOSTEI 0