Глюк или кривые руки?

Тема в разделе "Delphi - Система", создана пользователем Coldfate, 2 июл 2006.

  1. Coldfate

    Coldfate Гость

    Пишу dll. У неё есть некоторая экспортная функция, которая вызывается с параметром WHandle типа hwnd; Этот параметр записывается в dll-скую глобальную переменную, тоже типа hwnd; DLL используется для ловушки клавиш и посылает сообщение некоторому окну, дескриптор которого и передаётся в качестве WHandle. И если я нажимаю клавишу в рабочий стол, то эот дескриптор почему-то обращается в 0 :) :angry: :angry: . Что за фигня? Если кто знает, ответьте, буду очень признателен.

    Если нужно, приведу исходники... :ph34r:
     
  2. zubr

    zubr Гость

    Проблема в том, что ты передаешь значение глобальной переменной только в контексте своего процесса. Те экземпляры dll, которые подгружаются к другим процессам, естественно это значение не получают. Как вариант, для передачи данных в dll других процессов, можно использовать файлмаппинг (отображение файлов в памяти).
     
  3. Coldfate

    Coldfate Гость

    <!--QuoteBegin-zubr+2:07:2006, 15:25 -->
    <span class="vbquote">(zubr @ 2:07:2006, 15:25 )</span><!--QuoteEBegin-->Проблема в том, что ты передаешь значение глобальной переменной только в контексте своего процесса. Те экземпляры dll, которые подгружаются к другим процессам, естественно это значение не получают. Как вариант, для передачи данных в dll других процессов, можно использовать файлмаппинг (отображение файлов в памяти).
    [snapback]39345" rel="nofollow" target="_blank[/snapback]​
    [/quote]

    А если точнее насчёт файлмаппинга?

    P.S. Значит, всё-таки руки кривые... :)
     
  4. zubr

    zubr Гость

    1. Объявляешь структуру для данных, которые нужно передавать через отражение файла в экзешнике и dll. К примеру так:
    Код (Text):
    type
    PHookInfo = ^THookInfo;
    THookInfo = packed record
    FormHandle: THandle;
    end;
    2. При загрузке экзешника и dll создаешь объект отображения файла в память. К примеру так:
    Код (Text):
    var
    Mapping:THandle=0;
    MyData:PHookInfo=nil;

    Mapping:=CreateFileMapping(INVALID_HANDLE_VALUE, NIL, PAGE_READWRITE, 0,
    SizeOf(MyData), 'MyUnicalIndentificator');
    MyData:=MapViewOfFile(Mapping, FILE_MAP_ALL_ACCESS,
    0, 0, 0);
    3. После этого можешь смело обращаться к MyData^.FormHandle в dll.
    4. Для очистки мусора используем функции UnmapViewOfFile(MyData) и CloseHandle(Mapping).
     
  5. Coldfate

    Coldfate Гость

    Zubr, Вы спасли мне жизнь... Пойду пробовать
     
  6. zubr

    zubr Гость

    Неужели все так серьезно? :)
    Удачи.
     
  7. Coldfate

    Coldfate Гость

    Тревога!!! Глюки вылезли... На тестах dll-ка вполне работала, а когда я попытался юзать её
    через сервис, то наотрез отказалась работать. Многочисленные проверки показали,
    что где-то зашкаливает сам файлмаппинг...
    Вот я кинул свои исходники сервиса (каталог HookService) и библиотеки (каталог
    HookLib). В сервисе есть константа LogFile - это имя файла для кейлоггинга.
    Поскольку у сервиса Handle я так и не нашёл, пришлось добавить форму и обрабатывать
    событие в ней. Библиотека использует сообщение WM_COPYDATA, чтобы посылать
    информацию сервису. Процедура SetHook заносит переданный Handle в отражение файла,
    но этот Handle получается какой-то корявый.
    dll-ка keyhook.dll должна находиться в каталоге с сервисом.
     

    Вложения:

    • hooksrc.zip
      Размер файла:
      10,8 КБ
      Просмотров:
      74
  8. zubr

    zubr Гость

    Для: Coldfate
    Смотреть твои исходники нет времени, но могу сказать сразу, так как ты хочешь сделать не получится. Я как то пытался сделать подобное, мне надо было из сервиса запускать исполняемый файл с невидимым окном, способным принимать сообщения, который должен был устанавливать хук. В общем вышел из положения тем, что из сервиса запускал неоконное приложение, которое устанавливало хук, в подгружаемой dll-ке проверял к какому процессу подгрузились - если это был explorer, из него запускал мое оконное приложение.
     
Загрузка...

Поделиться этой страницей