![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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]что значит - "отобрать"?