![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Изменение файла [D7, Win2k, WinXP]
elserpiente © (2007-05-18 15:22:00)как в WinAPI можно узнать об изменении указанного файла?
SLoW.AlfaMoon.Com (2007-05-22 09:31:00) [1]Leonid Troyanovsky © (21.05.07 18:55) [10]
Как обстоят дела в Turbo Delphi, я не знаю. Но в Delphi 6-7 и ранее такой трюк срабатывает.
Т.е., я могу объявить что-то типа
SYSTEM_HANDLE_INFORMATION_EX=record
dwCount: DWORD;
Info: array[0..0] of SYSTEM_HANDLE_INFORMATION
end;
Пpи этом, получив как результат вызова ZwQuerySystemInformation данный буфер, могу обращаться к элементам массива Info, самолично следя за корректностью адресации. Если в Turbo Delphi такой возможности нет - это большое упущение.
Leonid Troyanovsky (2007-05-21 18:55:00) [2]
> SLoW.AlfaMoon.Com (18.05.07 16:14) [7]
> 0..0 - что это?
> --- оригинальный способ задания массива любой размерности.
Просто дословный перевод msdn: WCHAR FileName[1].
Задать же таким способом массив сейчас не удастся, скажем, в
turbo delphi: Constant expression violates subrange bounds (x1012)
при попытке обратится к ненулевому элементу.
Т.е., если хочется массив, то
1. объявлять надо FileName: Array[0..очень_большое_число_WCHAR] Of WideChar,
2. распределять для переменной типа PFileNotifyInformation столько,
сколько не жалко.
3. следить за превышением FileNameLength.
Только, в данном случае, оно не надо, бо для строки вполне достаточно
адреса ее начала (нулевого символа) и ее длины.
--
Regards, LVT.
clickmaker (2007-05-21 12:41:00) [3]Parameters
hDirectory
[in] The handle to the directory to be monitored. This directory must be opened with the FILE_LIST_DIRECTORY access right.
(c) MSDN
и причем тут FindFirstChangeNotification?
elserpiente (2007-05-18 17:09:00) [4]PFileNotifyInformation = ^FILE_NOTIFY_INFORMATION;
FILE_NOTIFY_INFORMATION = packed record
NextEntryOffset: DWORD;
Action: DWORD;
FileNameLength: DWORD;
FileName: Array[0..0] Of WideChar;
end;
.....
var
hWnd: THandle;
FNI: PFileNotifyInformation;
BytesReturned: integer;
.....
hWnd := FindFirstChangeNotification('c:\', False, FILE_NOTIFY_CHANGE_FILE_NAME);
new(FNI);
if hWnd <> INVALID_HANDLE_VALUE then
while true do
begin
ZeroMemory(FNI, sizeof(FILE_NOTIFY_INFORMATION));
if WaitForSingleObject(hWnd, 500) = WAIT_OBJECT_0 then
begin
ReadDirectoryChangesW(
hWnd,
FNI,
sizeof(FNI),
False,
FILE_NOTIFY_CHANGE_FILE_NAME,
@BytesReturned,
nil, nil);
if BytesReturned > 0 then
Caption := 'ok';
end;
FindNextChangeNotification(hWnd);
end;
Создаю/удаляю файл, брейкопоинт срабатывает, однако, в FNI ничего нет? Чо не так
SLoW.AlfaMoon.Com (2007-05-18 16:14:00) [5]0..0 - что это?
--- оригинальный способ задания массива любой размерности.
elserpiente (2007-05-18 16:09:00) [6]
> FileName: Array[0..0] Of WideChar;
0..0 - что это?
Сергей М. (2007-05-18 16:07:00) [7]
> параметр lpBuffer какого типа должен быть?
Pointer
> есть ли делфи аналог FILE_NOTIFY_INFORMATION?
PFileNotifyInformation = ^FILE_NOTIFY_INFORMATION;
FILE_NOTIFY_INFORMATION = packed record
NextEntryOffset: DWORD;
Action: DWORD;
FileNameLength: DWORD;
FileName: Array[0..0] Of WideChar;
end;
elserpiente (2007-05-18 15:56:00) [8]в ReadDirectoryChangesW второй параметр lpBuffer какого типа должен быть?
есть ли делфи аналог FILE_NOTIFY_INFORMATION?
elserpiente (2007-05-18 15:34:00) [9]пасибо ;)
Сергей М. (2007-05-18 15:27:00) [10]см. ReadDirectoryChangesW
clickmaker (2007-05-18 15:26:00) [11]FindFirstChangeNotification()
ReadDirectoryChangesW()