|
Yes, you basically will override a few member functions. Remember, asynchronous sockets will not be polled or go into blocking mode... instead you get an event when something interesting happens and can handle it. For example OnConnect() will be called after a succesfull or failed Connect() call, have a look on examples.
|
|
|
|
|
Thanks Moak-I was failing to get the thing to accept a call properly but have cheated now:
<br />
while(true)<br />
{<br />
if(Myskt.Accept(RecSock)==0)<br />
{<br />
SleepEx(10,FALSE);<br />
}<br />
else<br />
{ <br />
Myskt.Onaccept();
break;<br />
}<br />
This is my OnAccept() function as it stands. The function doesn't seem to call it automatically when the if condition is not 0 (i.e the accept completes); instead I am invoking it manually. Can you see what it is that I am doing wrong?
<br />
void Mydamnsocket::OnAccept(int nErrorCode) <br />
{<br />
Mydamnsocket RecSock;<br />
Mydamnsocket::Accept(RecSock);<br />
char Acceptmsg[20]="Connected to server";<br />
Mydamnsocket::Send(Acceptmsg,20);<br />
} <br />
Is it necessary to stick another thread in to deal with this or something?
P.S. You mention about reading the examples section-can you recommend a particular one that contains an implementation of this that isn't too complex? Cheers!
|
|
|
|
|
Sorry, I dont have the time at the moment to search for a good example... actually I tried and didn't find one. Hmm, I remember that old Gnucleus code (1.4.x) used class CAsyncSocket and was a good starting point.
Some notes: You will not call OnAccept() manually, instead wait for it to be called. CAsyncSocket will handle everything in one thread context. So basically there's no need for polling, sleeping, multithreading with it.
Here is a little snippet from my code:
void CSocketServer::OnAccept(int nErrorCode)
{
if(m_nNodesConnected >= m_pref.m_nMaxSockets) return;
CSocketNodePICHAT* pSocket = new CSocketNodePICHAT(this);
if(Accept(*pSocket))
{
pSocket->SetStatus(SOCKET_CONNECTED);
m_NodesList.push_back(pSocket);
m_nNodesConnected++;
} else {
pSocket->SetStatus(SOCKET_DEAD);
delete pSocket;
}
}
Hope it helps
|
|
|
|
|
Ah ha-I can hear the penny finally beginning to drop Thanks for that. One thing though, say I have a simple app that starts my recieve function off when the user hits a button, and this creates a socket and starts to listen to the port. I realise now that onaccept will be called automatically when the client wants to connect to it on the right port#, but what do I do in the rest of the function? Should I simply set up the socket and make it listen; have my function return and then wait... then the program will do the job automatically? I take it that the rest of the functions get called automatically as well once the appropriate event occurs?
(I feel like I'm answering my own questions here-I hate it when that happens )
Thanks again for your help-I appreciate you've got better things to do. I'll let you have a metaphorical beer for all your efforts
|
|
|
|
|
chrisedgington wrote:
I take it that the rest of the functions get called automatically as well once the appropriate event occurs?
yup. fire your stuff and handlers will be called when necesarry.
Thanks for the , cheers!
|
|
|
|
|
That's ok. You sir have been a great help. If you feel like helping more; you might like to tell me why OnAccept and my other member functions are not being called? I have set up a beginsend and a beginreceive function in the document class, which do the following:
beginsend:
<br />
{<br />
int status=0;<br />
Mydamnsocket Myskt;<br />
int nPort = 5001;<br />
CString IPAddy="127.0.0.1";<br />
Myskt.Create();<br />
Myskt.Connect(IPAddy,nPort);<br />
return status;<br />
}<br />
beginrecieve:
<br />
{<br />
int status = 0;<br />
Mydamnsocket Myskt;<br />
Myskt.Create(5001);<br />
Myskt.Listen();<br />
return status;<br />
}<br />
So the user kindly runs up two of these apps and hits recieve in one and send in the other-thus calling these functions. If I watch developments in the Debugger with a few cleverly placed breakpoints (well actually, every darn line at the moment), I would expect to see the program jump into my Mydamnsocket class and the onaccept member function; but it doesn't-it just sits there. This is somewhat puzzling and is stopping me from getting anywhere. Once I can get the functions called I should pretty much be there with this.
Plenty beer for you if you can help?
|
|
|
|
|
Can anyone help me out a little with my tooltip under Win32?
I have created the control (called InitCommonControlsEx also) and filled in my TOOLINFO struct like so:
<br />
ti.cbSize = sizeof(TOOLINFO); <br />
ti.uFlags = TTF_IDISHWND; <br />
ti.hwnd = hwnd; <br />
ti.hinst = hInst; <br />
ti.uId = (UINT) hwndView; <br />
ti.lpszText = (LPSTR) szTool;<br />
hwndView is an owner drawn button btw
Then I added the tool with this message:
<br />
SendMessage(hwndTool, TTM_ADDTOOL, 0, (LPARAM) (LPTOOLINFO) &ti);<br />
and I subclassed the button control and processing the WM_MOUSEMOVE message I sent the following message:
<br />
SendMessage(hwndTool, TTM_RELAYEVENT, 0, (LPARAM) (LPMSG) WM_MOUSEMOVE);<br />
Unfortunately as soon as the mouse enters the button's window the program crashes. What am I missing here? Some help or a link to some other code examples would be much appreciated. Thanks.
|
|
|
|
|
There isn't much I can tell from looking at this code. The first thing I would do is run the Debug build and inspect the crash in the debugger and work back from there.
Neville Franks, Author of ED for Windows. www.getsoft.com
Make money with our new Affilate program
|
|
|
|
|
In Debug mode, as soon as I move the window over the control it crashes with the well know message:
Unhandled exception in ToolTest.exe (COMCTL32.DLL) 0xC0000005: Access Violation
with the yellow pointer pointing to this line:
77365F4F push dword ptr [eax+0Ch]
Unfortunately I am not to good at interpreting the debugger.
I have only posted this code because that is basically all I have. I am confused about whether or not I need a special CALLBACK function to take care of the TTM_RELAYEVENT message or is it handled internally by Windows?
P.S. I have neither set a timer or a hook for relaying of messages
|
|
|
|
|
I don't think you want nor need:
SendMessage(hwndTool, TTM_RELAYEVENT, 0, (LPARAM) (LPMSG) WM_MOUSEMOVE);
Have you tried removing this.
Also add:
memset( &ti, 0, sizeof( TOOLINFO ) );
before: ti.cbSize = sizeof(TOOLINFO);
Have a search around CP for articles which use Tooltips.
Neville Franks, Author of ED for Windows. www.getsoft.com
Make money with our new Affilate program
|
|
|
|
|
Thanks for the help. I got it working by installing a message hook to take care of the message relaying and it works like a charm.
|
|
|
|
|
I know it's stupid but I'm new to UNICODE ...
So. In my code I want to call inet_addr which takes const char* as parameter, but my string which I want to pass is wchar_t . How do I squeeze it into that func?
This is what I get from compiler:
<br />
error C2664: 'inet_addr' : cannot convert parameter 1 from 'const wchar_t *' to 'const char *'<br />
Will it even be able to work with UNICODE string??? MSDN doesn't say a word about UNICODE for this func. I do have _UNICODE in my project defined and everything.
Thanks a lot.
|
|
|
|
|
You can convert the wchar_t * to char * with one of the following functions:
- wcstombs (include stdlib.h)
- WideCharToMultiByte (include winnls.h)
|
|
|
|
|
Use the WideCharToMultiByte() API. It's documented in MSDN. Set the cbMultiByte parameter to 0 to determine the length of the target (ASCII) buffer. Then allocate a char buffer and call the API again to do the actual conversion.
If a train station is where the train stops, what's a workstation...?
|
|
|
|
|
Hi,
I create a MCI control window with 'MCIWndCreate' to play an avi file.
I want to disable overlay to make a bitblt from the video to a static control.
With overlay activated (the default behaviour) I only get a black rectangle.
Is there a way to disable overlay or does another control allow frame grabbing ?
thx.
|
|
|
|
|
I have a combobox and a clistCtrl. In the listCtrl I have several items that are relevant to all the entries in the combobox. So for example I have file1 and file2 in the combo, and the values iI can set for these files are isted in the listctrl. Now in the OnItemCChanged I go and do stuff. THe only problem is that if the listCtrl had an item selected in it for the first file, file1, then when I switch to file2, and want to set its value for that same list item, the OnChanged doesnt fire since its really not changed. How can I "reset" the listctrl so that it responds to any item I click on when I'm gathering info for file2 , even if it happens to be the same one I last clicked on for file1. I need to start back afresh at the first item in the list....or with nothing as the selected item . How to make it forget soimething wasa selected, and behave as it does when running for the first time?
Appreciate your help,
ns
|
|
|
|
|
Seems that when you handle changes to the combo box, you want to repopulate the list control with entries that pertain to the combo box selection. In this case, DeleteAllItems() and add the new ones in the list control.
In the interests of user-friendliness, you may want to also preselect the first (or most appropriate) item in the list control after populating it.
/ravi
Let's put "civil" back in "civilization"
http://www.ravib.com
ravib@ravib.com
|
|
|
|
|
How do you preselect an item?
|
|
|
|
|
m_listctrl.SetItemState
(nIndex,
LVIS_SELECTED | LVIS_FOCUSED,
LVIS_SELECTED | LVIS_FOCUSED); Bug me to send you my collection of handy-dandy list/tree control functions. (They're @ home).
/ravi
Let's put "civil" back in "civilization"
http://www.ravib.com
ravib@ravib.com
|
|
|
|
|
And its great to have you back......
|
|
|
|
|
I have a project that use ODBC. I want to use a CListCtrl to represent my database data. When you create an ODBC project, you have an ***view class derived from CRecordView with a dialog attached to it. That's where I want to have my CListCtrl.
So I have putted my CListCtrl in the dialog with the res manager. I added a variable named m_wndListCtrl that is bound to my control in DoDataExchange(). I use the style VS_REPORT.
DDX_Control(pDX, IDC_LISTCTRL_VIEWDATA, m_wndListCtrl);
and I added 3 columns inside my control. in the function
OnInitialUpdate().
CRect rect;
m_wndListCtrl.GetClientRect(&rect);
int nColInterval = rect.Width()/5;
m_wndListCtrl.InsertColumn(0, _T("Item Name"), LVCFMT_LEFT, nColInterval*3);
m_wndListCtrl.InsertColumn(1, _T("Value"), LVCFMT_LEFT, nColInterval);
m_wndListCtrl.InsertColumn(2, _T("Time"), LVCFMT_LEFT, rect.Width()-4*nColInterval);
The problem is that I dont see any column.
Thanks for helping
Everything's beautiful if you look at it long enough...
|
|
|
|
|
Weird. Try Invalidate().
Kuphryn
|
|
|
|
|
Debug and check the value of nColInterval , see if it's desired.
|
|
|
|
|
Your columns probably get created with a size 0. So as suggested debug your code and watch the nColInterval variable.
Or try creating the listctrl with hard coded values for the nColInterval:
<br />
m_wndListCtrl.InsertColumn(0, _T("Item Name"), LVCFMT_LEFT, 100);<br />
m_wndListCtrl.InsertColumn(1, _T("Value"), LVCFMT_LEFT, 100);<br />
m_wndListCtrl.InsertColumn(2, _T("Time"), LVCFMT_LEFT, 100);<br />
If this works you know its the size parameter
Good luck
|
|
|
|
|
I'm building a service that uses named pipes, and I want the connectnamedpipe to return immediately a connection occurs, or to timeout after a period of time.
Is it best to
A) set the timeout period vey small, and be continuosly looping/waiting for a client to connect. THis was if I signal the service to stop, at the end of the loop, I can just bail out.
B) set the timeout period to quite high, and from the main thread, if I want the service to stop, I signal the event that the Connectnamedpipe is waiting on. And then bail, BUT the signal looks just like a client has connected.
I've looked at the PJNaughter articles, but none of these deal with Overlapped operation.
Are there any other options that I may be missing??
|
|
|
|