Текущий архив: 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