Re: SendMessage() from CAsyncSocket to CDialog.
I just wanted to add to David and Scotts answers, that although this is a
good solution, I prefer to use a more direct method. It might look somewhat
complicated at first but once you have your socket class setup then you can
use it anywhere with anything class which doesn't have to be a window at
all. For example lets say that you are a server and are going to handle a
bunch of sockets, you don't want to create a window for every socket, nor
would you want to handle all the sockets from within one window.
Here is what I do:
I have base call CSocketMessageHandler, which generally looks like this
class CSocketMessageHandler
{
public:
//called when socket accepts a connection
virtual void NewConnection(UINT Port,SOCKET hSocket) {ASSERT(FALSE); }
//called when a socket is closed
virtual void SocketClosed(SOCKET hSocket) {ASSERT(FALSE) ; }
//called when an error happens as a result of a socket opperation
virtual void SocketError(int Error,SOCKET hSocket) {ASSERT(FALSE); }
//called when data is received, it is setup in a CSocketMessage struct
virtual void ProcessMessage(CSocketMessage *pMsg,SOCKET hSocket)
{ASSERT(FALSE); }
};
Now my socket class accepts a pointer to this class as the owner of the
socket, and when it needs to notify the owner of the socket of some event
then it will simply call one of the methods above.
This way I can inherit from the above class anywhere I want, using multiple
inheritance.
An example of this is a one to many connections that I have, each of the
connections is a student connecting to a teacher machine, so my listen
socket has an owner that implements the NewConnection method, and there it
creates a student object and sets the owner of the new connection to that
particular student, from that point on any data that arrives for that socket
goes directly to that particular student object.
AliR.
(I've been meaning to post this solution on CodeProject)
"nexolite" <nexolite@discussions.microsoft.com> wrote in message
news:79CABD9D-617E-44B3-93EE-BE108D45A0C4@microsoft.com...
This is in reference to following post:
http://groups.google.co.in/group/microsoft.public.vc.mfc/browse_thread/thread/26d525c01a51ca3/cbc7666feab318ed?lnk=gst&q=nexolite#cbc7666feab318ed
here I wanted to implement the SendMessage() to dialog class method as
suggested by joe.
here is what his post was:
*************
void ConnectionManager::OnAccept(int nErrorCode)
{
if(nErrorCode == 0)
{ /* got it! */
ConSock * sock = new ConSock;
if(Accept(*sock))
{ /* got connection */
pwnd->SendMessage(UWM_CONNECTED, (WPARAM)sock);
} /* got connection */
else
... deal with error
} /* got it */
else
... deal with error
}
Note that this does not require ANY knowledge of what the parent class is,
what its type
is, the header file from the parent class, or anything else.
****
But here he is using pwnd (which in my code was CDialog*),
but then if you are using pwnd, then how does it not require any knowledge
of the parent class?
or what is the way to SendMessage to the CDialog window?