Piszę coś w rodzaju komunikatora w oparciu o środowisko Borland C++ Builder 6.
Do komunikacji wykorzystuję WinSock2 (niestety wymagania projektu nie zezwalają na użycie wbudowanych kontrolek BCB do obsługi socketów).
Do rzeczy... Mam problem z klientem, a dokładniej z asynchronicznym odbiorem wiadomości.
Zaplanowałem sobie to tak:
- aplikacja ma dwie "formy"
- pierwsza forma (główna) łączy z serwerem (to działa ok) i wywołuje asynchroniczne odbieranie wiadomości (po kliknięciu w button)
- uchwytem do odbioru tych wiadomości jest forma druga
Nie mogę sobie tylko poradzić z odczytem wiadomości wysyłanej do tego drugiego okienka.
Unit1
KOD cpp: UKRYJ
void __fastcall TForm1::Button1Click(TObject *Sender)
{
HWND okno = Form2->Handle; // uchwyt do drugiego okna ktore ma odbierac wiadomosci
// kod laczenia z serwerem
// pomijam go bo tu wszystko działa poprawnie
// po wywołaniu connect() następuje
WSAAsyncSelect(ConnectSocket,okno,WM_USER,FD_CONNECT|FD_READ|FD_WRITE|FD_ACCEPT);
}
{
HWND okno = Form2->Handle; // uchwyt do drugiego okna ktore ma odbierac wiadomosci
// kod laczenia z serwerem
// pomijam go bo tu wszystko działa poprawnie
// po wywołaniu connect() następuje
WSAAsyncSelect(ConnectSocket,okno,WM_USER,FD_CONNECT|FD_READ|FD_WRITE|FD_ACCEPT);
}
Forma druga, odbierająca wiadomości - unit2 (uchwyt okno)
KOD cpp: UKRYJ
// funkcja wirtualna łapiąca wiadomości
void __fastcall TForm2::WndProc(TMessage &Message)
{
switch(Message.Msg)
{
case WM_USER:
Form2->Label1->Caption="zlapana";
break;
}
TForm::WndProc(Message);
}
// konstruktor
__fastcall TForm2::TForm2(TComponent* Owner)
: TForm(Owner)
{
Form2->Label1->Caption="start";
// właściwie tutaj nie wiem czy coś trzeba dawać
// próbowałem poniższe konstrukcje lecz bezskutecznie :/
//MSG Msg;
//GetMessage(&Msg, this, WM_USER, WM_USER+4);
//TranslateMessage(&Msg);
//DispatchMessage(&Msg);
}
Jak normalnie uruchamiam program to po kliknięciu buttona zawieszają się obie formy.
Przy debbugowaniu linia po lini:
1. wywoływany jest konstruktor Form1
2. wywoływany jest konstruktor Form2, ale nie wywołuje kodu znajdującego się w nim tylko przechodzi do punktu 3.
3. kilkanaście lub nawet kilkadziesiąt razy wywoływana jest funkcja Form2::WndCmd - ani razu nie jest spełniony case WM_USER
4. pojawiają się okna (na przemiennie z wywoływaniem WndCmd)
5. klikam przycisk z Form1
6. łączy się z serwerem
7. wysyła "powitalną" wiadomość
8. wywołuje: WSAAsyncSelect()
9. przechodzi do WndCmd i tym razem spełniany jest case WM_USER
10. teraz nie ma już kontroli nad formami
Byłbym wdzięczny za jakiekolwiek naprowadzenie mnie na rozwiązanie tego problemu.






