У меня есть консольное приложение C ++ & DLL. В приложении C ++ я вижу следующий фрагмент ::
typedef DWORD (WINAPI* functABC)(unsigned long*);
functABC functABC111;
HMODULE handleDLL = LOadLibrary("a.DLL");
functABC111 = (functABC)GetProcAddress(handleDLL,"function_1");
На высоком уровне я понимаю, что мы получаем указатель функции на функцию в a.DLL «function_1 ()».
Но хочу понять первые 2 строки в приведенном фрагменте:
typedef DWORD (WINAPI* functABC)(unsigned long*);
functABC functABC111;
2 вопроса ::
1) Является ли имя «functABC» просто именем указателя на случайную функцию?
2) Что мы технически делаем в этих 2 строчках. Объявление функции указателя.
3) Почему нам нужно использовать WINAPI * в объявлении указателя функции в 1-й строке.
Заранее спасибо.
‘functABC‘является typedef для функции, возвращающей DWORD принимая длинный указатель без знака в качестве параметра
Первая строка определяет typedef, а вторая создает указатель на функцию, используя его
‘WINAPIэто макрос, который обычно расширяется до__stdcall‘это соглашение о вызовах, используемое Microsoft для экспорта функций из.DLL
3) Почти все функции Windows (из shell32.dll, user32.dll и других) объявлены как __stdcall
или как WINAPI
(то же самое). Нет необходимости объявлять функции в DLL как WINAPI, но люди просто следуют примеру Microsoft. Код будет на несколько байтов меньше, а выполнение на несколько наносекунд короче.
2) Что мы технически делаем в этих 2 строчках. Объявление функции указателя.
Сначала определяется тип, который можно использовать для указания на любую функцию, которая следует за прототипом. DWORD WINAPI funcName(unsigned long*);
, Затем создается переменная этого типа.
3) Почему нам нужно использовать WINAPI * в объявлении указателя функции в 1-й строке.
Так как function_1
использует WINAPI
соглашение о вызовах (обычно определяется как __stdcall
). Или, по крайней мере, этот код предполагает, что это так.