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

Вниз

THandle   Найти похожие ветки 

 
cp.Silver ©   (2005-12-07 16:44) [0]

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


 
BiN ©   (2005-12-07 17:02) [1]

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


 
Rouse_ ©   (2005-12-07 17:04) [2]

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


 
tesseract ©   (2005-12-07 17:31) [3]

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


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


> cp.Silver ©   (07.12.05 16:44)  

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


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

--
Regards, LVT.


 
cp.Silver ©   (2005-12-07 17:44) [5]

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


 
Leonid Troyanovsky ©   (2005-12-07 18:22) [6]


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


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

--
Regards, LVT.


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

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


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


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


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


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

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


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

--
Regards, LVT.


 
Rouse_ ©   (2005-12-07 20:01) [9]


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

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


 
Leonid Troyanovsky ©   (2005-12-08 09:43) [10]


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

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

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


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

--
Regards, LVT.


 
tesseract ©   (2005-12-08 09:45) [11]

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


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

Эээ, думаю можно обойтись без 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;


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


 
Leonid Troyanovsky ©   (2005-12-08 10:07) [13]


> 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 10:19) [14]

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


 
cp.Silver ©   (2005-12-08 20:50) [15]

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



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

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

Наверх




Память: 0.51 MB
Время: 0.031 c
2-1133963050
cp.Silver
2005-12-07 16:44
2005.12.25
THandle


2-1133883036
Developerr
2005-12-06 18:30
2005.12.25
Как удалить запись из типизированного файла ?


1-1133036401
Василий
2005-11-26 23:20
2005.12.25
Запуск макроса в Excel средствами Delphi


14-1133370769
Sun bittern
2005-11-30 20:12
2005.12.25
Поиск файлов "Win+F" <> "FindFirst" <> "FindFirstFile"


2-1133111620
pohil
2005-11-27 20:13
2005.12.25
Внедрение кода в исполняемый процесс