View Full Version : UnInstall برنامه به صورت دستی
hadisalahi2
یک شنبه 26 بهمن 1393, 18:49 عصر
سلام به همگی دوستان
میخوام یک برنامه Uninstall درست کنم که یک برنامه نصب شده رو حذف کنم
با کد زیر میتونم فایلهای یک مسیر رو پاک کنم:
procedure TForm1.DelFilesFromDir(Directory, FileMask: string;
DelSubDirs: Boolean);
var
SourceLst: string;
FOS: TSHFileOpStruct;
begin
FillChar(FOS, SizeOf(FOS), 0);
FOS.Wnd := Application.MainForm.Handle;
FOS.wFunc := FO_DELETE;
SourceLst := Directory + '\' + FileMask + #0;
FOS.pFrom := PChar(SourceLst);
if not DelSubDirs then
FOS.fFlags := FOS.fFlags OR FOF_FILESONLY;
// Remove the next line if you want a confirmation dialog box
FOS.fFlags := FOS.fFlags OR FOF_NOCONFIRMATION;
// Add the next line for a "silent operation" (no progress box)
// FOS.fFlags := FOS.fFlags OR FOF_SILENT;
SHFileOperation(FOS);
end;
حالا اینجا دو تا مشکل وجود داره
یکی اینکه خود برنامه حذف هم توی همون پوشه قرار داره و موقع حذف نمیتونه خودش خودش رو حذف کنه و پیام خطا میده
و دوم اینکه زیر پوشه های اون مسیر رو حذف نمیکنه
چطوری میتونم این مشکل رو رفع کنم؟
benyaminrahimi
یک شنبه 26 بهمن 1393, 19:07 عصر
بهتره از برنامه های set up استفاده کنید که از کنترل پنل این کارو انجام میدن و به این مشکل نمیخورد ... من qsetup رو پیشنهاد میکنم ساده و کاراست
hadisalahi2
یک شنبه 26 بهمن 1393, 19:13 عصر
بهتره از برنامه های set up استفاده کنید که از کنترل پنل این کارو انجام میدن و به این مشکل نمیخورد ... من qsetup رو پیشنهاد میکنم ساده و کاراست
نه داداش
خودم همه کارهای ستاپ رو انجام دادم
و یک برنامه ستاپ ساز کامل ساختم
برای Uninstall هم فقط همین جاش رو مشکل دارم
بقیه قسمتها رو ردیف کردم
benyaminrahimi
دوشنبه 27 بهمن 1393, 07:48 صبح
خوب نیمشه برنامه ای بگه خودش پاک شه یا باید سرویس بنویسد یا اگه setup داره از خود کنترل پنل این کار پی بگیرید
Mahmood_M
دوشنبه 27 بهمن 1393, 11:24 صبح
اینجا (http://www.delphibasics.info/home/delphibasicssnippets/self-deletingfile-melting) و اینجا (http://www.delphibasics.info/home/delphibasicssnippets/deleteself-proceduretocloseanddeletethecurrentapplication) رو ببینید ، تست نکردم !
حذف پوشه (https://groups.google.com/forum/#!topic/borland.public.delphi.winapi/SyTXILyct9Q)
hadisalahi2
دوشنبه 27 بهمن 1393, 11:54 صبح
خوب نیمشه برنامه ای بگه خودش پاک شه یا باید سرویس بنویسد یا اگه setup داره از خود کنترل پنل این کار پی بگیرید
چرا میشه یک برنامه خودش خودش رو پاک کنه .
توی کنترل پنل هم اصولا چیز خاصی ثبت نمیشه که بشه از اونجا برنامه رو حذف کرد
چون فقط یک سری کلید توی رجیستری می نویسه که اطلاعاتش توی Programs میاد
موقع Remove از کنترل پنل هم فقط یک فایل اجرایی رو صدا میزنه و اون فایل وظیفه پاک کردن فایلهای برنامه رو داره نه خود برنامه Program کنترل پنل
اینجا (http://www.delphibasics.info/home/delphibasicssnippets/self-deletingfile-melting)
و اینجا (http://www.delphibasics.info/home/delphibasicssnippets/deleteself-proceduretocloseanddeletethecurrentapplication)
رو ببینید ، تست نکردم !
حذف پوشه (https://groups.google.com/forum/#!topic/borland.public.delphi.winapi/SyTXILyct9Q)
تنکس
تست میکنم اگه جواب داد جوابش رو میگم.
hadisalahi2
سه شنبه 28 بهمن 1393, 17:21 عصر
این کد رو گرفتم اما جواب نمیده :
procedure xDeleteSelf;
var
module: HMODULE;
buf: array[0..MAX_PATH - 1] of char;
p: ULONG;
hKrnl32: HMODULE;
pExitProcess, pDeleteFile, pFreeLibrary: pointer;
begin
module := GetModuleHandle(nil);
GetModuleFileName(module, buf, sizeof(buf));
CloseHandle(THandle(4));
p := ULONG(module) + 1;
hKrnl32 := GetModuleHandle('kernel32');
pExitProcess := GetProcAddress(hKrnl32, 'ExitProcess');
pDeleteFile := GetProcAddress(hKrnl32, 'DeleteFileA');
pFreeLibrary := GetProcAddress(hKrnl32, 'FreeLibrary');
asm
lea eax, buf
push 0
push 0
push eax
push pExitProcess
push p
push pDeleteFile
push pFreeLibrary
ret
end;
end;
کد دیگه ای ندارید؟
بهروز عباسی
پنج شنبه 30 بهمن 1393, 01:00 صبح
این کد رو گرفتم اما جواب نمیده :
procedure xDeleteSelf;
var
module: HMODULE;
buf: array[0..MAX_PATH - 1] of char;
p: ULONG;
hKrnl32: HMODULE;
pExitProcess, pDeleteFile, pFreeLibrary: pointer;
begin
module := GetModuleHandle(nil);
GetModuleFileName(module, buf, sizeof(buf));
CloseHandle(THandle(4));
p := ULONG(module) + 1;
hKrnl32 := GetModuleHandle('kernel32');
pExitProcess := GetProcAddress(hKrnl32, 'ExitProcess');
pDeleteFile := GetProcAddress(hKrnl32, 'DeleteFileA');
pFreeLibrary := GetProcAddress(hKrnl32, 'FreeLibrary');
asm
lea eax, buf
push 0
push 0
push eax
push pExitProcess
push p
push pDeleteFile
push pFreeLibrary
ret
end;
end;
کد دیگه ای ندارید؟
این کد فقط در ویندوز های 95,98 و ME کار میکنه !!
پست زیرو بخون
http://www.catch22.net/tuts/self-deleting-executables
hadisalahi2
پنج شنبه 30 بهمن 1393, 17:13 عصر
پست زیرو بخون
http://www.catch22.net/tuts/self-deleting-executables
ممنون بابت پاسخت
اما این لینک رو قبلا خودم خونده بودم
واسه همین گفتم میخوام این کار توسط دلفی انجام بشه
Mask
پنج شنبه 30 بهمن 1393, 22:05 عصر
بهترین راه برای این کار اینه که یک فایل در Temp کپی و اجرا بشه و از طریق همون فایل عملیات حذف و پاکسازی رو انجام بدهید.
البته کد زیر ر و هم تست کردم و بدون مشکل جواب داد.اما مشکل اینه که از دستورات Cmd استفاده شده.
function ExtractBackDir(Path: string): string;
begin
Result := ExcludeTrailingPathDelimiter
(Copy(Path, 1, LastDelimiter('\', ExtractFileDir(Application.ExeName))));
end;
procedure TForm1.Button6Click(Sender: TObject);
var
sl: TStringList;
begin
sl := TStringList.Create;
try
sl.Append(':Repeat');
sl.Append('del "' + Application.ExeName + '"');
sl.Append('if exist "' + ExtractFileName(Application.ExeName) +
'" goto Repeat');
sl.Append('rmdir /s /q "' + ExtractFileDir(Application.ExeName) + '"');
sl.Append('del "' + ExtractBackDir(Application.ExeName) + '\Del.bat"');
sl.SaveToFile(ExtractBackDir(Application.ExeName) + '\Del.bat');
ShellExecute(Handle, 'open', pchar(ExtractBackDir(Application.ExeName) +
'\Del.bat'), '', '', SHOW_OPENWINDOW);
Application.Terminate;
finally
sl.Free;
end;
end;
hadisalahi2
شنبه 02 اسفند 1393, 10:14 صبح
بهترین راه برای این کار اینه که یک فایل در Temp کپی و اجرا بشه و از طریق همون فایل عملیات حذف و پاکسازی رو انجام بدهید.
واقعا جالبه که ذهن من و تو یک جور فکر میکنه :لبخند:
هیمن روش به ذهن خودم هم رسید ولی گفتم شاید راه ساده تری باشه.
البته کد زیر ر و هم تست کردم و بدون مشکل جواب داد
منم تست کردم ردیف بود .
اما مشکل اینه که از دستورات Cmd استفاده شده
اینم مشکلی نیست که خیلی مهم باشه
اما یک نکته اینه که ، کجا یک پیام بزارم که کاربر بفهمه کار حذف برنامه به پایان رسیده.
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.