You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

Uninstaller.dpr 3.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. program Uninstaller;
  2. {$MODE Delphi}
  3. {$APPTYPE GUI}
  4. uses Windows, SysUtils, classes, registry;
  5. {$R uninstall.res}
  6. function GetTempDirectory(): String;
  7. var
  8. buf: array[0..MAX_PATH] of Char;
  9. wintemp, temp: String;
  10. begin
  11. GetTempPath(SizeOf(buf)-1, buf);
  12. wintemp := StrPas(buf);
  13. Randomize;
  14. temp := '\DMDirc-uninstaller-'+inttostr(1000 + Random(1000));
  15. while (DirectoryExists(wintemp+temp+'\')) do begin
  16. temp := temp+'-'+inttostr(1+Random(1000));
  17. end;
  18. MkDir(wintemp+temp+'\');
  19. result := wintemp+temp+'\';
  20. end;
  21. procedure Launch(sProgramToRun: String);
  22. var
  23. StartupInfo: TStartupInfo;
  24. ProcessInfo: TProcessInformation;
  25. begin
  26. FillChar(StartupInfo, SizeOf(TStartupInfo), 0);
  27. with StartupInfo do begin
  28. cb := SizeOf(TStartupInfo);
  29. dwFlags := STARTF_USESHOWWINDOW;
  30. wShowWindow := SW_SHOWNORMAL;
  31. end;
  32. CreateProcess(nil, PChar(sProgramToRun), nil, nil, False, NORMAL_PRIORITY_CLASS, nil, nil, StartupInfo, ProcessInfo);
  33. end;
  34. function KillDir(Dir: string): Integer;
  35. var
  36. searchResult: TSearchRec;
  37. begin
  38. Result := 0;
  39. if FindFirst(Dir+'\*', faDirectory + faHidden + faReadOnly + faSysfile + faAnyFile, searchResult) = 0 then
  40. begin
  41. repeat
  42. if (searchResult.attr and faDirectory) <> faDirectory then begin
  43. DeleteFile(Dir+'\'+searchResult.name);
  44. end
  45. else begin
  46. if (searchResult.name <> '.') and (searchResult.name <> '..') then begin
  47. KillDir(Dir+'\'+searchResult.name);
  48. end;
  49. end;
  50. until FindNext(searchResult) <> 0;
  51. FindClose(searchResult);
  52. end;
  53. RmDir(Dir);
  54. end;
  55. var
  56. TempDir: String;
  57. InstallDir: String = '';
  58. hK32: THandle;
  59. i: Integer;
  60. Reg: TRegistry;
  61. handlerInfo: String;
  62. deleteProtocol: boolean;
  63. begin
  64. if (ParamCount > 0) then begin
  65. for i := 1 to ParamCount do begin
  66. InstallDir := InstallDir+' '+paramstr(i);
  67. end;
  68. InstallDir := trim(InstallDir);
  69. KillDir(InstallDir);
  70. hK32 := GetModuleHandle('kernel32');
  71. if GetProcAddress(hK32, 'GetLocaleInfoEx') <> nil then begin
  72. // Vista
  73. KillDir(GetEnvironmentVariable('APPDATA')+'\Microsoft\Windows\Start Menu\Programs\DMDirc');
  74. DeleteFile(GetEnvironmentVariable('USERPROFILE')+'\AppData\Roaming\Microsoft\Internet Explorer\Quick Launch\DMDirc.lnk');
  75. DeleteFile(GetEnvironmentVariable('USERPROFILE')+'\Desktop\DMDirc.lnk');
  76. end
  77. else begin
  78. // Not Vista
  79. KillDir(GetEnvironmentVariable('USERPROFILE')+'\Microsoft\Windows\Start Menu\Programs\DMDirc');
  80. DeleteFile(GetEnvironmentVariable('USERPROFILE')+'\Application DataMicrosoft\Internet Explorer\Quick Launch\DMDirc.lnk');
  81. DeleteFile(GetEnvironmentVariable('USERPROFILE')+'\Desktop\DMDirc.lnk');
  82. end;
  83. // Remove irc:// handler if it is us.
  84. deleteProtocol := false;
  85. Reg := TRegistry.Create;
  86. Reg.RootKey := HKEY_CLASSES_ROOT;
  87. if Reg.OpenKey('irc\Shell\open\command', false) then begin
  88. handlerInfo := Reg.ReadString('');
  89. if (handlerInfo = '"'+InstallDir+'DMDirc.exe" -c %1') then begin
  90. deleteProtocol := true;
  91. end
  92. end;
  93. Reg.CloseKey;
  94. Reg.Free;
  95. if deleteProtocol then begin
  96. Reg := TRegistry.Create;
  97. Reg.RootKey := HKEY_CLASSES_ROOT;
  98. Reg.DeleteKey('irc\Shell\open\command');
  99. Reg.DeleteKey('irc\Shell\open');
  100. Reg.DeleteKey('irc\Shell');
  101. Reg.DeleteKey('irc\DefaultIcon');
  102. Reg.DeleteKey('irc');
  103. Reg.CloseKey;
  104. Reg.Free;
  105. end;
  106. Reg := TRegistry.Create;
  107. Reg.RootKey := HKEY_LOCAL_MACHINE;
  108. Reg.DeleteKey('SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\DMDirc');
  109. Reg.CloseKey;
  110. Reg.Free;
  111. MessageBox(0, PChar('DMDirc has been uninstalled from "'+InstallDir+'".'), 'DMDirc Uninstaller', MB_OK);
  112. end
  113. else begin
  114. TempDir := GetTempDirectory;
  115. if MessageBox(0, PChar('This will uninstall DMDirc.'+#13#10+'Do you want to continue?'), 'DMDirc Uninstaller', MB_YESNO) = IDYES then begin
  116. CopyFile(pchar(paramstr(0)), pchar(TempDir+'/uninstall.exe'), false);
  117. Launch(TempDir+'/uninstall.exe '+ExtractFileDir(paramstr(0))+'\');
  118. end;
  119. end;
  120. end.