Note that there are some explanatory texts on larger screens.

plurals
  1. POWhat can cause Windows to send the ID_HELP command twice
    primarykey
    data
    text
    <p>In my app, I overrode <code>CFrameWnd::OnHelp</code> to open a word doc instead of our old .hlp file. However, when I press F1, I noticed the function is being executed twice. I examined the stacks and found that <code>AfxWndProcBase</code> is receiving command <code>0x1E146</code>, and then <code>CWnd::OnCommand</code> is truncating that to <code>0xE146</code> when calling <code>CFrameWnd::OnCmdMsg</code>, and <code>0xE146</code> is the <code>ID_HELP</code> command. Then immediately after this, <code>AfxWndProcBase</code> is receiving command <code>0xE146</code>, and runs the help command again. After some experimentation, I've discovered that the second message is being received and processed <em>inside</em> the call to <code>AfxMessageBox</code> when the first message is being processed.</p> <p>Handler is here:</p> <pre><code>void CMainFrame::OnHelp() { BOOL bWorked; STARTUPINFO suInfo = {}; suInfo.cb = sizeof(suInfo); PROCESS_INFORMATION procInfo = {}; CString m_Process = _T("Start"); CString vipx = /*_T("\"") +*/ CString(AfxGetApp()-&gt;m_pszHelpFilePath) /*+ _T("\"")*/; bWorked = ::CreateProcess(m_Process, vipx.GetBuffer(), // requires non-const :( NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS, NULL, NULL, &amp;suInfo, &amp;procInfo); vipx.ReleaseBuffer(); if (procInfo.dwThreadId==NULL || bWorked==false) AfxMessageBox(_T("Failed to launch help: " + GetErrNoText(GetLastError()))); //AfxMessageBox causes my app to receive the message again? CloseHandle(procInfo.hProcess); CloseHandle(procInfo.hThread); } </code></pre> <p>Why are both <code>0x1E146</code> and <code>0xE146</code> being sent to my app when I press F1 (and what is the first one?)</p> <p>After a rewrite, I discovered that calling <code>ShellExecute</code> also causes the "1 deep recursion".</p> <p>I have no idea if it's relevent, but here's my form's message map:</p> <pre><code>BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd) //{{AFX_MSG_MAP(CMainFrame) ON_WM_CREATE() //}}AFX_MSG_MAP // Global help commands ON_COMMAND(ID_HELP, OnHelp) //F1 &lt;--- both messages are this one? END_MESSAGE_MAP() </code></pre> <p>In my resource file I found these, one for F1 and one for Shift+F1:</p> <pre><code>VK_F1, ID_CONTEXT_HELP, VIRTKEY, SHIFT, NOINVERT VK_F1, ID_HELP, VIRTKEY, NOINVERT </code></pre> <p>Probably useless, but here's the two callstacks:</p> <pre><code>MyApp.exe!CMainFrame::OnHelp() Line 66 C++ mfc90ud.dll!_AfxDispatchCmdMsg(CCmdTarget * pTarget=0x01fea410, unsigned int nID=57670, int nCode=0, void (void)* pfn=0x0040b720, void * pExtra=0x00000000, unsigned int nSig=57, AFX_CMDHANDLERINFO * pHandlerInfo=0x00000000) Line 82 C++ mfc90ud.dll!CCmdTarget::OnCmdMsg(unsigned int nID=57670, int nCode=0, void * pExtra=0x00000000, AFX_CMDHANDLERINFO * pHandlerInfo=0x00000000) Line 381 + 0x27 bytes C++ mfc90ud.dll!CFrameWnd::OnCmdMsg(unsigned int nID=57670, int nCode=0, void * pExtra=0x00000000, AFX_CMDHANDLERINFO * pHandlerInfo=0x00000000) Line 946 + 0x18 bytes C++ mfc90ud.dll!CWnd::OnCommand(unsigned int wParam=123206, long lParam=0) Line 2364 C++ mfc90ud.dll!CFrameWnd::OnCommand(unsigned int wParam=123206, long lParam=0) Line 366 C++ mfc90ud.dll!CWnd::OnWndMsg(unsigned int message=273, unsigned int wParam=123206, long lParam=0, long * pResult=0x0018fba4) Line 1769 + 0x1e bytes C++ mfc90ud.dll!CWnd::WindowProc(unsigned int message=273, unsigned int wParam=123206, long lParam=0) Line 1755 + 0x20 bytes C++ mfc90ud.dll!AfxCallWndProc(CWnd * pWnd=0x01fea410, HWND__ * hWnd=0x001703da, unsigned int nMsg=273, unsigned int wParam=123206, long lParam=0) Line 240 + 0x1c bytes C++ mfc90ud.dll!AfxWndProc(HWND__ * hWnd=0x001703da, unsigned int nMsg=273, unsigned int wParam=123206, long lParam=0) Line 403 C++ mfc90ud.dll!AfxWndProcBase(HWND__ * hWnd=0x001703da, unsigned int nMsg=273, unsigned int wParam=123206, long lParam=0) Line 441 + 0x15 bytes C++ ... mfc90ud.dll!CFrameWnd::PreTranslateMessage(tagMSG * pMsg=0x00712740) Line 249 + 0x1b bytes C++ mfc90ud.dll!CWnd::WalkPreTranslateTree(HWND__ * hWndStop=0x00160bb4, tagMSG * pMsg=0x00712740) Line 2946 + 0x14 bytes C++ mfc90ud.dll!AfxInternalPreTranslateMessage(tagMSG * pMsg=0x00712740) Line 233 + 0x12 bytes C++ mfc90ud.dll!CWinThread::PreTranslateMessage(tagMSG * pMsg=0x00712740) Line 777 + 0x9 bytes C++ MyApp.exe!CCXMyAppApp::PreTranslateMessage(tagMSG * pMsg=0x00712740) Line 749 C++ mfc90ud.dll!AfxPreTranslateMessage(tagMSG * pMsg=0x00712740) Line 252 + 0x11 bytes C++ mfc90ud.dll!AfxInternalPumpMessage() Line 178 + 0x18 bytes C++ </code></pre> <p>Second message:</p> <pre><code>MyApp.exe!CMainFrame::OnHelp() Line 66 C++ mfc90ud.dll!_AfxDispatchCmdMsg(CCmdTarget * pTarget=0x01fea410, unsigned int nID=57670, int nCode=0, void (void)* pfn=0x0040b720, void * pExtra=0x00000000, unsigned int nSig=57, AFX_CMDHANDLERINFO * pHandlerInfo=0x00000000) Line 82 C++ mfc90ud.dll!CCmdTarget::OnCmdMsg(unsigned int nID=57670, int nCode=0, void * pExtra=0x00000000, AFX_CMDHANDLERINFO * pHandlerInfo=0x00000000) Line 381 + 0x27 bytes C++ mfc90ud.dll!CFrameWnd::OnCmdMsg(unsigned int nID=57670, int nCode=0, void * pExtra=0x00000000, AFX_CMDHANDLERINFO * pHandlerInfo=0x00000000) Line 946 + 0x18 bytes C++ mfc90ud.dll!CWnd::OnCommand(unsigned int wParam=57670, long lParam=0) Line 2364 C++ mfc90ud.dll!CFrameWnd::OnCommand(unsigned int wParam=57670, long lParam=0) Line 366 C++ mfc90ud.dll!CWnd::OnWndMsg(unsigned int message=273, unsigned int wParam=57670, long lParam=0, long * pResult=0x0018e264) Line 1769 + 0x1e bytes C++ mfc90ud.dll!CWnd::WindowProc(unsigned int message=273, unsigned int wParam=57670, long lParam=0) Line 1755 + 0x20 bytes C++ mfc90ud.dll!AfxCallWndProc(CWnd * pWnd=0x01fea410, HWND__ * hWnd=0x001703da, unsigned int nMsg=273, unsigned int wParam=57670, long lParam=0) Line 240 + 0x1c bytes C++ mfc90ud.dll!AfxWndProc(HWND__ * hWnd=0x001703da, unsigned int nMsg=273, unsigned int wParam=57670, long lParam=0) Line 403 C++ mfc90ud.dll!AfxWndProcBase(HWND__ * hWnd=0x001703da, unsigned int nMsg=273, unsigned int wParam=57670, long lParam=0) Line 441 + 0x15 bytes C++ ... mfc90ud.dll!CWnd::SendMessageW(unsigned int message=273, unsigned int wParam=57670, long lParam=0) Line 42 + 0x44 bytes C++ mfc90ud.dll!CWnd::OnHelpInfo(tagHELPINFO * __formal=0x0008c890) Line 3195 C++ mfc90ud.dll!CWnd::OnWndMsg(unsigned int message=83, unsigned int wParam=0, long lParam=575632, long * pResult=0x0018e5ec) Line 1948 + 0xd bytes C++ mfc90ud.dll!CWnd::WindowProc(unsigned int message=83, unsigned int wParam=0, long lParam=575632) Line 1755 + 0x20 bytes C++ mfc90ud.dll!AfxCallWndProc(CWnd * pWnd=0x0253a410, HWND__ * hWnd=0x00160bb4, unsigned int nMsg=83, unsigned int wParam=0, long lParam=575632) Line 240 + 0x1c bytes C++ mfc90ud.dll!AfxWndProc(HWND__ * hWnd=0x00160bb4, unsigned int nMsg=83, unsigned int wParam=0, long lParam=575632) Line 403 C++ mfc90ud.dll!AfxWndProcBase(HWND__ * hWnd=0x00160bb4, unsigned int nMsg=83, unsigned int wParam=0, long lParam=575632) Line 441 + 0x15 bytes C++ ... mfc90ud.dll!CWnd::DefWindowProcW(unsigned int nMsg=83, unsigned int wParam=0, long lParam=575632) Line 1043 + 0x20 bytes C++ mfc90ud.dll!CWnd::Default() Line 274 C++ mfc90ud.dll!CWnd::OnHelpInfo(tagHELPINFO * __formal=0x0008c890) Line 3198 + 0x8 bytes C++ mfc90ud.dll!CWnd::OnWndMsg(unsigned int message=83, unsigned int wParam=0, long lParam=575632, long * pResult=0x0018eb70) Line 1948 + 0xd bytes C++ mfc90ud.dll!CWnd::WindowProc(unsigned int message=83, unsigned int wParam=0, long lParam=575632) Line 1755 + 0x20 bytes C++ mfc90ud.dll!AfxCallWndProc(CWnd * pWnd=0x0253aa28, HWND__ * hWnd=0x000b08c6, unsigned int nMsg=83, unsigned int wParam=0, long lParam=575632) Line 240 + 0x1c bytes C++ mfc90ud.dll!AfxWndProc(HWND__ * hWnd=0x000b08c6, unsigned int nMsg=83, unsigned int wParam=0, long lParam=575632) Line 403 C++ mfc90ud.dll!AfxWndProcBase(HWND__ * hWnd=0x000b08c6, unsigned int nMsg=83, unsigned int wParam=0, long lParam=575632) Line 441 + 0x15 bytes C++ ... mfc90ud.dll!CWnd::DefWindowProcW(unsigned int nMsg=77, unsigned int wParam=0, long lParam=0) Line 1043 + 0x20 bytes C++ mfc90ud.dll!CWnd::WindowProc(unsigned int message=77, unsigned int wParam=0, long lParam=0) Line 1756 + 0x1c bytes C++ mfc90ud.dll!AfxCallWndProc(CWnd * pWnd=0x0253aa28, HWND__ * hWnd=0x000b08c6, unsigned int nMsg=77, unsigned int wParam=0, long lParam=0) Line 240 + 0x1c bytes C++ mfc90ud.dll!AfxWndProc(HWND__ * hWnd=0x000b08c6, unsigned int nMsg=77, unsigned int wParam=0, long lParam=0) Line 403 C++ mfc90ud.dll!AfxWndProcBase(HWND__ * hWnd=0x000b08c6, unsigned int nMsg=77, unsigned int wParam=0, long lParam=0) Line 441 + 0x15 bytes C++ ... mfc90ud.dll!CWnd::WindowProc(unsigned int message=7423648, unsigned int wParam=7423712, long lParam=2016221872) Line 1755 + 0x20 bytes C++ ... mfc90ud.dll!AfxDeactivateActCtx(unsigned long dwFlags=0, unsigned long ulCookie=353633777) Line 260 + 0x17 bytes C++ mfc90ud.dll!AFX_MAINTAIN_STATE2::~AFX_MAINTAIN_STATE2() Line 63 + 0xe bytes C++ </code></pre>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload