Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Запись в файл в DLL, THandle файла в разных процессах [D7, WinXP]


Dmitry_177 ©   (2006-10-17 12:48:00) 

Привет всем! Мне нужно в dll записывать в файл информацию и с этим у меня возникли проблемы... Запись нужно делать в функции обработки хука, и т.к. все глобальные переменные объявленные в библиотеке в каждом процессе обнуляются (имеют свой экземпляр) сделал отображение в память (CreateFileMapping) переменных, все вроде хорошо, но в файл ничего не записывается...((( Пробовал создавать по разному файл, и паскалевским методом (AssignFile) на WinAPI, и так и так не работает... Подскажите пожалуйста!

const
 UniqueHook: PChar = 'InfoMMF';

type
 PHookInfo = ^THookInfo;
 THookInfo = packed record
   Hook: HHook;
   File: THandle;  // TextFile;
   BytesWrite: DWord;
 end;

var
 HookInfo: PHookInfo;
 MMFHandle: THandle;

function HookProc(Code: Integer; wParam: Word; lParam: LongInt): LongInt; stdcall;
begin
 WriteFile();  // WriteLn();    -> ни первой ни второй функцией (в зависимости от создаваемого файла, ничего не записывает в файл)
end;

procedure InstallHook(); export; stdcall;
begin
 HookInfo^.File := CreateFile('c:\test.txt', GENERIC_WRITE, 0, nil, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);

 {AssignFile(HookInfo^.File, 'c:\test.txt');
 if FileExists('c:\test.txt') then
   Append(HookInfo^.File)
 else
   Rewrite(HookInfo^.File);}

 HookInfo^.Hook := SetWindowsHookEx(...);
end;

procedure RemoveHook(); export; stdcall;
begin
 UnHookWindowsHookEx(HookInfo^.Hook);
 CloseHandle(HookInfo^.File);   // CloseFile(HookInfo^.File);
end;

procedure OpenGlobalData();
begin
 MMFHandle := CreateFileMapping(INVALID_HANDLE_VALUE, nil, PAGE_READWRITE, 0, SizeOf(THookInfo), UniqueHook);
 HookInfo := MapViewOfFile(MMFHandle, FILE_MAP_ALL_ACCESS, 0, 0, SizeOf(THookInfo));
end;

procedure CloseGlobalData();
begin
 UnmapViewOfFile(HookInfo);
 CloseHandle(MMFHandle);
end;

procedure DLLEntryPoint(dwReason: DWord); stdcall;
begin
 case dwReason of
   DLL_PROCESS_ATTACH: OpenGlobalData;
   DLL_PROCESS_DETACH: CloseGlobalData;
 end;
end;

exports
 InstallHook,
 RemoveHook;

begin
 DLLProc:= @DLLEntryPoint;
 DLLEntryPoint(DLL_PROCESS_ATTACH);
end.


Ketmar   (2006-10-17 13:31:00) [1]

>[4] Dmitry_177 17-Oct-2006, 13:27
>Может есть какое-нибудь решение?
конечно, есть.
открывать файл заново, а не передавать хэндлы.
сделать сервис, которому передавать данные, а он уже будет писать в файл.
и ещё куча решений.


Dmitry_177   (2006-10-17 13:27:00) [2]

Может есть какое-нибудь решение?


Ketmar   (2006-10-17 13:23:00) [3]

>[2] Dmitry_177 17-Oct-2006, 13:20
>А как же тогда сам хендл хука?
это исключение. %-)


Dmitry_177   (2006-10-17 13:20:00) [4]

А как же тогда сам хендл хука?


Ketmar   (2006-10-17 13:06:00) [5]

а кто ж тебе наврал, что хэндлы от одного процесса подходят к другому???


Наверх

Титульная страница Поиск, карта сайта Написать письмо