问题
Please could someone give me a few tips for creating function pointers for MS winapi functions? I'm trying to create a pointer for DefWindowProc (DefWindowProcA/DefWindowProcW) but getting this error:
LRESULT (*dwp)(HWND, UINT, WPARAM, LPARAM) = &DefWindowProc;
error C2440: 'initializing' : cannot convert from
'LRESULT (__stdcall *)(HWND,UINT,WPARAM,LPARAM)'
to 'LRESULT (__cdecl *)(HWND,UINT,WPARAM,LPARAM)'
I can't figure out what I need to use because I am not used to the MS ascii/wide macros. By the way, I'm creating a function pointer to make a quick hack, and unfortunately I don't have time to explain why - but regardless, I think this question will be helpful to people who need to create winapi function pointers.
Update:
This code works, but I'm worried that it is bad practice (and does not adhere to unicode/ascii compile options). Should I define two specifications?
LRESULT (__stdcall* dwp)(HWND, UINT, WPARAM, LPARAM) = &DefWindowProc;
Update 2:
This is nicer (thanks to nobugz):
WNDPROC dwp = DefWindowProc;
回答1:
Fix the calling convention mismatch like this:
LRESULT (__stdcall * dwp)(HWND, UINT, WPARAM, LPARAM) = DefWindowProc;
A typedef can make this more readable:
typedef LRESULT (__stdcall * WindowProcedure)(HWND, UINT, WPARAM, LPARAM);
...
WindowProcedure dwp = DefWindowProc;
But, <windows.h>
already has a typedef for this, you might as well use it:
WNDPROC dwp = DefWindowProc;
回答2:
You lack __stdcall
in your prototype. You need to have a matching calling convention apart from a matching prototype. WINAPI functions are all __stdcall
, while the default for C++ is __cdecl
.
Using extern "C" { code }
is a viable alternative.
回答3:
This isn't the 'crazy' MS ascii/wide macro, you've just got 2 different function declarations.
If you decorate your internal function with "extern C" around it, you'll expose your function with the same calling type as the original and it'll compile.
来源:https://stackoverflow.com/questions/1970164/function-pointers-for-winapi-functions-stdcall-cdecl