Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.10.29;
Скачать: CL | DM;

Вниз

Запись в файл в DLL, THandle файла в разных процессах   Найти похожие ветки 

 
Dmitry_177   (2006-10-17 12:48) [0]

Привет всем! Мне нужно в 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:06) [1]

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


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

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


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

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


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

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


 
Ketmar ©   (2006-10-17 13:31) [5]

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



Страницы: 1 вся ветка

Текущий архив: 2006.10.29;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.05 c
15-1159866263
vitv
2006-10-03 13:04
2006.10.29
Я нашёл официальный русский MSDN.


2-1160660103
root
2006-10-12 17:35
2006.10.29
Нужна помощ!!!!


15-1160500999
Kolan
2006-10-10 21:23
2006.10.29
Как установить MSDE.


2-1160638881
Volodya_
2006-10-12 11:41
2006.10.29
TOleContainer


15-1160511177
default
2006-10-11 00:12
2006.10.29
Грамматика Мерфи(English grammar in use)