Здравствуйте, Alex Fedotov, Вы писали:
AF>Возможно, что ваша DLL не может быть загружена в другие процессы, поскольку зависит от других DLL, которых нет в стандартных каталогах, где ищет система (PATH, system32, и так далее). Список DLL, от которых зависит ваша DLL вы легко можете получить с помощью утилиты depends.exe из Platform SDK.
Проверил. Не зависит.
Переписал ее полностью на С, без использовании вообще чего-то Билдерововского.
Работать не стало
Немного измененный код: (C-style)
//---------------------------------------------------------------------------
#include <windows.h>
#pragma data_seg(".JOE")
HWND hWnd = NULL;
#pragma data_seg()
HHOOK hHook;
HINSTANCE hInstance;
#pragma argsused
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fwdreason, LPVOID lpvReserved)
{
hInstance = hinstDLL;
return 1;
}
//---------------------------------------------------------------------------
extern __declspec(dllexport) LRESULT CALLBACK _stdcall MouseHookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
LPMSG FirstParam = (LPMSG)wParam;
if(FirstParam->wParam == MK_LBUTTON)
{
LPMSG SecondParam = (LPMSG)lParam;
int x = SecondParam->pt.x;
int y = SecondParam->pt.y;
::MessageBox(0, "test", "OK", MB_OK);
}
return ::CallNextHookEx(hHook, nCode, wParam, lParam);
}
//---------------------------------------------------------------------------
extern __declspec(dllexport) BOOL CALLBACK SetMyHook(HWND AWnd)
{
hWnd = AWnd;
hHook = ::SetWindowsHookEx(WH_MOUSE, (HOOKPROC) MouseHookProc, (HINSTANCE)hInstance, NULL);
if(hHook != NULL)
{
::MessageBox(0, "Hook was SET.", "OK", MB_OK);
} else
{
switch(::GetLastError())
{
case ERROR_INVALID_HOOK_FILTER: ::MessageBox(0, "ERROR_INVALID_HOOK_FILTER", "OK", MB_OK); break;
case ERROR_HOOK_NEEDS_HMOD: ::MessageBox(0, "ERROR_HOOK_NEEDS_HMOD", "OK", MB_OK); break;
case ERROR_GLOBAL_ONLY_HOOK: ::MessageBox(0, "ERROR_GLOBAL_ONLY_HOOK", "OK", MB_OK); break;
case ERROR_INVALID_PARAMETER: ::MessageBox(0, "ERROR_INVALID_PARAMETER", "OK", MB_OK); break;
case ERROR_JOURNAL_HOOK_SET: ::MessageBox(0, "ERROR_JOURNAL_HOOK_SET", "OK", MB_OK); break;
default: ::MessageBox(0, "UNKNOWN error", "OK", MB_OK); break;
}
}
return 1;
}
//---------------------------------------------------------------------------
extern __declspec(dllexport) BOOL CALLBACK ClearMyHook(HWND AWnd)
{
int Result = ::UnhookWindowsHookEx(hHook);
if(Result) ::MessageBox(0, "Hook WAS deleted.", "OK", MB_OK);
else
{
LPVOID lpMsgBuf;
::FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
(LPTSTR) &lpMsgBuf,
0,
NULL
);
::MessageBox(0, (char *)lpMsgBuf, "GetLastError", MB_OK|MB_ICONINFORMATION );
::LocalFree( lpMsgBuf );
}
return Result;
}
//---------------------------------------------------------------------------