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

  • Автор темы Coldfate
  • Дата начала
C

Coldfate

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

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

zubr

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

Coldfate

Гость
#3
<!--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. Значит, всё-таки руки кривые... :)
 
Z

zubr

Гость
#4
1. Объявляешь структуру для данных, которые нужно передавать через отражение файла в экзешнике и dll. К примеру так:
Код:
type
PHookInfo = ^THookInfo;
THookInfo = packed record
FormHandle: THandle;
end;
2. При загрузке экзешника и dll создаешь объект отображения файла в память. К примеру так:
Код:
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).
 
C

Coldfate

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

Coldfate

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

Вложения

Z

zubr

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