Passing a GUI handle to a socket and Postmessage back to GUI
I have a MDI application with several child windows and a TCPIP server. I
want to pass the handle (of one child) to a server socket class so it can
post a message to the child window when data is received. When the data is
received by the child window, a listbox will display the data.
I have it working, but I wonder if there is a better way of passing (or
getting) the handle. I have to pass it twice to get it into the
OnReceive() Handler of CServer.cpp.
// Click a button and start the listener - couldn't get it to work in
constructor (handle not created yet?) - "SocketWindow" is UI class
void SocketWindow::OnButton1()
{
sockServ = new MySocket(CWnd::m_hWnd); //Is this the best way to
get/pass the handle?
sockServ->Create(1001);
sockServ->Listen();
}
void SocketWindow::OnSockMSG(UINT wParam, long lParam)
{
CString * ptr = (CString *)wParam;
m_ListBoxAdder.AddString(*ptr);
delete(ptr);
}
// These 4 lines are from MySocket.h
public:
MySocket(HWND);
virtual ~MySocket();
CServer client;
HWND ChildWindowHandle;
// Constructor MySocket.cpp
MySocket::MySocket(HWND MyHandle)
{
ChildWindowHandle = MyHandle;
}
// MySocket.cpp
void MySocket::OnAccept(int nErrorCode)
{
if (nErrorCode == 0)
{
this->Accept(client);
// IS THIS A PROBLEM? "client" is declared in CServer.h
client.HandleToChld = ChildWindowHandle ;
}
}
// CServer.cpp
void CServer::OnReceive(int nErrorCode)
{
char buffer[1024] ;
memset(buffer, 0, sizeof(buffer)) ;
this->Receive(buffer, sizeof(buffer)) ;
CString result(buffer);
CString * ptrToData = new CString(result) ;
// "WM_SCKTMSG_RECV" is defined in stdAfx.h (#define WM_SCKTMSG_RECV
WM_USER + 3), executes "OnSockMSG" above
::PostMessage(HandleToChld, WM_SCKTMSG_RECV, (WPARAM)ptrToData,
(LPARAM)0);
//CAsyncSocket::OnReceive(nErrorCode);
}
Although this code currently works, it does not feel right (passing the
handle in the constructor??).
There has to be a better way of doing this. Any suggestions?
Thanks,
KW