C++ cast to D cast again :)

div0 div0 at users.sourceforge.net
Sun Sep 30 09:58:31 PDT 2007


div0 wrote:
> BLS wrote:
>> div0 schrieb:
>>> BLS wrote:
>>>> Hi and sorry about picking on your nerves again  :(
>>>> // C++
>>>> class CWin
>>>> {
>>>> //
>>>> static LRESULT CALLBACK WndProc(HWND hWnd, UINT uID, WPARAM wParam, 
>>>> LPARAM lParam)
>>>> {
>>>>   CWin* pWnd=NULL;  // init pWnd
>>>> }
>>>>
>>>> // later ...
>>>> CWin* pChild=reinterpret_cast<CWin*>((HWND)
>>>> ::GetWindowLong(pWnd->GetDlgItem( ((( LPDRAWITEMSTRUCT 
>>>> )lParam)->CtlID) ),GWL_USERDATA) );
>>>>
>>>>
>>>> }
>>>>
>>>> //our D class
>>>> class CWin
>>>> {
>>>> static LRESULT WndProc(HWND hWnd, UINT uID, WPARAM wParam, LPARAM 
>>>> lParam)
>>>> {
>>>>   CWin pWnd=null;  // init pWnd as    ---reference !
>>>> }
>>>> /* instead of :
>>>> CWin* pChild=reinterpret_cast<CWin*>
>>>> we use
>>>> CWin pChild = cast(CWin) cast(void*)
>>>>
>>>> But I am not sure how to translate :
>>>> ((HWND)
>>>> ::GetWindowLong(pWnd->GetDlgItem( ((( LPDRAWITEMSTRUCT 
>>>> )lParam)->CtlID) ),GWL_USERDATA) );
>>>> */
>>>>
>>>> // Later we have
>>>> if (HIWORD(pWnd))
>>>>
>>>> /*Since we are working with a ref. instead of a pointer this will 
>>>> not work.
>>>> I guess I can use :
>>>> */
>>>>
>>>> if (HIWORD(cast(void*)pWnd))
>>>> // can you confirm
>>>> }
>>>>
>>>> GetWindowLong() is a Windows Api func., sure you know it.
>>>> So what the correct translation ?
>>>> Bjoern
>>>> Beside, I still wonder : Having a class A, Is A* pA a legal 
>>>> construct in D.
>>>> What is pA from a technical view; a pointer to a reference ?
>>>
>>> Even if you get this to compile it won't work.
>>> (well it will till one day until it just crashes mysteriously)
>>>
>>> At some point the garbage collector might decide move your Cwin 
>>> object, invalidating the pointer you are trying to store with 
>>> SetWindowLong/GetWindowLong.
>>>
>>
>> Thanks div0,
>> I am allready afraid that this is the case...
>>
>>> You'll have to either allocation your cwin objects outside the 
>>> garbage collectors control or pin the objects. (Don't know how you do 
>>> this, depends on whether you are using phobos or tango)
>>>
>>
>> Tango.
>>
>> What means "pin the object", please explain.
>> Bjoern
> 
> Marks the object as not movable.
> It looks like getAttr/setAttr is what you want, but I've not used it 
> myself so don't blame me if your program crashes. ;)
> 
> http://www.dsource.org/projects/tango/browser/trunk/lib/common/tango/core/Memory.d 
> 
> 
> 
>>
>>> You should probably look at how dfl interfaces with the Win32 API, 
>>> http://www.dprogramming.com/dfl.ph as that library has solved these 
>>> issues and you should be able to work out how it's doing all the 
>>> necessary casting/pinning.

And to actually answer your original question:


class CWin {
	int	m_a;

	this() {
	}
}

extern(Windows){
	typedef void* HWND;
	int GetWindowLongA(HWND wnd, int indx);
	int GetWindowLongW(HWND wnd, int indx);
}


void main()
{
	// do the call (assume mbcs not unicode)
	int	r = GetWindowLongA(cast(HWND)0, 0);

	// do the call & cast to CWin object pointer
	CWin	*pWin = cast(CWin*)GetWindowLongA(cast(HWND)0, 0);
	Stdout( r );
	
}


Replace the 0's with the appropriate values, ie the window handle and 
GWL_USERDATA (which is -21)

compile with:
	dmd main.d user32.lib


More information about the Digitalmars-d-learn mailing list