View mode: basic / threaded / horizontal-split · Log in · Help
March 23, 2005
Window procedure declaration
I can't seem to assign my WNDCLASSA structures wndproc field the same 
way I did in C.

<code>
WNDCLASSA wcex;
wcex.style		= 0;
wcex.lpfnWndProc	= cast(WNDPROC) wndProc;
</code>

Compiler errors:

App.d(40): function app.wndProc (HANDLE,uint,uint,int) does not match 
argument types ()
App.d(40): Error: expected 4 arguments, not 0


Also how do I declare the procedure?  This causes errors:

<code>
LRESULT CALLBACK wndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM 
lParam)
</code>

app.d(62): semicolon expected, not 'wndProc'
app.d(62): found 'hWnd' when expecting ')'
app.d(62): semicolon expected, not 'message'
app.d(62): no identifier for declarator message
app.d(62): semicolon expected, not 'wParam'
app.d(62): no identifier for declarator wParam
app.d(62): semicolon expected, not 'lParam'
app.d(62): no identifier for declarator lParam
app.d(62): semicolon expected, not ')'
app.d(62): Declaration expected, not ')'
app.d(70): Declaration expected, not 'case'
app.d(77): Declaration expected, not 'case'
app.d(81): Declaration expected, not 'case'
app.d(91): Declaration expected, not 'default'
app.d(93): unrecognized declaration
March 23, 2005
Re: Window procedure declaration
"V" <v@pathlink.com> wrote in message 
news:d1r499$1jh3$1@digitaldaemon.com...
>I can't seem to assign my WNDCLASSA structures wndproc field the same way I 
>did in C.
>
> <code>
> WNDCLASSA wcex;
> wcex.style = 0;
> wcex.lpfnWndProc = cast(WNDPROC) wndProc;
> </code>

Use the address of the function instead.

   wcex.lpfnWndProc = &wndProc;

>
> Compiler errors:
>
> App.d(40): function app.wndProc (HANDLE,uint,uint,int) does not match 
> argument types ()
> App.d(40): Error: expected 4 arguments, not 0
>
>
> Also how do I declare the procedure?  This causes errors:
>
> <code>
> LRESULT CALLBACK wndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM 
> lParam)
> </code>
>
> app.d(62): semicolon expected, not 'wndProc'
> app.d(62): found 'hWnd' when expecting ')'
> app.d(62): semicolon expected, not 'message'
> app.d(62): no identifier for declarator message
> app.d(62): semicolon expected, not 'wParam'
> app.d(62): no identifier for declarator wParam
> app.d(62): semicolon expected, not 'lParam'
> app.d(62): no identifier for declarator lParam
> app.d(62): semicolon expected, not ')'
> app.d(62): Declaration expected, not ')'
> app.d(70): Declaration expected, not 'case'
> app.d(77): Declaration expected, not 'case'
> app.d(81): Declaration expected, not 'case'
> app.d(91): Declaration expected, not 'default'
> app.d(93): unrecognized declaration
March 23, 2005
Re: Window procedure declaration
V wrote:
> Also how do I declare the procedure?  This causes errors:
> 
> <code>
> LRESULT CALLBACK wndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM 
> lParam)
> </code>

You need to use D's extern attribute.  I believe this is the correct way:
# extern(Win32)
# LRESULT wndProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp) {
#   // ...
# }

-- Chris Sauls
March 23, 2005
Re: Window procedure declaration
Chris Sauls wrote:
> V wrote:
> 
>> Also how do I declare the procedure?  This causes errors:
>>
>> <code>
>> LRESULT CALLBACK wndProc(HWND hWnd, UINT message, WPARAM wParam, 
>> LPARAM lParam)
>> </code>
> 
> 
> You need to use D's extern attribute.  I believe this is the correct way:
> # extern(Win32)
> # LRESULT wndProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp) {
> #   // ...
> # }
> 
> -- Chris Sauls

Actually this should be "extern(Windows)", but the idea was correct.

His problem seems to have arisen from an absence of both the "&" 
operator and the extern(Windows).

-JJR
March 23, 2005
Re: Window procedure declaration
John Reimer wrote:
> Actually this should be "extern(Windows)", but the idea was correct.

I realized that about... three seconds ago.  :)  Alas.

Also would be helpful to check out these two pages from the specs:
http://www.digitalmars.com/d/windows.html
http://www.digitalmars.com/d/dll.html

-- Chris Sauls
March 23, 2005
Re: Window procedure declaration
Chris Sauls wrote:
> John Reimer wrote:
> 
>> Actually this should be "extern(Windows)", but the idea was correct.
> 
> 
> I realized that about... three seconds ago.  :)  Alas.
> 
> Also would be helpful to check out these two pages from the specs:
> http://www.digitalmars.com/d/windows.html
> http://www.digitalmars.com/d/dll.html
> 
> -- Chris Sauls

