C++ cast to D cast again :)
BLS
nanali at nospam-wanadoo.fr
Sun Sep 30 09:07:00 PDT 2007
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
> 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