Здравствуйте, VoidEx, Вы писали:
VE>Из-за (1) у вас возвращается нуль, а из-за (2) — обращение по этому нулю.
Большое спасибо за помощь! Dll загружается, но хук все же не работает

...
Может быть у кого-нибудь есть что подсказать.
Вот мой конечный вариант кода:
--- код dll [сборка в MS VS2005] ---
// mousehook.cpp : Defines the entry point for the DLL application.
#include "stdafx.h"
#pragma data_seg(".hdata") // секция в памяти общая для всех процессов
HWND hWndServer = NULL; // эта переменная может изменяться любым процессом, поэтому здесь не д.б. ничего лишнего
#pragma data_seg() // конец секции
#pragma comment(linker, "/section:.hdata,rws") // даем права этой секции
#ifdef __cplusplus
#define EXPORT extern "C" __declspec(dllexport)
#else
#define EXPORT __declspec(dllexport)
#endif
// объявление функции обратного вызова
LRESULT CALLBACK MouseProc(int code, WPARAM wParam, LPARAM lParam);
// глобальные переменные
HHOOK HookHandle;
HINSTANCE DllInstance;
#ifdef _MANAGED
#pragma managed(push, off)
#endif
//----------------------------------------------------------------------
EXPORT BOOL InstallMouseHook(HWND AWnd) {
if(hWndServer != NULL)
return false;
HookHandle = SetWindowsHookEx(WH_GETMESSAGE,
reinterpret_cast<HOOKPROC>(MouseProc), DllInstance, NULL);
HookHandle = SetWindowsHookEx(WH_MOUSE,
reinterpret_cast<HOOKPROC>(MouseProc), DllInstance, NULL);
if(HookHandle == NULL)
return false;
return true;
}
//----------------------------------------------------------------------
EXPORT BOOL RemoveMouseHook(HWND AWnd //окно, чей хук должен быть снят
)
{
if(AWnd != hWndServer)
return false;
BOOL unhooked = UnhookWindowsHookEx(HookHandle);
if(unhooked)
hWndServer = NULL;
return unhooked;
}
//----------------------------------------------------------------------
LRESULT CALLBACK MouseProc(int code, WPARAM wParam, LPARAM lParam) {
if(code < 0) {
CallNextHookEx(HookHandle, code, wParam, lParam);
return 0;
}
LPMSG msg = (LPMSG)lParam;
if( (hWndServer = FindWindow(L"TForm1", L"Form1")) == NULL )
return 0;
else {
if(msg->message == WM_LBUTTONDOWN || msg->message == WM_LBUTTONUP ||
msg->message == WM_RBUTTONDOWN || msg->message == WM_RBUTTONUP )
PostMessage(hWndServer, msg->message, 0, 0);
}
// вызываем следующий хук в цепи
return CallNextHookEx(HookHandle, code, wParam, lParam);
}
//----------------------------------------------------------------------
BOOL APIENTRY DllMain( HMODULE hModule, // дескриптор экземпляра DLL
DWORD reason, // причина вызова
LPVOID lpReserved // зарезервировано
)
{
// вызывается каждый раз когда новый процесс грузит DLL в свою память
if( reason == DLL_PROCESS_ATTACH ) {
if( ! hWndServer ) {
// cохраняем дескриптор экземпляра, он понадобится позднее для установки хука
DllInstance = hModule;
return true;
}
} else if( reason == DLL_PROCESS_DETACH ) {
if( hWndServer != NULL )
RemoveMouseHook(hWndServer);// ЕСЛИ сервер не снял хук, снимем его
return true;
}
return TRUE;
}
//----------------------------------------------------------------------
#ifdef _MANAGED
#pragma managed(pop)
#endif
--- исполняемое приложение — сервер [сборка в C++Builder 6.0] ---
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "mshookmain.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
typedef bool (__stdcall *MOUSEHOOKFCT)(HWND);
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender) {
DllHandle = LoadLibrary("mousehook.dll");
MOUSEHOOKFCT InstHook = reinterpret_cast<MOUSEHOOKFCT>
(GetProcAddress(DllHandle, "InstallMouseHook"));
if( ! InstHook )
Label1->Caption = "Unable to set hook!";
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender) {
MOUSEHOOKFCT RemHook = reinterpret_cast<MOUSEHOOKFCT>
(GetProcAddress(DllHandle, "RemoveMouseHook"));
if( ! RemHook )
Label1->Caption = "Unable to remove hook!";
FreeLibrary(DllHandle);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ApplicationEvents1Message(tagMSG &Msg,
bool &Handled)
{
switch( Msg.message ) {
case WM_LBUTTONDOWN :
Label2->Caption = "LEFT MOUSE BUTTON PRESSED!";
break;
case WM_LBUTTONUP :
Label2->Caption = "LEFT MOUSE BUTTON RELEASED!";
break;
case WM_RBUTTONDOWN :
Label2->Caption = "RIGHT MOUSE BUTTON PRESSED!";
break;
case WM_RBUTTONUP :
Label2->Caption = "RIGHT MOUSE BUTTON RELEASED!";
break;
}
}