Странная ошибка "неверное преобразование из <type>в <type>" - PullRequest
3 голосов
/ 18 августа 2011

Вот вывод:

g++ -DDEBUG -DUNITTEST -IC:/Users/Steven/Dropbox/Programming/entropy_p5_makefile/cpp/game/../include/ -O0 -g3 -Wall -c -fmessage-length=0 -o Input.o ..\Input.cpp
..\Input.cpp: In function 'void mousehookCustomRoutine(E_thread*, void*)':
..\Input.cpp:78:93: error: invalid conversion from 'LRESULT (*)(int, WPARAM, LPARAM)' to 'LRESULT (*)(int, WPARAM, LPARAM)'
..\Input.cpp:78:93: error:   initializing argument 2 of 'void* SetWindowsHookExA(int, LRESULT (*)(int, WPARAM, LPARAM), HINSTANCE__*, DWORD)'
Build error occurred, build is stopped

Это код:

LRESULT CALLBACK MouseHookProc(int nCode, WPARAM wParam, LPARAM lParam) {
    //...
}

void mousehookCustomRoutine(E_thread *me, void *arg = (void *)&MouseHookProc) {
    // arg is the ptr to LL Mouse Routine

    me->sendMessage(0x14,me,(void*)GetCurrentThreadId());
    // send message to self in order for my parent to know how to identify me via threadID
    HHOOK mousehook = SetWindowsHookEx(WH_MOUSE_LL, (LRESULT (*)(int,WPARAM,LPARAM))arg,NULL, 0); // I am line 78
    if (mousehook == NULL) printf("Mousehook error %lu\n",GetLastError());
    //...
}

Нет смысла, потому что я преобразую в точный тип, который он ожидает получить, нет.Никаких квалификаторов или чего-то другого.Что здесь может происходить?

Ответы [ 2 ]

3 голосов
/ 18 августа 2011

Компилятор пропускает соглашение о вызовах из сообщения об ошибке - SetWindowsHookEx хочет LRESULT (__stdcall *)(int,WPARAM,LPARAM), но вы передаете ему LRESULT (__cdecl *)(int,WPARAM,LPARAM).

2 голосов
/ 18 августа 2011

Во-первых, не приводите указатели функций к void *.Никогда не безопасно вызывать функцию одного типа после приведения ее к другому, и поэтому редко, если вообще когда-либо, возникает необходимость сделать их void *.

Во-вторых, возможно, вы видите разницу всоглашения о вызовах.Тип параметра перехвата, правильно указано, (LRESULT (CALLBACK *) (int, WPARAM, LPARAM)) или просто HOOKPROC.Прототип функции должен выглядеть как LRESULT CALLBACK MouseHookProc(int, WPARAM, LPARAM).Скорее всего, gcc не распечатывает спецификатор соглашения о вызовах, а проверяет его при проверке эквивалентности типов.Тонкие проблемы, подобные этой, являются еще одной причиной, по которой не приводятся указатели на функции - если бы вы использовали приведение (HOOKPROC), у вас не было бы ошибки времени компиляции, но она могла бы аварийно завершиться во время выполнения .... , но только в определенных версияхокон .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...