|
The API for GetQueuedCompletionStatus() states "If dwMilliseconds is INFINITE, the function will never time out. If dwMilliseconds is zero and there is no I/O operation to dequeue, the function will time out immediately." It further states that, "if a socket handle associated with a completion port is closed, GetQueuedCompletionStatus returns ERROR_SUCCESS, with lpNumberOfBytes equal zero."
INFO: Design Issues When Using IOCP in a Winsock Server[^]
"The greatest danger to humanity is humanity without an open mind." - Ian Mariano
http://www.ian-space.com/
|
|
|
|
|
Hello
I am trying to make the example at MSDN about explicit linking to DLLs
to work but i have some problems.
The example i am talking about:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vccore/html/_core_Link_Explicitly.asp
My question is: Where is HINSTANCE and LPFNDLLFUNC1 defined?
Do I need to include some particular headerfile/s or something else?
Thanks for your help
Thomas, Uppsala University Student, Sweden
|
|
|
|
|
tUpp wrote:
My question is: Where is HINSTANCE and LPFNDLLFUNC1 defined?
LPFNDLLFUNC is defined in the example:
typedef UINT (CALLBACK* LPFNDLLFUNC1)(DWORD,UINT);
That "prototypes" the function in the DLL.
HINSTANCE is defined #include ing <windows.h> (it's actually in a file included by windows.h, windefs.h, I think.)
If you want to use the example, you have to: Create a DLL, which exports the hypothetical function, and make sure the sample .exe you create can find it (e.g., place the DLL in the same folder.)
Read more about DLL Frequently Asked Questions[^]
Normally, you'd export the function in a header (.h) file, stating the function comes from an imported DLL:
__declspec(dllimport) UINT function(DWORD,UINT);
And you would link to the library. Explicitly linking means you don't have the headers, but you know the function(s) you wish to call, hence that typedef .
-- ian
|
|
|
|
|
Hi,
i have a dialog based program(MFC...)and i would like to add a tool bar, how can i do that?
|
|
|
|
|
quite easy.
see toolbar on MainFrame, slightly modified it a little bit, it will be on ur Dialog-box
includeh10
|
|
|
|
|
Normally messages are cought into a so called Message Loop and are parsed using the TranslateMessage and DispatchMessage. The DispatchMessage does two things:
1 - it calls the right Window procedure
2 - it posts the return value back to the os
Well I want to redesign option 1, but I don't want to redesign option 2, so does anyone know what DispatchMessage really does? Maybe WTL/ATL have also there implementations, so if anyone knows where these are, I would be pleased if anyone tells me where.
Sjoerd van Leent
LPCTSTR Dutch = TEXT("Double Dutch ");
|
|
|
|
|
If you poke around in the headers you'll see some interesting things.
MFC, ATL, and WTL use #define s to set up message handling for their window classes. I think you're really wanting to implement your own message handling for your window classes. DispatchMessage() is a Win32 API that [MSDN] "dispatches a message to a window procedure. It is typically used to dispatch a message retrieved by the GetMessage function." You can't really roll your own version of DispatchMessage.
Take a look at this interesting snippet from <atlwin.h> line 1524:
#define BEGIN_MSG_MAP(theClass) \
public: \
BOOL ProcessWindowMessage(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT& lResult, DWORD dwMsgMapID = 0) \
{ \
BOOL bHandled = TRUE; \
hWnd; \
uMsg; \
wParam; \
lParam; \
lResult; \
bHandled; \
switch(dwMsgMapID) \
{ \
case 0:
You should probably research it a bit before you implement your own, because you'll have to be tight on processing windows messages using Win32 wrapped by C++.
-- ian
"The greatest danger to humanity is humanity without an open mind." - Ian Mariano
http://www.ian-space.com/
|
|
|
|
|
imariano wrote:
...you'll have to be tight on processing windows messages using Win32 wrapped by C++.
I know about thunking or joining, or storing the this pointer, but I'm just curious, it should be possible...
LPCTSTR Dutch = TEXT("Double Dutch ");
|
|
|
|
|
Here is the implementation for DispatchMessage from WINE.
LONG WINAPI DispatchMessageW( const MSG* msg )
{
WND * wndPtr;
LONG retval;
int painting;
WNDPROC winproc;
if ((msg->message == WM_TIMER) || (msg->message == WM_SYSTIMER))
{
if (msg->lParam)
{
if (!TIMER_IsTimerValid(msg->hwnd, (UINT) msg->wParam, (HWINDOWPROC) msg->lParam))
return 0;
return CallWindowProcW( (WNDPROC)msg->lParam, msg->hwnd,
msg->message, msg->wParam, GetTickCount() );
}
}
if (!(wndPtr = WIN_GetPtr( msg->hwnd )))
{
if (msg->hwnd) SetLastError( ERROR_INVALID_WINDOW_HANDLE );
return 0;
}
if (wndPtr == WND_OTHER_PROCESS)
{
if (IsWindow( msg->hwnd ))
ERR( "cannot dispatch msg to other process window %x\n", msg->hwnd );
SetLastError( ERROR_INVALID_WINDOW_HANDLE );
return 0;
}
if (!(winproc = wndPtr->winproc))
{
WIN_ReleasePtr( wndPtr );
return 0;
}
painting = (msg->message == WM_PAINT);
if (painting) wndPtr->flags |= WIN_NEEDS_BEGINPAINT;
WIN_ReleasePtr( wndPtr );
SPY_EnterMessage( SPY_DISPATCHMESSAGE, msg->hwnd, msg->message,
msg->wParam, msg->lParam );
retval = CallWindowProcW( winproc, msg->hwnd, msg->message,
msg->wParam, msg->lParam );
SPY_ExitMessage( SPY_RESULT_OK, msg->hwnd, msg->message, retval,
msg->wParam, msg->lParam );
if (painting && (wndPtr = WIN_GetPtr( msg->hwnd )) && (wndPtr != WND_OTHER_PROCESS))
{
BOOL validate = ((wndPtr->flags & WIN_NEEDS_BEGINPAINT) && wndPtr->hrgnUpdate);
wndPtr->flags &= ~WIN_NEEDS_BEGINPAINT;
WIN_ReleasePtr( wndPtr );
if (validate)
{
ERR( "BeginPaint not called on WM_PAINT for hwnd %04x!\n", msg->hwnd );
RedrawWindow( msg->hwnd, NULL, 0,
RDW_NOFRAME | RDW_VALIDATE | RDW_NOCHILDREN | RDW_NOINTERNALPAINT );
}
}
return retval;
}
Build a man a fire, and he will be warm for a day Light a man on fire, and he will be warm for the rest of his life!
|
|
|
|
|
I also looked into atlapp.h of WTL70 there is also another type of function which does this.
But do you've also the TranslateMessage function, and other functions which apply to a message loop. I guess that what I really want to do is fading the CALLBACK out of sight.
LPCTSTR Dutch = TEXT("Double Dutch ");
|
|
|
|
|
Never thought to look @ Wine Heheh. Still, quite informative that code snippet, and the psuedocode one below from MSJ...which looks like it still allows for 16-bit (!) thingamadoodles.
TranslateMessage allows for "preprocessing" of Virtual key messages into character messages, which are then posted to the calling thread's message queue.
|
|
|
|
|
Got this code out of a MSJ from 1997
MS Systems journal example:
LONG DispatchMessageA( CONST MSG *lpmsg )
{
return DispatchMessageWorker( lpmsg, 1 );
}
LONG DispatchMessageWorker( CONST MSG *lpmsg, BOOL fAnsi )
{
if ( lpmsg->message == 0xFFFE0000 )
{
_UserSetLastError( ERROR_INVALID_PARAMETER );
return 0;
}
if ( lpmsg->hwnd )
{
pWnd = @ValidateHwnd( lpmsg->hwnd );
if ( !pWnd )
return 0;
}
else
pWnd = 0;
if ( (lpmsg->message != WM_TIMER) && (lpmsg->message != WM_SYSTIMER) )
{
begin_normal_message:
if ( pWnd == 0 )
return 0;
DWORD save_wParam = lpmsg->wParam;
if ( (lpmsg->message != WM_PAINT) && !(pWnd->someFlags9E & 4) )
{
if ( IsWindowUnicode( lpmsg->hwnd ) )
{
if ( fAnsi )
RtlMBMessageWParamCharToWCS( lpmsg->message, save_wParam );
else
RtlWCSMessageWParamCharToMB( lpmsg->message, save_wParam );
}
if ( 0 == (pWnd->pfnWndProc & 0x80000000) )
{
pWnd->pfnWndProc( lpmsg->hwnd, lpmsg->message,
lpmsg->wParam, lpmsg->lParam );
}
else
{
pfnWowWndProcEx( lpmsg->hwnd, lpmsg->message, save_wParam,
lpmsg->lParam, lpmsg->message, pWnd->0x90 );
}
}
else
{
if ( fAnsi )
_RtlMBMessageWParamCharToWCS( lpmsg->message, save_wParam );
_NtUserDispatchMessage( lpmsg );
}
lpmsg->wParam = save_wParam;
}
else
{
TIMERPROC pfnTimerCallback = lpmsg->lParam;
if ( pfnTimerCallback == 0 )
goto begin_normal_message;
if ( lpmsg->message == WM_SYSTIMER )
return _NtUserDispatchMessage( lpmsg );
return pfnTimerCallback( lpmsg->hwnd,
lpmsg->message,
lpmsg->wParam,
GetTickCount() );
}
}
LPCTSTR Dutch = TEXT("Double Dutch ");
|
|
|
|
|
Im designing a simple interface using MFC. When i add a list box to the main dialog, build it and then run it, the exe pops-up and works as expected. If i then go to the classwizard and add a Control-Clistbox variable to this list box and rebuild it and run it, nothing happens. The exe doesn turn up at all, the mouse pointer just changes to hour-glass and then back to the pointer. Anybody know why?
Ayush
|
|
|
|
|
If you just add the CListBox to the class and not the dialog, you're only getting a class member which is not tied to anything in the dialog, and it's never going to show up if you don't do some extra work.
If you want to wire up the list box into your dialog class, do what you did to add the dialog to the form, then use the ClassWizard to associate the list box to a class member.
Using ClassWizard[^], and the CListBox reference[^]
-- Ian
|
|
|
|
|
Dear Ian,
I dont seem to understand what you mean. After adding the list box to the dialog, i give it a control id using the properties menu on right-click. Then i run class-wizard and assign a Control variable of Clistbox type to this control ID. On Building it, i get no errors, but when i run it, it doesnt do anything, as expalined in my earlier post. Removing this variable makes it work though.
|
|
|
|
|
So you do this:
- Add a listbox to a dialog, and assign it an id of IDC_MYLISTBOX
- Use the ClassWizard to assign IDC_MYLISTBOX to a control bound to
a class member variable m_MyListBox.
And it doesn't work? That's odd. What's the dialog's .h file look like?
|
|
|
|
|
I write this below function to return CStringArray.
<br />
CStringArray info;<br />
info = m_Proc.Getinfo(m_arrFileName, m_arrPassword);<br />
When I compile there are error message show like these
<br />
error C2582: 'CStringArray' : 'operator =' function is unavailable<br />
error C2582: 'CStringArray' : 'operator =' function is unavailable<br />
error C2679: binary '+=' : no operator defined which takes a right-hand operand of type 'class CStringArray' (or there is no acceptable conversion)<br />
error C2558: class 'CStringArray' : no copy constructor available<br />
Do you know how to define operator = in CStringArray? Are there another way to do that?
Thank you for your answer.
|
|
|
|
|
Use the Copy member function of CObArray:
CStringArray info;
info.Copy(m_Proc.Getinfo(m_arrFileName, m_arrPassword);
Getinfo must return a CStringArray.
Try it.
-Dominik
|
|
|
|
|
Thank you for your answer Dominik.
I want to ask you another question that I write Getinfo function to return CStringArray.
CStringArray CCrypt::Getinfo(const CStringArray& fileName, const CStringArray& password) <br />
{<br />
CStringArray privkeyinfo;<br />
..<br />
..<br />
..<br />
return privkeyinfo;<br />
}
But when I compile there are error message show
error C2558: class 'CStringArray' : no copy constructor available
Do you know how to solve my problem?
|
|
|
|
|
The code you posted should work... are you sure that the error comes from this part?
|
|
|
|
|
You're getting this error because CStringArray doesn't support copy constructing and thus cannot be used as a return value. I would change the function so it takes the return value as a reference parameter instead:
<br />
void CCrypt::Getinfo(<br />
const CStringArray& fileName, <br />
const CStringArray& password,<br />
CStringArray& r_privKeyInfo )<br />
{<br />
}<br />
Then call it like this:
<br />
CStringArray arrPrivKeyInfo;<br />
m_Proc.Getinfo(m_arrFileName, m_arrPassword, arrPrivKeyInfo );<br />
Wenn ist das Nunstück git und Slotermeyer? Ja! Beierhund das oder die Flipperwaldt gersput!
|
|
|
|
|
Forgive my ignorance for what has probably a simple answer...
I'm using the GetLocalTime API to print current system date:
SYSTEMTIME st;
::GetLocalTime (&st);
sprintf (m_date, "%02d/%02d/%2d",st.wMonth,st.wDay,st.wYear);
m_doc->nParseTime [url_info.URL_Index] = GetTickCount ();
Presently the date prints as "11/02/2002" How would I change to have date displayed as "11/02/02"?
Thanks Much Everyone
|
|
|
|
|
Simply do the following:
m_date[6] = m_date[8];
m_date[7] = m_date[9];
m_date[8] = 0;
This would change 11/02/2002 to 11/02/02.
OR
You use a specialized time formating function like this
size_t strftime( char *strDest, size_t maxsize, const char *format, const struct tm *timeptr );
-Dominik
|
|
|
|
|
I was wondering if it is possible to add an menu item to the right-click popup menu in VC6.
I've taken a brief look at the WinTabs add-in (not it's code - the application itself), and it doesnt appear to put anything into the popup menu of the vc6 editor, the same goes for WorkspaceWhiz 2.12.
If there's a way - I'd love to have *any* information of ideas about how I could extend the popup.
Thanks!
--
John Clayton
|
|
|
|
|
hi
i am writing my own dialogbox for printsetup. i have the problem to set "dmFields" member in the DEVMODE structure for orientation and copies.how can i assign my values to these memebers. please help me. if i give
pDevMode->dmFields=DM_ORIENTATION
pDevMode->dmFields=m_orientation.(m_orientation contains either 1 or 0);
but it's not setting with my value
please give help
thank you
|
|
|
|
|