Текущий архив: 2013.11.10;
Скачать: CL | DM;
Вниз
Открытие файла своей программой. Найти похожие ветки
← →
имя (2013-02-07 22:07) [40]Удалено модератором
Примечание: может лучше сразу бан по IP, как думаешь?
← →
brother © (2013-02-08 04:15) [41]чтож всех на скрытность то тянет?
мои наброски, разбирайся!function TProgramForm.SafeRemoval(drive: char): boolean;
var
sh : SHFILEOPSTRUCT;
FreeBytesAvailableToCaller: TLargeInteger;
FreeSize: TLargeInteger;
TotalSize: TLargeInteger;
f: file;
NumWritten: Integer;
Buf: pointer;
bufSize: Integer;
BytesWrite: TLargeInteger;
begin
result:= False;
StopSafeRemoval:= False;
// ShowMessage("Удаление всего содержимого диска, это может занять длительное время, ждите...");
// Удаляем ВСЕ содержимое с устройства!
AddLog("Удаление всего содержимого диска, ждите...");
sh.Wnd := Application.Handle;
sh.wFunc := FO_DELETE;
sh.pFrom := PAnsiChar(drive + ":\*.*");
sh.pTo := nil;
sh.fFlags := FOF_NOCONFIRMATION + FOF_SILENT+ FOF_NOERRORUI;
sh.fAnyOperationsAborted := False;
sh.hNameMappings := nil;
sh.lpszProgressTitle := nil;
if SHFileOperation(sh) <> 0 then
begin
AddLog("Не удалось(файлы/папки заняты другим приложением?)");
//Exit;
end
else
AddLog("Ok");
// узнаем кол-во свободного места на диске
if not GetDiskFreeSpaceEx(PChar(drive + ":\"), FreeBytesAvailableToCaller, Totalsize, @FreeSize) then
begin
AddLog("Ошибка получения свободного места: " + GetLastErrorText);
exit;
end
else
AddLog("Свободное место на диске: " + IntToStr(FreeBytesAvailableToCaller) + " байт");
// FreeBytesAvailableToCaller:= {1073741824;} 2147483648;
// Создаем файл с пустым содержимым по размеру всего диска
AddLog("Создание временного файла, ждите...");
BufSize := 1048576; // 1МБ
GetMem(buf, BufSize);
//Gauge1.MaxValue:= FreeBytesAvailableToCaller;
BytesWrite:= 0;
try
assignfile(f, drive + ":\tmp.$$$");
rewrite(f, 1);
while (BytesWrite+bufSize <= FreeBytesAvailableToCaller) and (not StopSafeRemoval) do
begin
BlockWrite(f, Buf^, BufSize, NumWritten);
Inc(BytesWrite, NumWritten);
// Gauge1.Progress:= BytesWrite;
application.ProcessMessages;
end;
except
FreeMem(Buf);
CloseFile(f);
end;
if StopSafeRemoval then
begin
AddLog("Отменено пользователем!");
FreeMem(Buf);
CloseFile(f);
Exit;
end;
// если в конце не дозаписан хвост меньше bufSize дозапишем его
if BytesWrite < FreeBytesAvailableToCaller then
begin
BufSize := FreeBytesAvailableToCaller-BytesWrite;
FreeMem(Buf);
GetMem(buf, BufSize);
BlockWrite(f, Buf^, BufSize, NumWritten);
end;
FreeMem(Buf);
CloseFile(f);
AddLog("Ok");
{ if DeleteFile(drive + ":\tmp.$$$") then
AddLog("Временный файл успешно удален")
else
begin
AddLog("Ошибка удаления временного файла");
exit;
end;}
result:= True;
end;
← →
brother © (2013-02-08 04:18) [42]упс, промахнулся топиком)
← →
vlad (2013-02-08 12:23) [43]
> Rouse_ © (07.02.13 22:03) [39]
>
>
> > Inovet © (07.02.13 21:29) [35]
> > Уже 4 раза сказали.
>
> Лучше 1 раз разжевать, чем 4 раз рассказать :)
Так уж сложилось, что нужно именно закрывать старую копию, а не передавать в старую копию новые параметры
Один момент не понятен и все(procedure TMyForm.FormCreate(Sender: TObject);
begin
//почему эта команда не закрывает старую копию?
SendMessage(FindWindow(nil, "MyProgram"), WM_CLOSE, 1, 0);
//а эта работает без проблем?
SendMessage(FindWindow(nil, "Диспетчер задач Windows"), WM_CLOSE, 1, 0);
end;
← →
Ega23 © (2013-02-08 12:39) [44]
> Так уж сложилось, что нужно именно закрывать старую копию,
> а не передавать в старую копию новые параметры
Просто любопытно: а почему? Почему не передать новые данные в старую копию, с расчётом на то, что она бросит текущие данные и займётся новыми?
← →
vlad (2013-02-08 12:42) [45]
> Ega23 © (08.02.13 12:39) [44]
ну а почему бы не закрыть старую?
← →
Rouse_ © (2013-02-08 12:49) [46]Ну закроешь ты старую, а смысл?
← →
vlad (2013-02-08 12:54) [47]
> Rouse_ © (08.02.13 12:49) [46]
>
> Ну закроешь ты старую, а смысл?
Да в тот то и дело что не закрою.
A где грабли не пойму:
procedure TMyForm.FormCreate(Sender: TObject);
begin
//почему эта команда не закрывает старую копию?
SendMessage(FindWindow(nil, "MyProgram"), WM_CLOSE, 1, 0);
//а эта работает без проблем?
SendMessage(FindWindow(nil, "Диспетчер задач Windows"), WM_CLOSE, 1, 0);
end;
Ну нужно так и все.
> > brother © (07.02.13 18:17) [27]
> >
> > найми программиста...
Ребята дорогие, я специально написал в раздел "начинающим".
← →
Ega23 © (2013-02-08 13:00) [48]
> ну а почему бы не закрыть старую?
Т.е. принципиальных причин нет, я правильно понял?
Почему плохо закрывать старую:
Во-первых, ты её найти не можешь... :))) (шутка)
Во-вторых, вот она что-то там такое делает, шуршит вовсю, пердит-пыхтит, старается. И будет так ещё пердеть-пыхтеть, например, час. А тут её - фигак, и топором рубят. Не айс.
← →
vlad (2013-02-08 13:04) [49]
> Во-первых, ты её найти не можешь... :))) (шутка)
Диспетчер задач значит находит, а свою копию найти не может.
> Во-вторых, вот она что-то там такое делает, шуршит вовсю,
> пердит-пыхтит, старается. И будет так ещё пердеть-пыхтеть,
> например, час. А тут её - фигак, и топором рубят. Не айс.
>
Да черт с ней.
← →
Ega23 © (2013-02-08 13:23) [50]
> Диспетчер задач значит находит, а свою копию найти не может.
Тебя предупреждали. А ты не слушаешь.
Ненаказуемо, но "будет путь его тернистый долог".
← →
Anatoly Podgoretsky © (2013-02-08 14:45) [51]
> упс, промахнулся топиком)
Стреляй из лука
← →
брат Птибурдукова (2013-02-08 14:54) [52]
> фигак, и топором рубят
WM_CLOSE — таки мелковато для топора :-)
← →
Плохиш © (2013-02-09 23:31) [53]
> vlad (08.02.13 13:04) [49]
Закрыть старую копию ничем не отличается от передать в неё чего-то. Решений в мировой помойке сколько угодно, даже для копи/паста, даже на этом форуме можно найти несколько тем. Но учитывая, что обсуждение перевалило за полсотни, программиста нанять будет безопасней и дешевле.
Страницы: 1 2 вся ветка
Текущий архив: 2013.11.10;
Скачать: CL | DM;
Память: 0.57 MB
Время: 0.012 c