Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > как разблокировать хендл открытого файла ?


Автор: Syberex 27.1.2007, 10:21
проблемка такая, необходимо разблокировать хендл открытого фала, а потом удалить файл или переименовать, переместить, как это сделать?

Автор: Alexey_2007 27.1.2007, 10:32
Если файл открыт другим процессом, то простого открытого способа перетянуть его себе я не знаю.

Зато! Есть способ поометить его например на удаление после перезагрузки компьютера, и при желании - эту перезагрузку вызвать.

Код

if (!FileExists(f))
  return;
TRegistry* Reg=new TRegistry;
Reg->RootKey = HKEY_LOCAL_MACHINE;
Reg->OpenKey("\\Software\\Microsoft\\Windows\\CurrentVersion\\RunOnce", true);
Reg->WriteString("Filez for delete","command.com /c del "+f);
Reg->CloseKey();


Пометили на удаление... все ОК вроде...

Добавлено @ 10:34 
Перезагрузить можно либо так
Код

ExitWindowsEx(EWX_FORCE,0);

либо так
Код

ExitWindowsEx(EWX_REBOOT,0);

Например.

Автор: Syberex 27.1.2007, 11:19
Ну спасибки, ну перезагрузку не очень хочется.
есть програмка http://ccollomb.free.fr/unlocker/unlocker1.8.1.exe , которая позволяет разбокировать хендлы, но думаю это не сложно с++ сделать, но вот как ?

Автор: W4FhLF 27.1.2007, 11:38
Хэндлы не бывают заблокированные или не заблокированные... А работа с занятыми файлами обсуждалась не раз и были приведены рабочие примеры. Сходи на wasm.ru там вообще этой теме отдельная статья посвящена, 3 способа рассматривается и как раз на С++.

Автор: Damarus 27.1.2007, 11:49
Цитата(Alexey_2007 @  27.1.2007,  10:32 Найти цитируемый пост)
Зато! Есть способ поометить его например на удаление после перезагрузки компьютера, и при желании - эту перезагрузку вызвать.
Код
if (!FileExists(f))  
    return;
TRegistry* Reg=new TRegistry;
Reg->RootKey = HKEY_LOCAL_MACHINE;
Reg->OpenKey("\\Software\\Microsoft\\Windows\\CurrentVersion\\RunOnce", true);
Reg->WriteString("Filez for delete","command.com /c del "+f);
Reg->CloseKey();


Код
MoveFileEx("<file>", NULL, MOVEFILE_DELAY_UNTIL_REBOOT);



Автор: Syberex 27.1.2007, 12:09
Цитата(W4FhLF @ 27.1.2007,  11:38)
Хэндлы не бывают заблокированные или не заблокированные... А работа с занятыми файлами обсуждалась не раз и были приведены рабочие примеры. Сходи на wasm.ru там вообще этой теме отдельная статья посвящена, 3 способа рассматривается и как раз на С++.

typedef struct _SYSTEM_HANDLE
{
    ULONG       uIdProcess;
    UCHAR       ObjectType;
    UCHAR       Flags;
    USHORT      Handle;
    POBJECT     pObject;
    ACCESS_MASK GrantedAccess;
} SYSTEM_HANDLE, *PSYSTEM_HANDLE;

вот эту штуку не компилит , какую инклюду включить system.h  не рулит

 smile 

Автор: Любитель 27.1.2007, 13:50
Syberex, пиши подробней - на что ругается.

Насчёт инклюдов - поставь windows.h. Или winnt.h + windefs.h, но первое надёжней  smile 

Автор: Syberex 27.1.2007, 13:53
включил эти файлы

#include "ntdll.h"
#include "ntstatus.h"

но в ntdll.h при компиляции пишит ошибку , что макрос не правильный 
строчка 3310 , макрос  #define RtlLargeIntegerLessThanZero($a)    (($a).HighPart < 0)

и что тут не правильно ?  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)