Почему нужно использовать & quot; WINAPI * & quot; Синтаксис для объявления указателей на функции для функций в DLL

У меня есть консольное приложение 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-й строке.

Заранее спасибо.

2

Решение

  1. functABC‘является typedef для функции, возвращающей DWORD принимая длинный указатель без знака в качестве параметра

  2. Первая строка определяет typedef, а вторая создает указатель на функцию, используя его

  3. WINAPIэто макрос, который обычно расширяется до__stdcall‘это соглашение о вызовах, используемое Microsoft для экспорта функций из.DLL

4

Другие решения

3) Почти все функции Windows (из shell32.dll, user32.dll и других) объявлены как __stdcallили как WINAPI (то же самое). Нет необходимости объявлять функции в DLL как WINAPI, но люди просто следуют примеру Microsoft. Код будет на несколько байтов меньше, а выполнение на несколько наносекунд короче.

3

2) Что мы технически делаем в этих 2 строчках. Объявление функции указателя.

Сначала определяется тип, который можно использовать для указания на любую функцию, которая следует за прототипом. DWORD WINAPI funcName(unsigned long*);, Затем создается переменная этого типа.

3) Почему нам нужно использовать WINAPI * в объявлении указателя функции в 1-й строке.

Так как function_1 использует WINAPI соглашение о вызовах (обычно определяется как __stdcall). Или, по крайней мере, этот код предполагает, что это так.

2
По вопросам рекламы [email protected]