[builder cpp]dwie aplikacje + komunikacja

0

Jak przeslać string czy jakieś dane z jednej aplikacji do drugiej.
Problem jest taki że jest aplikacja główna i aplikacja druga która dziala do czasu bo po jakimś czasie nie wykonuje zadania wtedy chce aby wyslała komunikat np string że przestaje działać i się zamyka. Następnie uruchamiana jest aplikacja identyczna (nawet ta sama) która dziala tak samo jak pierwsza aż do momentu i .... tak samo.
POZDRAWIAM--Radek B.

0

Moze przeslac komunikat (message) do glownej aplikacji - no i oczywiscie glowna musi na niego zareagowac...

Przyklad takiej komunikacji masz tu:
http://www.4programmers.net/forum/index.php?action=show&id=4039

PS przyklad jest w Delphi, ale powinno byc podobnie

--
Pawel {Delphi 6 Personal}

Po pierwsze: naciśnij F1

0

Nie sprecyzowałeś, co dokładnie chcesz przesłać, więc podam Ci dwie odpowiedzi:
1)
Jeśli chcesz przesłać do dwóch wartości DWORD, to wystarczy, że w obu aplikacjach zdefiniujesz własny komunikat, np.:
#define WM_MYMESSAGE WM_APP+401
lub dowolny inny NIE zajęty przez Windows (pierwsze 1024) lub inne obiekty (np. ComboBox, ListView, itp. mają zdefiniowane własne dodatkowe komunikaty).
Wtedy w aplikacji wysyłającej komunikat musisz umieścić taką linijkę:
SendMessage(UchwytDoOknaDrugiegoProgramu, WM_MYMESSAGE, Parametr1, Parametr2);
gdzie Parametr1 i Parametr2 to właśnie dane, które chcesz przesłać.
Możesz również użyć funkcji PostMessage aby pierwszy program nie czekał, aż drugi przetworzy komunikat.

Pozostaje jeszcze napisać w programie drugim funkcję obsługi tego komunikatu:

//plik .h
private:
void __fastcall ObslugaKomunikatu(TMessage
Msg);
BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(WM_MYMESSAGE, TMessage, ObslugaKomunikatu);
END_MESSAGE_MAP(TForm);

//plik .cpp
void __fastcall TForm1::ObslugaKomunikatu(TMessage
Msg)
{int par1 = Msg->WParam; //odczytanie parametru #1
int par2 = Msg->LParam; //odczytanie parametru #2
}

Jeśli natomiast chcesz przesłać coś więcej (np. string lub jakąś strukturę) to sprawa jest tylko troszkę bardziej skomplikowana. Otóż w tym przypadku nie przesyłasz już swojego własnego komunikatu, a komunikat WM_COPYDATA. Ten komunikat musisz wysłać za pomocą funkcji SendMessage, a nie PostMessage! Oto przykładowe wykorzystanie:

void TForm1::Wyslij()
{COPYDATASTRUCT MyStruct;
char *str = "Przykład";
MyStruct.dwData = 1; //dowolna liczba - przydatna jeśli wysyłasz różne dane
MyStruct.cbData = strlen(str)+1; //liczba bajtów, którą przesyłamy
MyStruct.lpData = str; //wskaźnik do naszej danej
SendMessage(0, WM_COPYDATA, (int)Handle, (int)&MyStruct);
}

W SendMessage:
Handle - uchwyt okna, które wysyła komunikat
&MyStruct - adres struktury COPYDATASTRUCT, którą przesyłamy

Teraz zajmijmy się programem, który odbierze ten komunikat:

//plik .h
private:
void __fastcall ObslugaKomunikatu(TMessage
Msg);
BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(WM_COPYDATA, TMessage, ObslugaKomunikatu);
END_MESSAGE_MAP(TForm);

//plik *.cpp
{HWND OknaWysylajace = (HWND)Msg->WParam; //uchwyt okna, które wysłało komunikat
int JakasDana = (PCOPYDATASTRUCT(Msg->LParam))->dwData;
int IleBajtow = (PCOPYDATASTRUCT(Msg->LParam))->cbData;
char MyStr;
MyStr = new char[IleBajtow];
strcpy(MyStr, (char
)(PCOPYDATASTRUCT(Msg->LParam))->lpData);
//wykorzystaj MyStr
delete [] MyStr;
}

Uff! Dużo tego. Niestety, pisałem to na zajęciach na uczelni i nie miałem możliwości tego sprawdzić. Jakbym coś zwalił, to napiszcie, a się poprawię :-)

W przykładach Buildera masz plik singleappinstance.cpp, gdzie jest to użyte.

--
"Imagination is more important than knowledge." - A. Einstein

0

DDE - pozdrawiam Rzezba

1 użytkowników online, w tym zalogowanych: 0, gości: 1