Модераторы: feodorv, GremlinProg, xvr, Fixin

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ERROR_HOOK_NEEDS_HMOD 
V
    Опции темы
ilyuha
Дата 27.11.2008, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 111
Регистрация: 10.7.2007

Репутация: нет
Всего: нет



ERROR_HOOK_NEEDS_HMOD
Cannot set nonlocal hook without a module handle.
вот такая вот ошибка уже съела мне моск  smile ума не приложу, в чем трабла - ведь я передаю инстэнс модуля дллки в SetWindowsHookEx!
код:
Код

#include "stdafx.h"
#include "KeyToMouseInterpreter.h"

#ifdef _MANAGED
#pragma managed(push, off)
#endif

KeyToMouseInterpreter k2m;//объект моего класса обрабботки нажатий клавиш

#pragma data_seg(".SHAREDDATA")

HHOOK hKeyBoardHook=NULL;
HINSTANCE hInstance;//хэндл модуля

#pragma data_seg()

LRESULT CALLBACK KeyboardProc(int code,WPARAM wParam,LPARAM lParam)
{
    if(code==HC_ACTION)
        return CallNextHookEx(hKeyBoardHook,code,wParam,lParam);
    if(lParam>=0)
        k2m.KeyPressed(wParam);
    return CallNextHookEx(hKeyBoardHook,code,wParam,lParam);
}

extern "C" __declspec(dllexport) int SetHook(int Active)
{
    if(Active){
        hKeyBoardHook=SetWindowsHookEx(WH_KEYBOARD_LL,(HOOKPROC)KeyboardProc,hInstance,0);
        return GetLastError();//1428: ERROR_HOOK_NEEDS_HMOD
    }
    else
        return (UnhookWindowsHookEx(hKeyBoardHook)!=0);
}

BOOL APIENTRY DllMain( HINSTANCE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
        case DLL_PROCESS_ATTACH:
            hInstance=hModule;//сохраняю ведь!!!
            break;

        case DLL_PROCESS_DETACH:
            // detach from process
            break;

        case DLL_THREAD_ATTACH:
            // attach to thread
            break;

        case DLL_THREAD_DETACH:
            // detach from thread
            break;
    }
    return TRUE;
}

#ifdef _MANAGED
#pragma managed(pop)
#endif

подскажите плиз  smile 
PM MAIL   Вверх
jonie
Дата 28.11.2008, 01:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 7
Всего: 118



#pragma data_seg(".SHAREDDATA")
убери бяку попробуй.

я вот так линвокал (при нахждении инстанса в .data):
Код

..\..\bin\link /section:.bss,S /DLL /DEF:wndhook.def /SUBSYSTEM:WINDOWS /MERGE:.idata=.texta /MERGE:.data=.texta /MERGE:.rdata=.texta /SECTION:.texta,EWR /IGNORE:4078 wndhook.obj
все было гуд.


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
ilyuha
Дата 28.11.2008, 13:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 111
Регистрация: 10.7.2007

Репутация: нет
Всего: нет



Цитата(jonie @  28.11.2008,  01:24 Найти цитируемый пост)
#pragma data_seg(".SHAREDDATA")убери бяку попробуй.

не помогло...
Цитата(jonie @  28.11.2008,  01:24 Найти цитируемый пост)
я вот так линвокал (при нахждении инстанса в .data):

можешь пояснить эту строчку, что тты привел?
PM MAIL   Вверх
jonie
Дата 28.11.2008, 13:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 7
Всего: 118



ну я просто смерджил секции и дал нужные им права..


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
ilyuha
Дата 28.11.2008, 13:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 111
Регистрация: 10.7.2007

Репутация: нет
Всего: нет



т.е мне надо только имена файлов поменять на свои, или все сложнее?  smile 
как-то сомневаюь, что в этом дело...

ЗЫ забыл сказать - 3 компилятора пробовал - 2005-ый, 2008-ой и мингв
PM MAIL   Вверх
ama_kid
Дата 28.11.2008, 23:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


АСУТП-кодер
***


Профиль
Группа: Комодератор
Сообщений: 1460
Регистрация: 5.3.2007
Где: Москва

Репутация: 5
Всего: 95



ilyuha, интересует как и где вызываешь SetHook? И как загружается твоя библиотека? Что мешает перенести установку данного хука в основное приложение (для хука данного типа ведь не обязательно dll использовать)?

P.S. На первый взгляд - вроде все правильно, хорошо бы отладчиком пройтись и посмотреть, чему равен hInstanсe на момент установки хука, вдруг он действительно нулевой?


--------------------
самурай без меча подобен самураю с мечом, но только без меча 
PM MAIL   Вверх
ilyuha
Дата 29.11.2008, 00:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 111
Регистрация: 10.7.2007

Репутация: нет
Всего: нет



ama_kid, Вызываю очень просто(просто тестовый проеккт маленький создал):
Код

