![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
В корзину из сервиса... [D7]
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]
> ошибки операции нет. И файла в корзине нет...
а как ты смотришь, что файла в корзине нет ?