Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > LRESULT CALLBACK


Автор: LifeInAir 4.7.2007, 16:16
Приветствую! 
Помогите, пожалуйста, решить проблему!

Хочу из exe вызвать CALLBACK  ф-цию, которая находится в DLL.
В DLL:
extern "C" __declspec(dllexport) LRESULT CALLBACK KeyboardHook(int,WPARAM,LPARAM); - Прототип

Сама ф-ция:
LRESULT CALLBACK KeyboardHook(int nCode,WPARAM wParam,LPARAM lParam)
{
 log( "HOOK is run");
 return 0;
}

К exe подключаю .H, в котором:
DECLSPEC_IMPORT LRESULT CALLBACK KeyboardHook(int,WPARAM,LPARAM);


Вот , что у меня в exe:
...
typedef LRESULT CALLBACK  (__stdcall *PKEYBHOOK)(int,WPARAM,LPARAM);
PKEYBHOOK pKeybHook ;
...
hLib=LoadLibrary("hook_dll.dll");
   if(hLib)
   {   logs("hook_dll is maped"); 
        int i =0;
     SetLastError(0);
     pKeybHook=(PKEYBHOOK) GetProcAddress(hLib, "KeyboardHook");
    if (pKeybHook)
    {
          logs("Success find pKeybHook"); 
    }
    else {
     logs("ERROR find pKeybHook");
    }

   }
   else logs("hook_dll is not maped - ERROR");

Так вот, exe не компилится, ругается на LRESULT CALLBACK, когда создаю указатель на ф-цию. 
error C2059: syntax error : '('
 Остальной механизм работает нормально. Что с этим делать? smile 

Спасибо.

Автор: WERITAS 4.7.2007, 16:41
скорее всего тут косяк со объявлениями функции KeyboardHook... или в ДЛЛ или в проге, или и там и там... Как-то подозрительно выглядит О_о

Убери  __stdcall из строки 
Код

typedef LRESULT CALLBACK  (__stdcall *PKEYBHOOK)(int,WPARAM,LPARAM);


потому что CALLBACK это и есть уже стдкалл

Автор: LifeInAir 5.7.2007, 08:42
Цитата(WERITAS @  4.7.2007,  16:41 Найти цитируемый пост)

Убери  __stdcall из строки 

Убрала, но он все равно ругается, типа не должно быть после LRESULT ничего. Пробовала везде ставить вместо CALLBACK __stdcall и наоборот - не помогает! Не может он получить указатель на ф-цию! 
Пробовала так 
Код

typedef LRESULT (CALLBACK *PKEYBHOOK)(int,WPARAM,LPARAM);

 тоже не помогает... 
В тоже время, если обычную ф-цию вызывать из DLL (т.е. без CALLBACK) -  все работает. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)