Форум: "WinAPI";
Текущий архив: 2007.12.02;
Скачать: [xml.tar.bz2];
ВнизИзменение файла Найти похожие ветки
← →
elserpiente (2007-05-18 15:22) [0]как в WinAPI можно узнать об изменении указанного файла?
← →
clickmaker © (2007-05-18 15:26) [1]FindFirstChangeNotification()
ReadDirectoryChangesW()
← →
Сергей М. © (2007-05-18 15:27) [2]см. ReadDirectoryChangesW
← →
elserpiente (2007-05-18 15:34) [3]пасибо ;)
← →
elserpiente (2007-05-18 15:56) [4]в ReadDirectoryChangesW второй параметр lpBuffer какого типа должен быть?
есть ли делфи аналог FILE_NOTIFY_INFORMATION?
← →
Сергей М. © (2007-05-18 16:07) [5]
> параметр 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 16:09) [6]
> FileName: Array[0..0] Of WideChar;
0..0 - что это?
← →
SLoW.AlfaMoon.Com (2007-05-18 16:14) [7]0..0 - что это?
--- оригинальный способ задания массива любой размерности.
← →
elserpiente (2007-05-18 17:09) [8]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 ничего нет? Чо не так
← →
clickmaker © (2007-05-21 12:41) [9]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?
← →
Leonid Troyanovsky © (2007-05-21 18:55) [10]
> 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.
← →
SLoW.AlfaMoon.Com (2007-05-22 09:31) [11]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 такой возможности нет - это большое упущение.
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2007.12.02;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.047 c