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