I got it to work like this:
const //string version of trootfolder in ShellCtrls.pas
TRootFolders :array[1..23] of string = ('rfDesktop', 'rfMyComputer', 'rfNetwork', 'rfRecycleBin', 'rfAppData',
'rfCommonDesktopDirectory', 'rfCommonPrograms', 'rfCommonStartMenu', 'rfCommonStartup',
'rfControlPanel', 'rfDesktopDirectory', 'rfFavorites', 'rfFonts', 'rfInternet', 'rfPersonal',
'rfPrinters', 'rfPrintHood', 'rfPrograms', 'rfRecent', 'rfSendTo', 'rfStartMenu', 'rfStartup',
'rfTemplates');
//tv1 and tv2 are tshelltreeview objects
//no error checking!
//tv1 shows folders only
//tv2 shows folders and and nonfolders
procedure TForm1.tv22DragDrop(Sender, Source: TObject; X, Y: Integer);
var
d:integer;
begin
d:=1;
tv2.Items.BeginUpdate;
if not fileexists(tv1.Path) then
begin
repeat
tv2.root:=trootfolders[d];
inc(d);
until tv1.path=tv2.path;
end
else
tv2.Root:=tv2.path;
tv2.Items.EndUpdate;
end;