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

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

THandle [D7, Win95/98, WinME, NT4, Win2k, WinXP]


cp.Silver ©   (2005-12-07 16:44:00) 

Есть такая ситуация: некая сторонняя программа открывает файл функцией FileOpen и сохраняет в свою переменную его Handle. Есть ли способ из моей программы узнать Handle открытого файла и "отобрать" его у этой программы?


cp.Silver   (2005-12-08 20:50:00) [1]

Программа открывает файл с флагом fmShareExclusive. И похоже открыть его не получится. Попробую Far...


Rouse_   (2005-12-08 10:19:00) [2]

Вполне возможно, не буду спорить т.к. не эксперементировал :)


Leonid Troyanovsky   (2005-12-08 10:07:00) [3]


> Rouse_ ©   (08.12.05 09:58) [12]
> Эээ, думаю можно обойтись без DuplicateHandle.

> К примеру есть у меня Compaund File открытый на сервере
> через StgOpenStorage с флагом STGM_READWRITE or STGM_SHARE_EXCLUSIVE.


Это, IMHO, немного разные вещи.
Думаю, что повторно CreateFile c dwShareMode = 0 несколько сложней.

Поэтому и нужен DuplicateHandle.
Правда, не всякий "файл" можно, но, что уж есть.

--
Regards, LVT.


Rouse_   (2005-12-08 09:58:00) [4]

Эээ, думаю можно обойтись без DuplicateHandle.

К примеру есть у меня Compaund File открытый на сервере через StgOpenStorage с флагом STGM_READWRITE or STGM_SHARE_EXCLUSIVE.

Мне нужно получить полную его копию на текущий момент времени на стороне клиента. Чтобы не мешать работе сервера делаю так:

procedure TGSNetworkServer.DigestLoadNewDB(Client: TGSClientSocketItem;
 Index: Integer);
var
 AResult: String;
 hFile, hMapFile: THandle;
 lpFileBuffer: Pointer;
 FileSize, FileSizeHigh: DWORD;
begin
 if (Index < 0) or (Index >= FDigest.Items.Count) then
 begin
   AResult := HDR_ERROR + ERR_FALSE;
   if Client.ReadyToWrite then
     Client.SendText(AResult);
   Exit;
 end;
 try
   hFile := CreateFile(PChar(FDigest.Items[Index].DigestPath), GENERIC_READ,
     FILE_SHARE_READ, nil, OPEN_EXISTING, FILE_ATTRIBUTE_SYSTEM, FILE_FLAG_SEQUENTIAL_SCAN);
   if hFile <> INVALID_HANDLE_VALUE then
   try
     FileSize := GetFileSize(hFile, @FileSizeHigh);
     hMapFile := CreateFileMapping(hFile, nil, PAGE_READONLY, 0, 0, nil);
     if (hMapFile <> 0) and (GetLastError <> ERROR_ALREADY_EXISTS) then
     try
       lpFileBuffer := MapViewOfFile(hMapFile, FILE_MAP_READ, 0, 0, 0);
       if lpFileBuffer <> nil then
       try
         if Client.ReadyToWrite then
           Client.SendMemoryWithHeader(HDR_DIGEST_UPLOAD, lpFileBuffer, FileSize);
       finally
         UnmapViewOfFile(lpFileBuffer);
       end;
     finally
       CloseHandle(hMapFile);
     end;
   finally
     CloseHandle(hFile);
   end;
 except
   AResult := HDR_ERROR + ERR_FALSE;
   if Client.ReadyToWrite then
     Client.SendText(AResult);
 end;
end;


И волки как говориться сыты, и овцы не разбежались :)


tesseract   (2005-12-08 09:45:00) [5]

А что программа пишущая намертво закрывает файл даже для чтения? Попробуй открыть его с SHARE_READ


Leonid Troyanovsky   (2005-12-08 09:43:00) [6]


> Rouse_ ©   (07.12.05 20:01) [9]

> > Как там с согласованностью данных?

> На момент отображения данных - полная:)


Ну, раз так, то могу предположить схему.
Сначала DuplicateHandle себе нужного хендла.
Затем CreateFileMapping только на чтение.
Ну, и MapViewOfFile.
Думаю, что оно не будет мешать пишущему процессу.

--
Regards, LVT.


Rouse_   (2005-12-07 20:01:00) [7]


> Как там с согласованностью данных?

На момент отображения данных - полная:)


Leonid Troyanovsky   (2005-12-07 19:01:00) [8]


> Игорь Шевченко ©   (07.12.05 18:31) [7]

> В программе far есть гаечка такая - Copy files opened for
> writing. И копирует же, и читать может через View. И даже
> без всякой кооперации.


И много пользы в той копии?
Как там с согласованностью данных?

--
Regards, LVT.


Игорь Шевченко   (2005-12-07 18:31:00) [9]

Leonid Troyanovsky ©   (07.12.05 18:22) [6]


> Если это некая самоделка, то без добровольной (и организованной)
> кооперации это невозможно.


В программе far есть гаечка такая - Copy files opened for writing. И копирует же, и читать может через View. И даже без всякой кооперации.


Leonid Troyanovsky   (2005-12-07 18:22:00) [10]


> cp.Silver ©   (07.12.05 17:44) [5]
> Видимо неточно выразился. Мне нужно прочитать файл, в который
> программа вносит изменения (log, например) и при этом нельзя
> закрывать эту программу. Вот я и думаю воспользоваться функцией
> вроде CloseHandle, что-бы не прекратить работу чужой программы
> с этим файлом. Это всего-лишь пример. Если написал чушь
> - заранее прошу прощения


Если это настоящий лог, то для него есть и API (msdn go).
Если это некая самоделка, то без добровольной (и организованной)
кооперации это невозможно.

--
Regards, LVT.


cp.Silver   (2005-12-07 17:44:00) [11]

Видимо неточно выразился. Мне нужно прочитать файл, в который программа вносит изменения (log, например) и при этом нельзя закрывать эту программу. Вот я и думаю воспользоваться функцией вроде CloseHandle, что-бы не прекратить работу чужой программы с этим файлом. Это всего-лишь пример. Если написал чушь - заранее прошу прощения


Leonid Troyanovsky   (2005-12-07 17:36:00) [12]


> cp.Silver ©   (07.12.05 16:44)  

> Есть ли способ из моей программы узнать Handle открытого
> файла и "отобрать" его у этой программы?


Если ты знаешь хендл в чужом процессе, то DuplicateHandle.
Про узнать есть, AFAIK, утилита Руссиновича, где-то
http://www.sysinternals.com/

--
Regards, LVT.


tesseract   (2005-12-07 17:31:00) [13]

Зачем тебе Handle?
Если для наблюдения за тем какой файл открыла программа - используй FileMon.


Rouse_   (2005-12-07 17:04:00) [14]

Ну узнаешь ты его и что тебе даст Хэндл из чужого процеса?


BiN   (2005-12-07 17:02:00) [15]

что значит - "отобрать"?


Наверх

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