Re: Why does this cause "data abort" ?
"Lisa Pearlson" <no@spam.plz> ha scritto nel messaggio
news:eZNXTQeFIHA.1316@TK2MSFTNGP02.phx.gbl...
class CSomeWnd
{
public:
int m_hWnd;
virtual LRESULT SomeWndProc(HWND hWnd, MSG msg, WPARAM wParam, LPARAM
lParam);
}
CSomeWnd* g_pSomeWnd = new CSomeWnd();
g_pSomeWnd->CreateWindow( ... );
...
LRESULT GlobalWndProc(HWND hWnd, MSG msg, WPARAM wParam, LPARAM lParam)
{
return g_pSomeWnd->SomeWndProc(hWnd,msg,lParam,wParam);
}
[...]
However, the above construction causes data abort exceptions.
I don't know what *exactly* "data abort exceptions" are...
However, I can't see anything wrong in the above code. Maybe the exception
is thrown somewhere else...
Frankly speaking, I don't like using the global instance as shown above. I
prefer the following code you posted:
understand why, but it's resolved by something like this:
CSomeWnd* g_pSomeWnd = new CSomeWnd();
g_pSomeWnd->CreateWindow( ... );
SetWindowLong(g_pSomeWnd->GetSafeHwnd(), GWL_USERDATA, (LONG) this);
LRESULT GlobalWndProc(HWND hWnd, MSG msg, WPARAM wParam, LPARAM lParam)
{
CSomeWnd* pWnd = (CSomeWnd*) GetWindowLong(hWnd, GWL_USERDATA);
return pWnd->SomeWndProc(hWnd,msg,lParam,wParam);
}
If you don't want to use GWL_USERDATA, you may consider also Window
Properties technique (i.e. use the SetProp and GetProp Win32 APIs to store
the class instance pointer "this", associating it to a string property); or
you can use extra window bytes (the "cbWndExtra" field in the WNDCLASSEX
structure) to store the "this" pointer (e.g. set windowClass.cbWndExtra =
sizeof( YourClass * ), and use SetWindowLong and GetWindowLong using 0-byte
offset to set and get the "this" instance pointer).
There are also more advanced techniques, like using assembly language
"thunks". This is done by ATL/WTL, IIRC.
However, if you use ATL (or MFC) you can just derive your class from the
base window class (or some other window class), using just C++ inheritance.
Giovanni