Correct way of changing MFC application name (m_pszAppName)



As far as I understand, the MSDN documentation regarding how to change
CWinApp::m_pszAppName is incorrect. Following the documentation can lead to
memory access violation errors. Additionally, the KB article 154744 also
gives wrong advise about how to change m_pszAppName.

Here's why:

At the very beginning of application initialization, AfxWinInit calls
CWinApp::SetCurrentHandles, which caches the current value of the
m_pszAppName pointer as follows:

pModuleState->m_lpszCurrentAppName = m_pszAppName;

That is, the module state struct holds a copy of the m_pszAppName pointer.
Now, if you change m_pszAppName in InitInstance as adviced in MSDN, you
still have the old pointer value in pModuleState->m_lpszCurrentAppName. The
AfxGetAppName() function returns AfxGetModuleState()->m_lpszCurrentAppName.

Many times replacing m_pszAppName does not lead into problems because
_tcsdup will return the same pointer value as before. But of course, the
pointer value can be different, and if it is, it can lead into a crash later
when someone is calling AfxGetAppName().

For example, the following code in InitInstance is almost certain to fail
because the app name is relatively long and causes _tcsdup to return a
pointer value that is different than before:

free( ( void* )m_pszAppName ); m_pszAppName = NULL;
m_pszAppName = _tcsdup(
"ABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABC" );
const TCHAR* ptsz = AfxGetAppName();
_ASSERTE( lstrcmp( ptsz, m_pszAppName ) == 0 ); // TYPICALLY FAILS

Now, my question is: Can Microsoft fix the buggy documentation? And, what is
the correct way of changing m_pszAppName. Is the following safe in
InitInstance:

free( ( void* )m_pszAppName ); m_pszAppName = NULL;
m_pszAppName = _tcsdup( "<new name>" );
AfxGetModuleState()->m_lpszCurrentAppName = m_pszAppName;

Antti


.



Relevant Pages

  • Re: main function address
    ... the printffunction documentation in ... The fprintf() documentation in 7.19.6.1 says ... The value of the pointer is ... does the implicit conversion apply when the pointer value is extracted ...
    (comp.lang.c)
  • dynamic_cast does not work as specified
    ... Here's a problem I hit that is inconsistent with the documentation. ... where the CObject* can be one of several types ... I have no idea why this is an invalid expression for dynamic_cast. ... a "pointer to void". ...
    (microsoft.public.vc.mfc)
  • Re: Documentation on implementing a Windows Scripting Engine
    ... that documentation certainly qualifies as private. ... can get access to it if you start working for Microsoft. ... Otherswise a scripting engine is simply a language interpreter. ... Does anyone have a pointer as to a good source of documentation on this ...
    (microsoft.public.win32.programmer.ole)
  • Re: Receiving single bytes with MSComm
    ... Lacking any documentation on MSCOMM (as I pointed out, if it was important and useful it ... You are doing a V_BSTR cast, which I believe is casting to a pointer to a Unicode string, ... If it were an important control, ...
    (microsoft.public.vc.mfc)
  • Re: Correct way of changing MFC application name (m_pszAppName)
    ... time the _tcsdup call seems to return the same pointer value that was just ... that any call to AfxGetAppName() will return garbage (the previously freed ... Antti ...
    (microsoft.public.vc.mfc)