| Сейчас на форуме: user99, _MBK_, ManHunter, Magister Yoda, rtsgreg1989 (+9 невидимых) | 
| eXeL@B —› Основной форум —› Доступ к файлу | 
| Посл.ответ | Сообщение | 
| 
 | 
Создано: 15 октября 2005 11:40  · Личное сообщение · #1  | 
| 
 | 
Создано: 15 октября 2005 12:49  · Личное сообщение · #2 Если файл открыть на шару, то его можно изменять. Поэтому достаточно в проге изменить права на открытие файла (FILE_SHARE_READ | FILE_SHARE_WRITE). Смотри функцию CreateFile. Проблема может быть тогда, когда прога использует что-то типа CFile, ведь вызов уйдёт глубоко в библиотеку. Но и в таком случаи достаточно добавить константу CFile::shareDenyNone. ![]()  | 
| 
 | 
Создано: 15 октября 2005 13:03  · Личное сообщение · #3  | 
| 
 | 
Создано: 15 октября 2005 13:25  · Личное сообщение · #4  | 
| 
 | 
Создано: 15 октября 2005 14:32  · Личное сообщение · #5  | 
| 
 | 
Создано: 15 октября 2005 15:23  · Личное сообщение · #6  | 
| 
 | 
Создано: 15 октября 2005 19:01  · Личное сообщение · #7 Windows блокирует ПОЛНЫЙ доступ ко многим файлам, которые в данный момент использует система. К таким файлам относятся выполняемые программы, используемые библиотеки, шрифты и т.д. При поиске вирусов, к примеру, эти файлы представляют наибольший интерес. Обдурить Windows и получить доступ к этим файлам крайне просто - нужно открывать их в режиме ReadOnly. В Delphi за режим открытия файлов отвечает системная переменная FileMode. Boзможные значения: 0 Read only 1 Write only 2 Read/Write По умолчанию FileMode==2, поэтому открытие заблокированых файлов нарывается на неприятность. При доступе ReadOnly доступ блокируется только д так что этот случай приходится контролировать отдельно. В общем случае, если Вы хотите лазить по всем файлам подряд - применима следующая последовательность действий. program pfileMode; {$APPTYPE CONSOLE} uses SysUtils; var oldFM: integer; var SR: TSearchRec; begin if FindFirst('C:\*.*', faAnyFile, SR) = 0 then repeat try oldFM := FileMode; FileMode := 0; WriteLn(SR.Name); //работаем с файлом finally FileMode := oldFM; end; until FindNext(SR) < > 0; FindClose(SR); readLn; end. ----- M&#225 enginn renna undan &#254v&#237 sem honum er skapa&#240 ![]()  | 
| 
 | 
Создано: 16 октября 2005 00:50  · Личное сообщение · #8  | 
| 
 | 
Создано: 16 октября 2005 02:05 · Поправил: ZLOFENIX  · Личное сообщение · #9 Попробовал вот что получилось: program pfileMode; {$APPTYPE CONSOLE} uses SysUtils; var FromF, ToF: file; NumRead, NumWritten: Integer; Buf: array[1..2048] of Char; oldfm:integer; begin oldfm:=filemode; filemode:=0; AssignFile(FromF, 'xxx.fgh'); Reset(FromF, 1); { Record size = 1 } AssignFile(ToF, 'original.fgh'); Rewrite(ToF, 1); { Record size = 1 } repeat BlockRead(FromF, Buf, SizeOf(Buf), NumRead); BlockWrite(ToF, Buf, NumRead, NumWritten); until (NumRead = 0) or (NumWritten <> NumRead); filemode:=oldfm; CloseFile(FromF); CloseFile(ToF); end. НЕСРАБОТАЛО или я кривой ? т.к. я незнаю как переписать файл через Write/Read списал через BlockWrite/BlockRead или еще как то можно переписать чтобы это все работало ? НЕ ИЗМЕНЯЯ EXE ! ![]()  | 
| 
 | 
Создано: 16 октября 2005 04:26 · Поправил: cbs  · Личное сообщение · #10  | 
| 
 | 
Создано: 16 октября 2005 05:00  · Личное сообщение · #11  | 
| 
 | 
Создано: 16 октября 2005 12:50  · Личное сообщение · #12 В ольке bp CreateFile, выходишь из процедуры. Если оказываешься в файле(а не MFC библиотеке), то должен будешь увидеть что-то типа этого: push 0 ;цифры могут быть разными push 80 push 3 push 0 push 1 ;вот тут и надо править push 80000000 push eax call CreateFileA ... ;ты тут А вот если окажешься в MFC библиотеке, то нажимаешь Debug->Execute till user code и смотришь номер той функции которая была вызвана. С ней и надо будет разбираться. ![]()  | 
| eXeL@B —› Основной форум —› Доступ к файлу | 



 Найди место в проге где осуществляется открытие файла, и поменяй тип доступа. Скажем с помощью Иды или Айса (поиск текстовой строки или брейкпоинт). А дальше Hiew.



 Для печати