UnInstall برنامه به صورت دستی
سلام به همگی دوستان
میخوام یک برنامه 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;
حالا اینجا دو تا مشکل وجود داره
یکی اینکه خود برنامه حذف هم توی همون پوشه قرار داره و موقع حذف نمیتونه خودش خودش رو حذف کنه و پیام خطا میده
و دوم اینکه زیر پوشه های اون مسیر رو حذف نمیکنه
چطوری میتونم این مشکل رو رفع کنم؟
نقل قول: UnInstall برنامه به صورت دستی
بهتره از برنامه های set up استفاده کنید که از کنترل پنل این کارو انجام میدن و به این مشکل نمیخورد ... من qsetup رو پیشنهاد میکنم ساده و کاراست
نقل قول: UnInstall برنامه به صورت دستی
نقل قول:
بهتره از برنامه های set up استفاده کنید که از کنترل پنل این کارو انجام میدن و به این مشکل نمیخورد ... من qsetup رو پیشنهاد میکنم ساده و کاراست
نه داداش
خودم همه کارهای ستاپ رو انجام دادم
و یک برنامه ستاپ ساز کامل ساختم
برای Uninstall هم فقط همین جاش رو مشکل دارم
بقیه قسمتها رو ردیف کردم
نقل قول: UnInstall برنامه به صورت دستی
خوب نیمشه برنامه ای بگه خودش پاک شه یا باید سرویس بنویسد یا اگه setup داره از خود کنترل پنل این کار پی بگیرید
نقل قول: UnInstall برنامه به صورت دستی
اینجا و اینجا رو ببینید ، تست نکردم !
حذف پوشه
نقل قول: UnInstall برنامه به صورت دستی
نقل قول:
خوب نیمشه برنامه ای بگه خودش پاک شه یا باید سرویس بنویسد یا اگه setup داره از خود کنترل پنل این کار پی بگیرید
چرا میشه یک برنامه خودش خودش رو پاک کنه .
توی کنترل پنل هم اصولا چیز خاصی ثبت نمیشه که بشه از اونجا برنامه رو حذف کرد
چون فقط یک سری کلید توی رجیستری می نویسه که اطلاعاتش توی Programs میاد
موقع Remove از کنترل پنل هم فقط یک فایل اجرایی رو صدا میزنه و اون فایل وظیفه پاک کردن فایلهای برنامه رو داره نه خود برنامه Program کنترل پنل
تنکس
تست میکنم اگه جواب داد جوابش رو میگم.
نقل قول: UnInstall برنامه به صورت دستی
این کد رو گرفتم اما جواب نمیده :
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;
کد دیگه ای ندارید؟
نقل قول: UnInstall برنامه به صورت دستی
نقل قول:
نوشته شده توسط
hadisalahi2
این کد رو گرفتم اما جواب نمیده :
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
نقل قول: UnInstall برنامه به صورت دستی
ممنون بابت پاسخت
اما این لینک رو قبلا خودم خونده بودم
واسه همین گفتم میخوام این کار توسط دلفی انجام بشه
نقل قول: UnInstall برنامه به صورت دستی
بهترین راه برای این کار اینه که یک فایل در 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;
نقل قول: UnInstall برنامه به صورت دستی
نقل قول:
بهترین راه برای این کار اینه که یک فایل در Temp کپی و اجرا بشه و از طریق همون فایل عملیات حذف و پاکسازی رو انجام بدهید.
واقعا جالبه که ذهن من و تو یک جور فکر میکنه :لبخند:
هیمن روش به ذهن خودم هم رسید ولی گفتم شاید راه ساده تری باشه.
نقل قول:
البته کد زیر ر و هم تست کردم و بدون مشکل جواب داد
منم تست کردم ردیف بود .
نقل قول:
اما مشکل اینه که از دستورات Cmd استفاده شده
اینم مشکلی نیست که خیلی مهم باشه
اما یک نکته اینه که ، کجا یک پیام بزارم که کاربر بفهمه کار حذف برنامه به پایان رسیده.