Using Setwindowlong more then once.

Started by
2 comments, last by Endurion 19 years, 1 month ago
I am trying to set a second window pointer. I've tried to do it the two following ways.
SetWindowLong(m_hWnd,GWL_USERDATA+sizeof(long),(long) this);
SetWindowLong(m_hWnd,GWL_USERDATA+1,(long) this);
m_hWnd works, as does this. and right before I set it, I have created an instance of DirectInput8. How ever after I pass it I then use the following code

        if( FAILED( hr = DirectInput8Create( GetModuleHandle(NULL), DIRECTINPUT_VERSION, 
      IID_IDirectInput8, (VOID**)&m_pDI, NULL ) ) )
		return Error("Failed to Initialize DirectInput");
	SetWindowLong(m_hWnd,GWL_USERDATA+sizeof(long),(long) this);
	hwnd=m_hWnd;  //hwnd is global, m_hWnd is this instance of Input's local handle.
	
	if( FAILED( hr = m_pDI->EnumDevices( DI8DEVCLASS_GAMECTRL, 
                                         Joystickhandler,
                                         NULL, DIEDFL_ATTACHEDONLY ) ) )
        return false;
which works which leads to
 BOOL CALLBACK Input::Joystickhandler( const DIDEVICEINSTANCE* pdidInstance,
                                     VOID* pContext )
{
	Input* entry = NULL ;

	//entry = (Input *) GetWindowLong (hwnd, GWL_USERDATA+sizeof(long)) ;
	return InitilaizeJoystick(pdidInstance);
}
Which is my code and then it crashes on
bool Input::InitilaizeJoystick(const DIDEVICEINSTANCE* pdidInstance){
	HRESULT hr;
	hr = m_pDI->CreateDevice( pdidInstance->guidInstance, &m_pJoystick, NULL );

    if( FAILED(hr) ) 
        return Error("On Create Joystic device");
I checked the debug and the pointer values are not pointing to the right stuff. I made sure when I said this I'm passing an Input, but I think setWindowLong is what is messing me up, I early had passed in a Long to a Graphics pointer. What would the correct method to store a second link? (if it matters I'm trying to get Direct input to enumerate my Joysticks)
Advertisement
You should check the docs for GetWindowLong. GWL_USERDATA is not to be used as a base offset to access extra window memory. For that, you need to specify cbWndExtra when using RegisterClassEx, and then call Get/SetWindowLong with the offset you want (starting at 0). However, if you're not registering your own class, just use GWL_USERDATA to store a pointer to a structure that contains all the data you need.
C++ You confounded me again!! *shakes fist*

yeah I was placing the GWL_USERDATA there when I shouldn't. I figured it was a Define or something.

and thanks for meantioning cbWndExtra I didn't know it's use I must hav eskimmed over that part when reading about the functions. Every time I feel that I am very clever, I prove I'm not :)
I'd like to mention a method i've seen documented but actually noone uses:

SetProp lets you assign values to a HWND based on a string. It looks like there's no limit on them, only downside, you have to remove them before the HWND gets destroyed.

Fruny: Ftagn! Ia! Ia! std::time_put_byname! Mglui naflftagn std::codecvt eY'ha-nthlei!,char,mbstate_t>

This topic is closed to new replies.

Advertisement