On Saturday, 10 September 2022 at 10:39:12 UTC, Injeckt wrote:
To elaborate on why you need the above...
> But I get these bugs:
WndProc is a function, and you can't pass a function as a runtime function parameter, only pointers to functions. The first two errors tell you exactly what the problem is.
> server.d(29): Error: function server.WndProc(void* hwnd, uint message, uint wParam, int lParam)
is not callable using argument types ()
Note the bit that says "not callable using argument types ()
". In D, functions that have an empty parameter list can be called without an argument list, i.e., void foo()
can be called as foo
, the compiler rewrites it to foo()
.
This error by itself tells you what's wrong. The compiler knows WndProc
is a function, so it's trying to call WndProc()
when it sees the WndProc
in your argument list in the function call to KK.CreateWindowClass
at line 29 of server.d.
> server.d(29): too few arguments, expected 4
, got 0
And this reinforces that: the WndProc
function takes 4 arguments, but none were provided.
When doing Win32 programming in D, it sometimes helps to search online for problematic types. Microsoft's Win32 API documentation is really good. For functions, that's the only reference you need. But for other types and aliases, it sometimes helps to go one step further: use the MS docs to find out which header the type is defined in, then go the DRuntime source to find the corresponding binding.
In this case, searching for WNDPROC
would turn up this page:
https://docs.microsoft.com/en-us/windows/win32/api/winuser/nc-winuser-wndproc
At the bottom of which we see that it's defined in winuser.h
. So then you can go to the DRuntime sorce directory (it's installed with the compiler) and open core/sys/winuser.d
, in which a search for WNDPROC
eventually leads to this:
alias LRESULT function(HWND, UINT, WPARAM, LPARAM) WNDPROC;
That tells you it's a function pointer, meaning your function call needs &WndProc
, since that's how we get function pointers in D.