Thank you all for the help :D

I've noticed that some functions are missing from std.c.windows.windows like
BOOL DestroyWindow(HWND hWnd) and BOOL UnregisterClassA(LPCSTR 
lpClassName, HINSTANCE hInstance) and some of the defines like 
WS_EX_CLIENTEDGE.  Are any of these going to be added or do I have to 
define each function as an extern?
March 23, 2005
Re: Window procedure declaration
On Tue, 22 Mar 2005 22:51:06 -0800, V <v@pathlink.com> wrote:
> I can't seem to assign my WNDCLASSA structures wndproc field the same  
> way I did in C.
>
> <code>
> WNDCLASSA wcex;
> wcex.style		= 0;
> wcex.lpfnWndProc	= cast(WNDPROC) wndProc;
> </code>
>
> Compiler errors:
>
> App.d(40): function app.wndProc (HANDLE,uint,uint,int) does not match  
> argument types ()
> App.d(40): Error: expected 4 arguments, not 0

Try:

wcex.lpfnWndProc	= cast(WNDPROC)&wndProc;

> Also how do I declare the procedure?  This causes errors:
>
> <code>
> LRESULT CALLBACK wndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM  
> lParam)
> </code>
>
> app.d(62): semicolon expected, not 'wndProc'
> app.d(62): found 'hWnd' when expecting ')'
> app.d(62): semicolon expected, not 'message'
> app.d(62): no identifier for declarator message
> app.d(62): semicolon expected, not 'wParam'
> app.d(62): no identifier for declarator wParam
> app.d(62): semicolon expected, not 'lParam'
> app.d(62): no identifier for declarator lParam
> app.d(62): semicolon expected, not ')'
> app.d(62): Declaration expected, not ')'
> app.d(70): Declaration expected, not 'case'
> app.d(77): Declaration expected, not 'case'
> app.d(81): Declaration expected, not 'case'
> app.d(91): Declaration expected, not 'default'
> app.d(93): unrecognized declaration

Remove "CALLBACK". Add extern(C) eg.

extern (C) LRESULT wndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM  
lParam)
{
}

CALLBACK is typically a define for __stdcall which is replaced in D with  
extern (C), see:

http://www.digitalmars.com/d/interface.html

Regan
March 23, 2005
Re: Window procedure declaration
V wrote:
> Chris Sauls wrote:
> 
>> John Reimer wrote:
>>
>>> Actually this should be "extern(Windows)", but the idea was correct.
>>
>>
>>
>> I realized that about... three seconds ago.  :)  Alas.
>>
>> Also would be helpful to check out these two pages from the specs:
>> http://www.digitalmars.com/d/windows.html
>> http://www.digitalmars.com/d/dll.html
>>
>> -- Chris Sauls
> 
> 
> Thank you all for the help :D
> 
> I've noticed that some functions are missing from std.c.windows.windows 
> like
> BOOL DestroyWindow(HWND hWnd) and BOOL UnregisterClassA(LPCSTR 
> lpClassName, HINSTANCE hInstance) and some of the defines like 
> WS_EX_CLIENTEDGE.  Are any of these going to be added or do I have to 
> define each function as an extern?

There are many win32 functions missing from std.c.windows.windows. 
Check www.dsource.org/projects/core32 for a more complete D win32 import.

-JJR
March 23, 2005
Re: Window procedure declaration
Regan Heath wrote:

> 
> Remove "CALLBACK". Add extern(C) eg.
> 
> extern (C) LRESULT wndProc(HWND hWnd, UINT message, WPARAM wParam, 
> LPARAM  lParam)
> {
> }
> 
> CALLBACK is typically a define for __stdcall which is replaced in D 
> with  extern (C), see:
> 
> http://www.digitalmars.com/d/interface.html
> 
> Regan

Oops.  Good point, Regan.  I missed the CALLBACK.  Don't need that there!
March 24, 2005
Re: Window procedure declaration
On Wed, 23 Mar 2005 15:08:00 -0800, John Reimer <brk_6502@yahoo.com> wrote:
> Regan Heath wrote:
>
>>  Remove "CALLBACK". Add extern(C) eg.
>>  extern (C) LRESULT wndProc(HWND hWnd, UINT message, WPARAM wParam,  
>> LPARAM  lParam)
>> {
>> }
>>  CALLBACK is typically a define for __stdcall which is replaced in D  
>> with  extern (C), see:
>>  http://www.digitalmars.com/d/interface.html
>>  Regan
>
> Oops.  Good point, Regan.  I missed the CALLBACK.  Don't need that there!

Is it extern (C) or extern (Windows) though? I'm not sure.

Regan
« First   ‹ Prev
1 2
Top | Discussion index | About this forum | D home