extern "C" __declspec(dllexport) LRESULT MouseProc(int nCode, WPARAM wParam, LPARAM lParam)
{
MessageBox(0, "MouseProc function is executed!", "OK", MB_OK);
return 666;
}
SetWindowsHookEx
есть dll, в ней функция:
Код:
есть 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);
}
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)'
Цитата:
Originally posted by GHopper
Здраствуйте!
есть dll, в ней функция:
есть exe-файл, загружающий эту библиотеку и вызывыающий 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)'
Здраствуйте!
есть 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);
Код:
// 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;
}
//
#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;
}
//
#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;
}
Цитата:
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 (теперь уже 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);