Re: Why does this cause "data abort" ?
"Lisa Pearlson" <no@spam.plz> ha scritto nel messaggio
news:uyyHzvjFIHA.1204@TK2MSFTNGP03.phx.gbl...
// sample class
class CMyWnd
{
public:
CMyWnd() :
m_hWnd(NULL), m_lpszClassName(NULL),
m_hInstance(NULL), m_hIcon(NULL) {};
LPTSTR m_lpszClassName;
I don't like this data member here.
I would prefer storing the class name into a buffer using deep-copy (e.g.
TCHAR m_className[ 200 ];) or better use a robust string class, like
CString), e.g.:
CString m_className;
And adjust here:
BOOL RegisterWndClass(LPCTSTR lpszClassName, HINSTANCE hInstance,
WNDPROC wndProc) {
m_lpszClassName = lpszClassName;
// Deep copy
m_className = lpszClassName;
void UnregisterWndClass() {
UnregisterClass(m_lpszClassName, m_hInstance);
}
I'm not sure if the class should be unregistered here...
I would *not* unregister the window class.
http://blogs.msdn.com/oldnewthing/archive/2007/02/12/1661754.aspx
// global vars. Do they need to be declared static???
static const g_szClassName[] = _T("MyClass");
static HINSTANCE g_hInstance = NULL;
static CMyWnd* pWnd = NULL;
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM
lParam)
{
return pWnd->OnMessage(uMsg, wParam, lParam);
I would check if pWnd is not null here, e.g. using an assert:
_ASSERTE( pWnd != NULL );
case DLL_PROCESS_DETACH :
if (pWnd) {
pWnd->UnregisterWndClass();
delete pWnd;
Try not unregistering here, and after delete pWnd, set also pWnd = NULL
(just to avoid the use of a uninitialized pointer).
// .def file has EXPORTS Initialize @ 240 NONAME
HWND Initialize(HWND hWndParent)
Should this be __stdcall?
Maybe there is some stack corruption due to uncorrect calling conventions?
However, I would not use this kind of "mixed C - C++" code; I would go for a
more robust C++ code.
I would use ATL/WTL (I don't know embedded development, maybe you have
memory limits so you can't use MFC? But in that case I think you could use
ATL, because ATL is a very *thin* object-oriented wrapper to Win32 APIs -
and you can have the benefit of robust object-oriented code).
Giovanni