修正一个BUG...看了MSDN才知道...是byte... procedure TShellChangeThread.DoIOCompletionEvent; var TempBuffer: TNotificationBuffer; FileOpNotification: PFileNotifyInformation; Offset: Longint; FileName1, FileName2: string; FileOperation: TFileOperation; procedure DoDirChangeEvent; begin if Assigned(ChangeEvent) and FActived then ChangeEvent(FileOperation, FileName1, FileName2); end; function CompleteFileName(const FileName:string):string; begin Result := ''; if Trim(FileName) <> '' then Result := FDirectory + FileName; end; begin Lock; TempBuffer := FNotificationBuffer; FillChar(FNotificationBuffer, SizeOf(FNotificationBuffer), 0); Unlock; Pointer(FileOpNotification) := @TempBuffer[0]; repeat with FileOpNotification^ do begin Offset := NextEntryOffset; FileName2 := ''; case Action of FILE_ACTION_ADDED..FILE_ACTION_MODIFIED: begin FileName1 := CompleteFileName(WideCharLenToString(@FileName, FileNameLength div SizeOf(WideChar))); FileOperation := TFileOperation(Action - 1); DoDirChangeEvent; end; FILE_ACTION_RENAMED_OLD_NAME: begin FileName1 := CompleteFileName(WideCharLenToString(@FileName, FileNameLength div SizeOf(WideChar))); FileOperation := TFileOperation(Action - 1); end; FILE_ACTION_RENAMED_NEW_NAME: begin if FileOperation = foRenamed then begin FileName2 := CompleteFileName(WideCharLenToString(@FileName, FileNameLength div SizeOf(WideChar))); DoDirChangeEvent; end; end; end; end; Pointer(FileOpNotification) := Pointer(PChar(FileOpNotification) + OffSet); until Offset=0; end;