Остановить выполнение DeviceIoControl
От: Аноним  
Дата: 04.05.06 12:07
Оценка:
Есть Thread, в котором реализована некоторая процедура, в которой используется API функция
DeviceIoControl (Handle, FSCTL_MOVE_FILE, ...);
Как прервать выполнение данной функции(DeviceIoControl)? Делаю следующее
private
lSync: OVERLAPPED;
....
constructor TmyThread.Create;
...
FillChar(lSync, SizeOf(TOverlapped), 0);
lSync.hEvent := CreateEvent(nil, true, FALSE, #0);
.....

unction UnNormilizeDrive(const ADrivePath: string): string;
begin
Result := '//./' + Copy(ADrivePath, 1, Pos('\', ADrivePath) — 1)
end;

DeviceHandle := CreateFile(PAnsiChar(UnNormilizeDrive(DriveName)), GENERIC_READ,
FILE_SHARE_READ or FILE_SHARE_WRITE or FILE_SHARE_DELETE,
nil, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, 0);
...

MoveParams.FileHandle := CreateFile(PAnsiChar(AFile.FileName), ; FILE_READ_ATTRIBUTES, FILE_SHAR E_READ OR FILE_SHARE_WRITE OR FILE_SHARE_DELETE, nil, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, 0);

if (MoveParams.FileHandle = INVALID_HANDLE_VALUE) then
MoveParams.FileHandle := CreateFile(PAnsiChar(AFile.FileName), GENERIC_READ,
FILE_SHARE_READ OR FILE_SHARE_WRITE OR FILE_SHARE_DELETE,
nil, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, 0);
....

AResult := DeviceIoControl(DeviceHandle, FSCTL_MOVE_FILE, @MoveParams, sizeof(MoveParams), nil, 0, w, @lSync);
if (not AResult) then
begin
....
end;

//По идее сюда должно быть передано управление сразу же. Однако управление не предается, а ждет окончания выполнения функции
//DeviceIoControl.. Что сделано не так? Как добиться того, чтобы можно было прервать операцию...
//Далее идет код, который и должен прервать операцию

procedure TmyThread.StopProc;
begin
SetEvent(lSync.hEvent);
end;
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.