Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

В корзину из сервиса... [D7]


Страницы:   1 2 3

sniknik ©   (2011-02-11 16:47:00) 

Написал функцию -
function ToTrash(const Names: string): integer;
//Names - список файлов разделяемый и завершаемый #0 (в конце требуется двойной #0, т.е. добавляем еще один к строковому)
//пример - ToTrash('C:\Test1.tst'#0'C:\Test2.tst'#0);
var
 SHFileOpStruct: TSHFileOpStruct;
begin
 with SHFileOpStruct do begin
   Wnd   := 0; //Handle; без показа диалога не нужно
   wFunc := FO_DELETE;
   pFrom := @Names[1];
   pTo   := nil;
   fFlags:= FOF_ALLOWUNDO or FOF_NOCONFIRMATION or FOF_SILENT;
   fAnyOperationsAborted:= false;
   hNameMappings        := nil;
   lpszProgressTitle    := nil;
 end;
 result:= SHFileOperation(SHFileOpStruct);
end;


Вызов такой -
 SaveToLog('Test ToTrash');
 iErr:= ToTrash(FileName+#0); //ставил и явно типа 'C:\test.txt'
 if iErr > 0 then
   SaveToLog('ToTrash error - ' + IntToStr(iErr));


Работает... пока в приложении. Но нужно из сервиса (смысл в том, что есть файлы которые иногда бывают нужны "ранней версии", если произошла ошибка и идет ее разбор). В корзину, откуда можно достать, было бы удобно... но вот из сервиса почему то это не срабатывает.
Т.е. файл просто удаляется и все, в логе вижу запись 'Test ToTrash' и все, т.е. ошибки операции нет. И файла в корзине нет...

Пробовал запуск сервиса от имени пользователя под которым логинюсь, ставил взаимодействие с рабочим столом. Не помогает.

Вопрос, как быть?


Игорь Шевченко   (2011-02-11 21:36:00) [41]

и загружен ли профиль того пользователя ?


Игорь Шевченко   (2011-02-11 21:35:00) [42]


> AAAAA!!!! Нашел!, под "левым" именем


вовремя заданный вопрос всегда действеннее десяти умных советов.


> хотя вопрос тогда почему при запуске от того же юзера нету


а какой SID при этом в токене процесса ?


sniknik   (2011-02-11 21:14:00) [43]

> тоже не нашел...
AAAAA!!!! Нашел!, под "левым" именем, хотя вопрос тогда почему при запуске от того же юзера нету. Или вернее куда он его девает?

Ну да ладно, это уже детали. Спасибо.


sniknik   (2011-02-11 21:10:00) [44]

Попробовал сейчас Far-ом зайти в папку RECYCLER\и дальше в папке с именем по Sid-у. тоже не нашел... хотя удаленные в режиме программы там есть.


sniknik   (2011-02-11 21:03:00) [45]

Открываю и смотрю, в винде по иконке кликаю...
На случай, что это из-за другого юзера - запускал сервис тем же кем логинился.

Кстати, проверил второй способ -
function ToTrash(const Names: string): integer;
var
 Info: TShellExecuteInfo;
begin
 FillMemory(@Info, SizeOf(Info), 0);
 with Info do begin
   cbSize  := SizeOf(Info);
   nShow   := SW_HIDE;
   lpFile  := Pchar(Names);
   fMask   := SEE_MASK_FLAG_NO_UI or SEE_MASK_INVOKEIDLIST or SEE_MASK_CLASSNAME or SEE_MASK_FLAG_DDEWAIT;
   lpVerb  := 'delete';
 end;
 if ShellExecuteEx(@Info)
   then result:= 0
   else result:= GetLastError;
end;

Ситуация та же - ошибки нет, файла в корзине тоже. Но стоит запустить сервис как программу, и все начинает работать. ;(


Игорь Шевченко   (2011-02-11 20:46:00) [46]


> ошибки операции нет. И файла в корзине нет...


а как ты смотришь, что файла в корзине нет ?


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо