
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.3] |
![]() |
|
Страницы: (9) « Первая ... 4 5 [6] 7 8 ... Последняя » все ( Перейти к последнему сообщению ) |
Сообщ.
#76
,
|
|
|
У кого еще не работает?
![]() |
Сообщ.
#77
,
|
|
|
Цитата ZShell, 27.01.04, 01:23 Слушай, а ты точно ничего не перепутал? ? ![]() Ну я ж даже строку указал, которая не выполняется. Нетрудно понять, что без неё хук не сработает, т.к. он ставится после этого условия. |
![]() |
Сообщ.
#78
,
|
|
У меня не работает
|
![]() |
|
|
У меня тоже не работает!!!
|
Сообщ.
#80
,
|
|
|
Хм.... А у вас не работает и мой откомпилиный пример?
Тогда почему у меня все работает ?! XP Professional, Microsoft Windows XP [Версия 5.1.2600], Delphi 7. Добавлено в : Да! Ну как там насчет хука на SHFileOperationA? |
Сообщ.
#81
,
|
|
|
Вот, хотел поэкспериментировать (может, мне с Делфи повезло), ан нет, вот пример, компилиный в Delphi3 Client/Server (с исходником, пришлось немного изменить, правда) - работает отлично!
Добавлено в : Оба примера (компилиный в Delphi 3 и Delphi 7 (есть еще и 5, но это уже борщ:)) ОТЛИЧНО РАБОТАЮТ в Win98SE/WinME/WinXP - проверено лично, а врать мне резону нет! Т.е. это не должно зависить ни от компилятора, ни от ОСи. Но все же можно попробовать компилировать исходник для Delphi 3 в Delphi 7 - вдруг заработает? (У меня компилится и работает). Опять таки при условии использования ИМЕННО функции DeleteFileA(), например: procedure TForm1.Button1Click(Sender: TObject); var f: File; begin AssignFile(f,'file.txt'); ReWrite(f); CloseFile(f); DeleteFile('file.txt'); end; А теперь давайте всем миром навалимся на SHFileOperationA - IMHO, она используется чаще и, отсюда следует, ее применение гораздо интереснее (перехваты не только удаления, реализованного в Виндовс, но копирования и перемещения файлов!!). Добавлено в : Оба примера (компилиный в Delphi 3 и Delphi 7 (есть еще и 5, но это уже борщ:)) ОТЛИЧНО РАБОТАЮТ в Win98SE/WinME/WinXP - проверено лично, а врать мне резону нет! Т.е. это не должно зависить ни от компилятора, ни от ОСи. Но все же можно попробовать компилировать исходник для Delphi 3 в Delphi 7 - вдруг заработает? (У меня компилится и работает). Опять таки при условии использования ИМЕННО функции DeleteFileA(), например: procedure TForm1.Button1Click(Sender: TObject); var f: File; begin AssignFile(f,'file.txt'); ReWrite(f); CloseFile(f); DeleteFile('file.txt'); end; А теперь давайте всем миров навалимся на SHFileOperationA - ее использование гораздо более широко, да и она-то как раз и является "стандартной удалялкой файлов в Винде". А как вам еще и перехват копирования и переноса файлов?! Добавлено в : (Я не тормоз, это у меня инет такой!;)) Прикреплённый файл ![]() |
Сообщ.
#82
,
|
|
|
Вот для отлова SHFileOperationA:
![]() ![]() library Mouse_mes; uses sysutils, windows, messages, shellapi; type TImageImportDescriptor=packed record OriginalFirstThunk: DWORD; TimeDateStamp: DWORD; ForwarderChain: DWORD; Name: DWORD; FirstThunk: DWORD; end; PImageImportDescriptor=^TImageImportDescriptor; var hook: HHook = 0; PEHeader:PImageNtHeaders; ImageBase:cardinal; //function MyHookProcedure(lpFileName: PChar): boolean;stdcall; function MyHookProcedure(const lpFileOp: TSHFileOpStructA): Integer; stdcall; begin MessageBox(HWND(nil), 'DeleteFile(): call', 'Bla-bla', MB_OK); ExitProcess(0); result := 0; end; procedure ProcessImports(PImports:PImageImportDescriptor); var PImport:PImageImportDescriptor; PRVA_Import:LPDWORD; ProcAddress:pointer; Temp_Cardinal:cardinal; begin{1} ProcAddress := GetProcAddress(GetModuleHandle('shell32.dll'), 'SHFileOperationA'); PImport:=PImports; while PImport.Name <> 0 do begin{2} PRVA_Import:=LPDWORD(pImport.FirstThunk+ImageBase); while PRVA_Import^ <> 0 do begin{3} if PPointer(PRVA_Import) ^= ProcAddress then begin{4} VirtualProtect(PPointer(PRVA_Import),4,PAGE_READWRITE,Temp_Cardinal); PPointer(PRVA_Import)^:=@MyHookProcedure; VirtualProtect(PPointer(PRVA_Import),4,Temp_Cardinal,Temp_Cardinal); end;{1} Inc(PRVA_Import); end;{2} Inc(PImport); end;{3} end;{4} procedure DllEntryPoint(reson:longint);stdcall; begin case reson of DLL_PROCESS_ATTACH: begin DisableThreadLibraryCalls(hInstance); ImageBase := GetModuleHandle(nil); PEHeader := pointer(int64(ImageBase) + PImageDosHeader(ImageBase)._lfanew);//pe header ProcessImports(pointer(PEHeader.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress+ImageBase)); end; end; end; function nexthook(code:integer;wParam,lParam:longint):longint;stdcall; begin result:=callnexthookex(hook,code,wParam,lParam); end; procedure sethook(flag:bool);export; stdcall; begin if flag then hook:=setwindowshookex(wh_getmessage,@nexthook,hInstance,0) else begin unhookwindowshookex(hook); hook:=0; end; end; exports sethook; begin DLLProc:=@DllEntryPoint; DllEntryPoint(DLL_PROCESS_ATTACH) end. Все тоже самое! Добавлено в : Exe для проверки: ![]() ![]() uses ShellAPI; function SimpleCopyFiles(_pfrom,_pto: string): boolean; var lpFileOp: TSHFILEOPSTRUCT; begin with lpFileOp do begin Wnd:=form1.handle; wFunc:=FO_COPY; pFrom:=PChar(_pfrom); pTo:=PChar(_pto); fFlags:=0; fFlags:=(fFlags OR FOF_RENAMEONCOLLISION); end; if SHFileOperation(lpFileOp)<>0 then Result:=FALSE else Result:=TRUE; end; onClick: SimpleCopyFiles('aaa', 'bbb'); |
Сообщ.
#83
,
|
|
|
:ZShell
Нет. И все-таки этот пример у меня не работает... |
Сообщ.
#84
,
|
|
|
:xZero
А вот пример с SHFileOperationA идет без проблем если использую указанный пример. Но если копирую через систему, то не работает. Видать там всеже не эта функция используется. Может кто знает. Хотя меня интересует скорее процес удаления ![]() Кстати попробовал половить другие функции!!! Все ловится кроме DeleteFileA ->>> Паралокс! B) Добавлено в : Знаете. Хотя сейчас мне это уже не нужно(Слава богу музыка осталась цела), я все равно хочу добраться до истины.... Тема та довольно интересная. |
![]() |
Сообщ.
#85
,
|
|
Тема очень интересная. Сейчас кстати проверю код xZero
|
Сообщ.
#86
,
|
|
|
Может еще SHFileOperationW использоваться.. Или у него еще родственные функции есть...
|
Сообщ.
#87
,
|
|
|
Прикольно... Эксперименты с SHFileOperation привели у меня к следующему:
SHFileOperationA сработала 1 раз, поймав удаление файла с длинным именем. И это с учетом того, что я гонял файлы туда-сюда, удалял и создавал их средствами системы (WinXP) по многу раз. Т.е. что-то тут не так, раз хук срабатывает "раз на миллион". SHFileOperationW (с использованием WideChar) не сработала ни разу! Хотя, может, я мало пробовал. Но мы же боремся за срабатывание с первого раза, не так ли? Люди, у кого есть MSDN, что там про нее пишуть? На microsoft лезть не хочу - тормозит ужасно! ![]() |
Сообщ.
#88
,
|
|
|
SHFileOperationW у меня тоже не работает. А кстати что такое MSDN?
|
Сообщ.
#89
,
|
|
|
Возможно, не успевает поймать все, т.к. липнет к эксплореру".
Добавлено в : Цитата Du-Xa @ 29.01.04, 16:34 А кстати что такое MSDN? Все, о чем мы говорили в этой ветке - может это неи то, с чего надо начинать? Может я неправильно выразлся! Но я хотел сказать, что на протяжении этой ветки никто из нас ни разу не открыл спецификацию ре файлов и не поглядел её, ни кто не попытался поизучать подобные темы, поискав их в инете - верно? Мы будем изучать это, такими шагами, очень и очень долго! Может мы постараемся все понять с нуля!? А то мы просто изменяем в данном коде одно, два слова и пытаемся дождаться когда же он заработает - верно? |
Сообщ.
#90
,
|
|
|
Вы правы. Мы стоим на одном месте, меняя слова, но не понимая сути. Но я еще нигде не видел инфы по этому поводу, и по этому здесь и задал такой вопрос. Я с hook'ами некогда не работал раньше, и вот понадобилось. MSDN часто слышал это слово, понимаю примерно так: описание windows функций, типа огромная библиотека по windows для програмистов - это так?...
|