anchor.diff:      exit(ExeSearch(anExeName, '') <> '');
   end;
   
  +procedure processOutputToStrings(const aProcess: TProcess; var aList: TStringList);
  +var
  +  str: TMemoryStream;
  +  sum: Integer;
  +  cnt: Integer;
  +const
  +  buffSz = 1024;
  +begin
  +  if not (poUsePipes in aProcess.Options) then
  +    exit;
  +  //
  +  sum := 0;
  +  str := TMemoryStream.Create;
  +  try
  +    while aProcess.Output.NumBytesAvailable <> 0 do begin
  +      str.Size := str.Size + buffSz;
  +      cnt := aProcess.Output.Read((str.Memory + sum)^, buffSz);
  +      sum += cnt;
  +    end;
  +    str.Size := sum;
  +    aList.LoadFromStream(str);
  +  finally
  +    str.Free;
  +  end;
  +end;
  +
  +procedure killProcess(var aProcess: TAsyncProcess);
  +begin
  +  if aProcess = nil then
  +    exit;
  +  if aProcess.Running then
  +    aProcess.Terminate(0);
  +  aProcess.Free;
  +  aProcess := nil;
  +end;
  +
   initialization
     RegisterClasses([TMRUList, TMRUFileList]);
     DExtList := TStringList.Create;
  
positive.code:    * Returns true if anExeName can be spawn without its full path.
     *)
    function exeInSysPath(anExeName: string): boolean;
  
  implementation
  
  
negative.code:   {$IFDEF WINDOWS}
    Windows,
    {$ENDIF}
    ActnList, dialogs, forms, process, asyncprocess;
  
  const
    DdiagFilter = 'D source|*.d|D interface|*.di|All files|*.*';
  