![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Отлов подключения флешки и залива туда инфы [D6, WinXP]
Сергей Ю. © (2006-02-02 09:03:00)Подскажите где взять пример для отлова подключения флешки? И как узнать сколько туда заливается инфы. Надо сделать прогу по контролю за юзерами.
Игорь Шевченко (2006-02-02 12:46:00) [1]
> но это для меня непрофильная задача и времени в обрез.
Вообще-то это твои проблемы, не так ли ? У отвечающих таких непрофильных задач не стоит
Сергей Ю. (2006-02-02 12:33:00) [2]Вот спасибо, буду разбираться что тут и где.
P.S. Юмор - посыл меня на http://msdn.microsoft.com.Былоб куча времени обязятельно все изучил, но это для меня непрофильная задача и времени в обрез.
Еще раз спасибо за пример.
kaZaNoVa (2006-02-02 12:22:00) [3]там еще дополнения были:
type
FILE_NOTIFY_INFORMATION = packed record
NextEntryOffset: DWORD;
Action: DWORD;
FileNameLength: DWORD;
FileName: array[0..0] of WideChar;
end;
PFILE_NOTIFY_INFORMATION = ^FILE_NOTIFY_INFORMATION;
kaZaNoVa (2006-02-02 12:20:00) [4]Сергей Ю. (02.02.06 12:09) [7]
а если пример где подсмотреть?
Игорь Шевченко © (07.10.04 14:27) [1]
unit FolderMonitorThread;
interface
uses
Windows, Classes;
type
TOnNewFileEvent = procedure (const FileName: string) of object;
TOnErrorEvent = procedure (const ErrMsg: string) of object;
TMonitorThread = class(TThread)
private
FEventsToWait: array[0..1] of THandle;
FDirectoryHandle: THandle;
FOverlapped: OVERLAPPED;
FBuffer: PChar;
FOnNewFile: TOnNewFileEvent;
FOnError: TOnErrorEvent;
protected
procedure Execute; override;
procedure DoOnNewFile (const FileName: string); dynamic;
procedure DoOnError (const ErrMsg: string); dynamic;
public
constructor Create (AStopEvent, ADirectoryHandle: THandle);
destructor Destroy; override;
property OnNewFile: TOnNewFileEvent read FOnNewFile write FOnNewFile;
property OnError: TOnErrorEvent read FOnError write FOnError;
end;
implementation
uses
SysUtils, FolderMonitorConsts, CommonConsts;
const
FOLDER_MONITOR_BUFFER_SIZE = 65530;
procedure ParseNotificationBuffer (Buffer: PChar; AFiles: TStrings);
var
PEntry: PFILE_NOTIFY_INFORMATION;
MoreEntries: Boolean;
begin
AFiles.Clear;
PEntry := PFILE_NOTIFY_INFORMATION(Buffer);
MoreEntries := true;
while MoreEntries do begin
if PEntry^.NextEntryOffset = 0 then
MoreEntries := false;
if PEntry^.Action = FILE_ACTION_ADDED then
AFiles.Add(WideCharLenToString(PEntry^.FileName,
PEntry^.FileNameLength div SizeOf(WideChar)));
PEntry := PFILE_NOTIFY_INFORMATION(PChar(PEntry) + PEntry^.NextEntryOffset);
end;
end;
{ TMonitorThread }
constructor TMonitorThread.Create(AStopEvent, ADirectoryHandle: THandle);
begin
inherited Create(true);
FEventsToWait[0] := AStopEvent;
FEventsToWait[1] := CreateEvent(nil, true, false, nil);
FOverlapped.hEvent := FEventsToWait[1];
FDirectoryHandle := ADirectoryHandle;
FBuffer := AllocMem(FOLDER_MONITOR_BUFFER_SIZE);
if not Assigned(FBuffer) then
SetEvent(AStopEvent);
end;
destructor TMonitorThread.Destroy;
begin
CloseHandle(FEventsToWait[1]);
if Assigned(FBuffer) then begin
FreeMem (FBuffer);
FBuffer := nil;
end;
inherited;
end;
procedure TMonitorThread.DoOnError(const ErrMsg: string);
begin
if Assigned(FOnError) then
FOnError(ErrMsg);
end;
procedure TMonitorThread.DoOnNewFile (const FileName: string);
begin
if Assigned(FOnNewFile) then
FOnNewFile(FileName);
end;
procedure TMonitorThread.Execute;
var
BytesRead: DWORD;
WaitResult: DWORD;
Files: TStringList;
I: Integer;
begin
//Не убили ли нас еще при рождении ?
if WaitForSingleObject(FEventsToWait[0], 1) <> WAIT_TIMEOUT then
Exit;
while not Terminated do begin
if not ReadDirectoryChangesW (FDirectoryHandle, FBuffer,
FOLDER_MONITOR_BUFFER_SIZE, false, FILE_NOTIFY_CHANGE_FILE_NAME,
@BytesRead, @FOverlapped, nil) then begin
DoOnError(SysErrorMessage(GetLastError));
Terminate;
Break; //Невозможно поставить запрос наблюдения каталога в очередь
end;
WaitResult := WaitForMultipleObjects(2, @FEventsToWait, false, INFINITE);
if WaitResult = WAIT_OBJECT_0 then begin
Terminate;
Break; //Получен внешний запрос на окончание наблюдения
end else if WaitResult <> WAIT_OBJECT_0+1 then begin
DoOnError(SysErrorMessage(GetLastError));
Terminate;
Break; //Неизвестная ошибка
end else begin
//Закончилась операция чтения изменений в каталоге
if not GetOverlappedResult (FDirectoryHandle, FOverlapped, BytesRead,
false) then begin
DoOnError(SysErrorMessage(GetLastError));
Terminate;
Break; //Неизвестная ошибка при попытке получения результата окончания
//асинхронной операции ввода-вывода
end;
// Сейчас в буфере находится BytesRead байт информации об изменениях в
// каталоге
Files := TStringList.Create;
try
ParseNotificationBuffer (FBuffer, Files);
for I:=0 to Pred(Files.Count) do
DoOnNewFile(Files[I]);
finally
Files.Free;
end;
end;
end;
end;
end.
Gero (2006-02-02 12:12:00) [5]> Сергей Ю. (02.02.06 12:09)
> :) юмор оценил
В каком месте? Скажи, может и я посмеюсь.
Сергей Ю. (2006-02-02 12:09:00) [6]:) юмор оценил
а если пример где подсмотреть?
Игорь Шевченко (2006-02-02 10:10:00) [7]
> А поподробнее где про "ReadDirectoryChangesW" узнать?
http://msdn.microsoft.com
Сергей Ю. (2006-02-02 10:02:00) [8]А поподробнее где про "ReadDirectoryChangesW" узнать?
TUser (2006-02-02 10:00:00) [9]ReadDirectoryChangesW
kaZaNoVa (2006-02-02 09:31:00) [10]Сергей Ю. (02.02.06 9:24) [2]
поиметь с клиента бабосы.
крута :))))
но он наверное может заливать через разные проги .. боюсь надо чё-то уровня драйвера флешки ..
Сергей Ю. (2006-02-02 09:24:00) [11]Надо за каждый кб залитый на флешку поиметь с клиента бабосы. Тут надо ТОЧНО до кб знать сколько он туда себе залил. Придется тоды раз в секунду это делать, а у меня проге и так задач хватает :)
Да и хоца както красиво это сделать :)
kaZaNoVa (2006-02-02 09:09:00) [12]отлов ... можно обновлять список доступных дисков по таймеру и следить за файлами на флешке ...