Указатели на функции для по WinAPI функции (нарушением соглашения о стандартном/ключевое слово cdecl)
пожалуйста, кто-нибудь может дать мне несколько советов по созданию указателей функций для функций MS winapi? Я пытаюсь создать указатель для DefWindowProc (DefWindowProcA/DefWindowProcW), но получаю эту ошибку:
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)'
Я не могу понять, что мне нужно использовать, потому что я не привык к макросам MS ascii/wide. Кстати, я создаю указатель функции для быстрого взлома, и, к сожалению, у меня нет времени объяснять, почему - но независимо от этого, я думаю, что этот вопрос будет полезно для людей, которым нужно создать указатели функций winapi.
обновление:
этот код работает, но я беспокоюсь, что это плохая практика (и не придерживается параметров компиляции unicode/ascii). Должен ли я определить две спецификации?
LRESULT (__stdcall* dwp)(HWND, UINT, WPARAM, LPARAM) = &DefWindowProc;
обновление 2:
Это приятнее (благодаря nobugz):
WNDPROC dwp = DefWindowProc;
3 ответов
исправить несоответствие вызывающего соглашения следующим образом:
LRESULT (__stdcall * dwp)(HWND, UINT, WPARAM, LPARAM) = DefWindowProc;
a typedef может сделать это более читаемым:
typedef LRESULT (__stdcall * WindowProcedure)(HWND, UINT, WPARAM, LPARAM);
...
WindowProcedure dwp = DefWindowProc;
а, <windows.h>
уже есть typedef для этого, вы могли бы также использовать:
WNDPROC dwp = DefWindowProc;
тебе не хватает __stdcall
в свой прототип. Вам нужно иметь соответствующий вызов кроме соответствующего прототипа. Функции WINAPI все __stdcall
, в то время как по умолчанию для C++ -__cdecl
.
используя extern "C" { code }
является жизнеспособной альтернативой.
Это не "сумасшедший" макрос MS ascii/wide, у вас просто есть 2 разных объявления функций.
Если вы украсите свою внутреннюю функцию "extern C" вокруг нее, вы выставите свою функцию с тем же типом вызова, что и оригинал, и она будет компилироваться.