Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.04.2015, 11:22   #1
DIONISKA
Форумчанин
 
Регистрация: 07.11.2011
Сообщений: 161
По умолчанию dll, хуки и filemapping

Доброго времени суток. Недавно встала необходимость добавить в одну из своих программ поддержку мультимедийных клавиш. Написал хук(WH_KEYBOARD_LL), а при отлове отсылаю сообщения главной форме. Хэндл формы в dll решил передавать посредством filemapping. Создаю его примерно так:
Код:
const
shfilename:string='my_sample_value';

type
 tmymemmap =record
    handle:hwnd;
 end;
 pmymemmap=^tmymemmap;
{...}
var
  hFileMapObj: THandle;
  mymemmap:pmymemmap;
{...}
{создание}
   hFileMapObj := CreateFileMapping(MAXDWORD,@sec, PAGE_READWRITE, 0, sizeof(mymemmap), pchar(shfilename));
   if hFileMapObj=0 then raise Exception.Create('Can'+#39+'t create file mapping!');
   mymemmap:= MapViewOfFile(hFileMapObj, FILE_MAP_WRITE, 0, 0, 0);
  if mymemmap=0 then Exception.Create('MapViewOfFile failed');
   mymemmap^.handle:=handle;
{...}
{освобождение}
  UnMapViewOfFile(mymemmap);
  CloseHandle(hFileMapObj);
В dll callback функция ждёт нажатия мультимедийных клавиш и вызывает процедуру отправки сообщения, в ней-же читается хэндл из filemapping:
Код:
procedure sendhotkey(hkey:integer);
var
  ahandle:hwnd;
  aFileMapObj: THandle;
  mymemmap:pmymemmap;
begin
{...}
    aFileMapObj:=openfilemapping(FILE_MAP_ALL_ACCESS,false,pchar(shfilename));
   mymemmap := MapViewOfFile(aFileMapObj, FILE_MAP_READ, 0, 0, 0);
   ahandle:=mymemmap^.handle;
   PostMessage(ahandle,wm_myhotkey,0,hkey);
   UnMapViewOfFile(mymemmap);
   CloseHandle(aFileMapObj);
{...}
end;
И всё вроде работает, но после снятия хука и закрытия программы те приложения, в чьих адресных пространствах выполнялась процедура отправки(за исключением проводника) зависают намертво.
Getlasterror в процедуре возвращает всегда 0. Что я делаю не так?

P.S. ещё было-бы неплохо ткнуть меня в пару-тройку источников где есть способы расшаривания данных между процессами.
DIONISKA вне форума Ответить с цитированием
Старый 05.04.2015, 19:34   #2
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

Зафиг хук? Мультимедийные клавиши - по сути такие же клавиши, как и остальные, и обрабатывать их так же можно.
Somebody вне форума Ответить с цитированием
Старый 06.04.2015, 16:12   #3
DIONISKA
Форумчанин
 
Регистрация: 07.11.2011
Сообщений: 161
По умолчанию

Цитата:
Сообщение от Somebody Посмотреть сообщение
Зафиг хук? Мультимедийные клавиши - по сути такие же клавиши, как и остальные, и обрабатывать их так же можно.
Затем, чтобы их нажатие можно было отловить глобально и при необходимости "заглушить".

Собственно проблема решилась заменой MapViewOfFile на MapViewOfFileEx и использованием глобальных атомов для предотвращения единовременного доступа. Тему можно закрывать.
DIONISKA вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
dll Хуки Окна c++ daur0792 Win Api 0 29.05.2013 07:12
dll-Хуки и получение результата в exe Izhic Win Api 2 15.10.2009 18:39
Динамический массив и FileMapping (delphi) bug Win Api 0 08.10.2009 18:42
про FileMapping slimvv Win Api 0 23.08.2009 17:24