porting Windows C++ to D, a few questions
BLS
nanali at nospam-wanadoo.fr
Mon Sep 17 12:46:43 PDT 2007
Regan Heath schrieb:
> BLS wrote:
>> Hi,
>>
>> I have/would like to translate a Windows C++ source into D and I have
>> questions regarding
>> Class pointer, casting, and CALLBACK
>>
>> Okay, here a C++ fragment.
>> class CWin : public CMsg
>
> Don't need 'public' in there.
>
>> {
>>
>> WNDCLASSEX wcex;
>> wcex.hbrBackground= (HBRUSH) (COLOR_BTNFACE+1);
>> // How to translate this into D ?
>> // I guess :
>>
>> //wcex.hbrBackground = cast(HBRUSH) (COLOR_BTNFACE+1);
>> // Is this correct ????
>
> It looks correct to me.
>
>> //Later :
>> static LRESULT CALLBACK WndProc(HWND hWnd, UINT uID, WPARAM wParam,
>> LPARAM lParam)
>> // Actually I have no idea how to convert this construct into D...
>
> By including std.c.windows.windows you will get most of HWND, etc
> defined for you, so you can just leave them there.
>
> If you're:
>
> 1. re-writing this in D then "CALLBACK" can be removed (as it resolves
> to __stdcall which is not needed in D)
>
> 2. Trying to call this D function from a C application then you need to
> remove CALLBACK and place extern(Windows) on the front of it, i.e.
>
> extern(Windows) LRESULT WndProc(HWND hWnd, UINT uID, WPARAM wParam,
> LPARAM lParam)
>
> 3. Likewise if you're trying to call a C function from D you need to
> define it as #2
>
>> {
>>
>> CWin* pWnd=NULL;
>> // I think in D using a pointer to a class is not nessesary.
>> // Do you agree ? However the next pb. I have is here :
>
> Yes. Change this to "CWin pWnd = null;". Classes are automatically "by
> reference" (which is like a pointer)
>
>> pWnd =
>> reinterpret_cast<CWin*>((long)((LPCREATESTRUCT)lParam)->lpCreateParams);
>
> Change this to:
>
> pWnd = cast(CWin)(cast(LPCREATESTRUCT)lParam)->lpCreateParams;
>
> You could put a cast(int) in there (where the (long) was) but I don't
> believe you need it. The reason you would use 'int' and not 'long' is
> that long in C++ is typically 32 bits and long in D is 64 bits.
>
> I'm not 100% certain that it is guaranteed to work if you cast class
> references to void and back again. Someone else might be able to
> confirm/deny this for us.
>
> Note: LPVOID is defined as void* in D
>
>> // Now it seems to become difficult. In case that I define
>> CWin pWind; // instead off CWin* pWnd;
>> //then casting is impossible. So what can I do ?
>
> Hope I got that all correct.
>
> Regan
Thanks a lot Regan!
> Change this to:
>
> pWnd = cast(CWin)(cast(LPCREATESTRUCT)lParam)->lpCreateParams;
It is the ->lpCreateParams which makes me wonder..
More information about the Digitalmars-d-learn
mailing list