I have a C++ console application & a DLL. In the C++ application I see the following snippet ::
typedef DWORD (WINAPI* functABC)(unsigned long*);
functABC functABC111;
HMODULE handleDLL = LOadLibrary("a.DLL");
functABC111 = (functABC)GetProcAddress(handleDLL,"function_1");
At a high level I understand that we are getting the function pointer to the function in a.DLL "function_1()".
But want to understand the 1st 2 lines in the above snippet ::
typedef DWORD (WINAPI* functABC)(unsigned long*);
functABC functABC111;
2 questions ::
1) Is the name "functABC" just a random function pointer name?
2) What are we technically doing in these 2 lines. Declaring function pointer.
3) Why do we need to use WINAPI* in the function pointer declaration in 1st line.
THanks in advance.
'functABC' is a typedef to a function returning a DWORD taking an unsigned long pointer as a parameter
First lines defines a typedef and second one creates a function pointer using it
'WINAPI' is a macro that's usually expanded to '__stdcall' which is the calling convention used by Microsoft to export functions from a .DLL
3) Almost all Windows functions (from shell32.dll, user32.dll, and all other) are declared as __stdcall
, or as WINAPI
(same thing). It is not necessary to declare functions in DLL as WINAPI, but people just follow Microsoft's lead. The code will be a few bytes smaller, and execution a few nanoseconds shorter.
2) What are we technically doing in these 2 lines. Declaring function pointer.
First a type is defined that can be used to point to any function that follows the prototype DWORD WINAPI funcName(unsigned long*);
. Then a variable of that type is created.
3) Why do we need to use WINAPI* in the function pointer declaration in 1st line.
Because function_1
is using the WINAPI
calling convention (usually defined as __stdcall
). Or at least this code assumes that it does.
来源:https://stackoverflow.com/questions/18912931/why-need-to-use-winapi-for-the-syntax-for-declaring-function-pointers-for-fun