Нужно поэкспериментировать. Кажется функция WideCharLenToString требует длину строки в символах, а не в байтах и плюет на нули в конце. А раз так, может ещё раз поправить вот так:
#pas
procedure THiDirectoryChanges.HandleEvent;
var FileNotifyInfo : PFileNotifyInformation;
InfoCallBack : TInfoCallBack;
Offset : Longint;
Str: string;
begin
Pointer(FileNotifyInfo) := @FWatchBuf[0];
repeat
Offset:=FileNotifyInfo^.NextEntryOffset;
InfoCallBack.FAction := FileNotifyInfo^.Action;
InfoCallBack.FDrive := FName;
Str := Trim(WideCharLenToString(@(FileNotifyInfo^.FileName[0]), FileNotifyInfo.FileNameLength div 2));
InfoCallBack.FNewFileName := Str;
case FileNotifyInfo^.Action of
FILE_ACTION_RENAMED_OLD_NAME: FOldFileName := Str;
FILE_ACTION_RENAMED_NEW_NAME: InfoCallBack.FOldFileName := FOldFileName;
end;
FInfoCallBack(InfoCallBack, sTag);
PChar(FileNotifyInfo) := PChar(FileNotifyInfo) + Offset;
until (Offset=0) or WFS.Terminated or (WFS = nil);
end;