Указатели функции для функций winapi (stdcall/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)'

Я не могу выяснить то, что я должен использовать, потому что я не привык к макросам ASCII MS / широким макросам. Между прочим, я создаю указатель функции для создания быстрого взлома, и к сожалению у меня нет времени для объяснения, почему - но независимо, я думаю, что этот вопрос будет полезен людям, которые должны создать winapi указатели функции.

Обновление:

Этот код работает, но я волнуюсь, что это - плохая практика (и не придерживается опций компиляции unicode/ascii). Я должен определить две спецификации?

LRESULT (__stdcall* dwp)(HWND, UINT, WPARAM, LPARAM) = &DefWindowProc;

Обновление 2:

Это более хорошо (благодаря nobugz):

WNDPROC dwp = DefWindowProc;
9
задан Nick Bolton 28 December 2009 в 16:35
поделиться

3 ответа

Исправить несовпадение вызывающей конвенции следующим образом:

LRESULT (__stdcall * dwp)(HWND, UINT, WPARAM, LPARAM) = DefWindowProc;

Типовой документ может сделать это более читабельным:

typedef LRESULT (__stdcall * WindowProcedure)(HWND, UINT, WPARAM, LPARAM);
...
WindowProcedure dwp = DefWindowProc;

Но, уже имеет типовой документ для этого, вы можете использовать его:

WNDPROC dwp = DefWindowProc;
16
ответ дан 4 December 2019 в 12:18
поделиться

Вам не хватает __stdcall в вашем прототипе. Кроме соответствующего прототипа, вам нужно иметь соответствующее соглашение по вызову . Все функции WINAPI - __stdcall, а по умолчанию для C++ - __cdecl.

Использование extern "C" { код } является приемлемой альтернативой.

.
1
ответ дан 4 December 2019 в 12:18
поделиться

Это не "сумасшедший" макрос MS ascii/wide, у вас только что есть 2 разных объявления функций.

Если вы украсите вашу внутреннюю функцию "extern C" вокруг нее, вы выставите вашу функцию с тем же типом вызова, что и оригинал, и она скомпилируется.

.
0
ответ дан 4 December 2019 в 12:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: