Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

SetWindowsHookEx

333
01 мая 2006 года
GHopper
200 / / 28.12.2004
Здраствуйте!
есть dll, в ней функция:
 
Код:
extern "C" __declspec(dllexport) LRESULT MouseProc(int nCode, WPARAM wParam, LPARAM lParam)
{
  MessageBox(0, "MouseProc function is executed!", "OK", MB_OK);
  return 666;
}


есть exe-файл, загружающий эту библиотеку и вызывыающий SetWindowsHookEx(WH_MOUSE, pfnMyFunc, hMyDll, 0);

Код:
typedef LRESULT (*MYFUNCTION)(int, WPARAM, LPARAM);
MYFUNCTION   pfnMyFunc=0;   //pointer to MyFunction
HINSTANCE    hMyDll;
...
    hMyDll = ::LoadLibrary("C:\\tmp\\dll\\Debug\\dll.dll");

if(hMyDll != NULL)
{
   //Get the functions address
   pfnMyFunc = (MYFUNCTION)::GetProcAddress(hMyDll, "MouseProc");

   //Release DLL if we werent able to get the function
   if(pfnMyFunc== 0)  
   {
      ::FreeLibrary(hMyDll);
      return FALSE;
   }

   //Call the Function
   LRESULT result = pfnMyFunc(0,0,0);
   
   //Release the DLL if we dont have any use for it now
//   ::FreeLibrary(hMyDll);
SetWindowsHookEx(WH_MOUSE, pfnMyFunc, hMyDll, 0);
}


все это дело вызывает ошибку: error C2664: 'SetWindowsHookExA' : cannot convert parameter 2 from 'long (__cdecl *)(int,unsigned int,long)' to 'long (__stdcall *)(int,unsigned int,long)'
534
01 мая 2006 года
HarryAxe
448 / / 19.01.2006
Цитата:
Originally posted by GHopper
Здраствуйте!
есть dll, в ней функция:
 
Код:
extern "C" __declspec(dllexport) LRESULT MouseProc(int nCode, WPARAM wParam, LPARAM lParam);


есть exe-файл, загружающий эту библиотеку и вызывыающий SetWindowsHookEx(WH_MOUSE, pfnMyFunc, hMyDll, 0);

 
Код:
typedef LRESULT (*MYFUNCTION)(int, WPARAM, LPARAM);


все это дело вызывает ошибку: error C2664: 'SetWindowsHookExA' : cannot convert parameter 2 from 'long (__cdecl *)(int,unsigned int,long)' to 'long (__stdcall *)(int,unsigned int,long)'


Мануалы читаем внимательней и соглашения вызовов для API функций указывать не забываем:
LRESULT CALLBACK MouseProc(int nCode, WPARAM wParam, LPARAM lParam);
typedef LRESULT (CALLBACK *MYFUNCTION)(int, WPARAM, LPARAM);

333
01 мая 2006 года
GHopper
200 / / 28.12.2004
Ошибка исчесзла. Если в функцию из dll (теперь уже MyFunc) не передавать никаких параметров, то все работает. А вот если с параметрами, то сообщение: "The value of ESP was not properly saved accross a function call. This is usually a result of calling a function declared with one calling convertion with a function pointer declared with a different calling convertion".

Код:
// test.cpp : Defines the entry point for the application.
//

#include "stdafx.h"
typedef LRESULT (CALLBACK *MYPROC)(int, WPARAM, LPARAM);

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
    // TODO: Place code here.
  HINSTANCE hinstLib;
  MYPROC ProcAdd;

  hinstLib = LoadLibrary("C:\\tmp\\dll_test\\hook\\Debug\\hook.dll");

  // If the handle is valid, try to get the function address.
  if (hinstLib != NULL)
  {
    ProcAdd = (MYPROC) GetProcAddress(hinstLib, "MyFunc");

    // Do add operation
    // If the function address is valid, call the function.
    if (ProcAdd)
      (ProcAdd)(0,0,0);

//    SetWindowsHookEx(WH_MOUSE, ProcAdd, hinstLib, 0);

    // Free the DLL module.
    FreeLibrary(hinstLib);
  }
    return 0;
}


Код:
// hook.cpp : Defines the entry point for the DLL application.
//

#include "stdafx.h"
#include "hook.h"

BOOL APIENTRY DllMain( HANDLE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
        case DLL_PROCESS_ATTACH:
      MessageBox(0, "Dll load in procces!", "OK", MB_OK);
      break;
        case DLL_THREAD_ATTACH:
        case DLL_THREAD_DETACH:
        case DLL_PROCESS_DETACH:
      MessageBox(0, "Dll unload from procces!", "OK", MB_OK);
      break;
    }
    return TRUE;
}

//extern "C" __declspec(dllexport)
LRESULT CALLBACK MyFunc(int nCode,
                        WPARAM wParam,
                        LPARAM lParam)
{
  MessageBox(0, "Hello from MyFunc!", "OK", MB_OK);
  return 1;
}
534
01 мая 2006 года
HarryAxe
448 / / 19.01.2006
Цитата:
Originally posted by GHopper
Ошибка исчесзла. Если в функцию из dll (теперь уже MyFunc) не передавать никаких параметров, то все работает. А вот если с параметрами, то сообщение: "The value of ESP was not properly saved accross a function call. This is usually a result of calling a function declared with one calling convertion with a function pointer declared with a different calling convertion".

Обычно хук ставят из той же dll, что и обработчик (к примеру, в DllMain). А функцию нужно передавать как
SetWindowsHookEx(WH_MOUSE, (HOOKPROC) ProcAdd, hMod, 0);

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог