Указатели на функции для по 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" вокруг нее, вы выставите свою функцию с тем же типом вызова, что и оригинал, и она будет компилироваться.