C++ cast to D cast again :)

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


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.


More information about the Digitalmars-d-learn mailing list