....
HINSTANCE MHlib=NULL;//инстенс либы
int (*pSetHook)(int);//объявление указателя на ф-ию
........
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    int wmId, wmEvent;
    PAINTSTRUCT ps;
    HDC hdc;
            int st;
            char* s=new char[8];
    switch (message)
    {
    case WM_CREATE:
    MHlib=LoadLibrary(TEXT("MHlib.dll"));
    (FARPROC&)pSetHook=GetProcAddress(MHlib,"SetHook");
    st=(pSetHook)(1);
    MessageBox(hWnd,_itoa(st,s,10),"test",MB_OK);
    delete[] s;
            break;

Цитата(ama_kid @  28.11.2008,  23:49 Найти цитируемый пост)
 Что мешает перенести установку данного хука в основное приложение (для хука данного типа ведь не обязательно dll использовать)?

хы, не знал smile видимо недостаточно курил мсдн... или ты про подгрузку собственного как дллки?
но, полюбому, раз уж начал - надо ведь разобратся smile 
PM MAIL   Вверх
ilyuha
Дата 29.11.2008, 01:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 111
Регистрация: 10.7.2007

Репутация: нет
Всего: нет



Цитата(ama_kid @  28.11.2008,  23:49 Найти цитируемый пост)
вдруг он действительно нулевой?

а  как такое вообще возможно? smile 
PM MAIL   Вверх
dumb
Дата 29.11.2008, 07:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 27
Всего: 158



а проверить сначала hKeyBoardHook?
PM MAIL   Вверх
ilyuha
Дата 29.11.2008, 14:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 111
Регистрация: 10.7.2007

Репутация: нет
Всего: нет



dumb, ммм... а смысл? ведь если вызов SetWindowsHookEx завершается ошибкой(что и наблюдается), она полюбому вернет NULL.

ЗЫ проверил - так и есть
PM MAIL   Вверх
ama_kid
Дата 30.11.2008, 00:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


АСУТП-кодер
***


Профиль
Группа: Комодератор
Сообщений: 1460
Регистрация: 5.3.2007
Где: Москва

Репутация: 5
Всего: 95



Цитата(ilyuha @  29.11.2008,  01:21 Найти цитируемый пост)
или ты про подгрузку собственного как дллки?
нет, я про то, что глобальные низкоуровневые хуки WH_KEYBOARD_LL и WH_MOUSE_LL можно устанавливать непосредственно из приложения, для них не надо писать отдельную dll. 
Цитата(ilyuha @  29.11.2008,  01:21 Найти цитируемый пост)
но, полюбому, раз уж начал - надо ведь разобратся
Ты проверил чему равно hInstance при установке хука?
Цитата(ilyuha @  29.11.2008,  02:03 Найти цитируемый пост)
а  как такое вообще возможно?
Ну вдруг мы чего-то не знаем про твою систему? smile



--------------------
самурай без меча подобен самураю с мечом, но только без меча 
PM MAIL   Вверх
ilyuha
Дата 30.11.2008, 00:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 111
Регистрация: 10.7.2007

Репутация: нет
Всего: нет



ama_kid, только что посмотрел - действительно  0  smile из-за чего это можетт быть?  smile 
PM MAIL   Вверх
GremlinProg
Дата 30.11.2008, 01:38 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



на сколько я сейчас помню, общая секция имеет имя ".shared" и переменные, которые в ней расположены, должны быть обязательно проинициализированы, т.е. в данном случае, hInstance не будет слинкована в этой секции

PS: ради инициализации hInstance в DllMain, switch не нужен, hModule ведь приходит корректный на все вызовы DllMain


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
ilyuha
Дата 30.11.2008, 13:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 111
Регистрация: 10.7.2007

Репутация: нет
Всего: нет



GremlinProg, проинициализировал. результат тот же... smile 
PM MAIL   Вверх
GremlinProg
Дата 30.11.2008, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



How do I share data in my DLL with an application or with other DLLs?
Цитата(MSDN)

data_seg can be used to create a new named section (.myseg in this example). The most typical usage is to call the data segment .shared for clarity. You then must specify the correct sharing attributes for this new named data section in your .def file or with the linker option /SECTION:.MYSEC,RWS.

Цитата(MSDN)

Any variables in a shared data segment must be statically initialized. In the above example, i is initialized to 0 and a is 32 characters initialized to hello world. 

Цитата(MSDN)

Код

#pragma data_seg (".myseg")
   int i = 0; 
   char a[32]n = "hello world";
#pragma data_seg()


я же писал, убери свич для hInstance, или показывай код статической инициализации hInstance

Добавлено через 5 минут и 47 секунд
кстати, по поводу hInstance в общей секции:
Цитата(MSDN)

Never store process-specific information in a shared data segment. Most Win32 data structures or values (such as HANDLEs) are really valid only within the context of a single process. 

т.е. даже если ты засунешь hInstance в шару, она будет меняться всякий раз, при отображении длл в очередной процесс, т.е. корректным останется только последний вызов, остальные после этого будут ссылаться на чужие hInstance

таким образом, убери свитч и убери hInstance из шары, вытащи ее просто глобально, рядом с секцией


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0607 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.