Ветеран
Сообщения: 649
Благодарности: 444
|
Профиль
|
Отправить PM
| Цитировать
Tco 03, Спасибо за внимательность!  Хорошо, что есть люди которые помогают сделать лучше! Назвал имя батника удаления в твою честь из благодарности!
to All
теперь собственно о файле:
1. Он зовётся именем процесса деинсталятора и деинсталятор держит его пока процесс не убьётся, а значит удалить файл через код напрямую нельзя ни на каком этапе или процедуре связанных с деинсталятором
2. Этот файл кстати остаётся даже после простейшего скрипта, что говорит о возможной недоработке Инно
например попробуйте установить и удалить этот скрипт и в темпе останется похожий файл:
Код: 
[Setup]
AppName=DrawImageExample by South.Tver
AppVerName=DrawImageExample by South.Tver
DefaultDirName={pf}\ImageExample
OutputBaseFilename=setup
Но путём изврата удалось реализовать метод его удаления:
Взяв за основу функцию El Sanchez-а "Определение рабочей папки процесса" http://forum.oszone.net/post-1945281-380.html и упростив её до получения имени нашего процесса
(функция function GetCurrentProcessId(): DWORD; всё упрощает)
мы получаем путь к тому самому файлу... и удаляем его малость модифицированным мной примером Genri (самоудаление) (исходник http://forum.ru-board.com/topic.cgi?...8&start=1280#3 )
вот исправленный пример с ботвой:
читать дальше »
Код: 
#include "botva2.iss"
[Setup]
AppName=DrawImageExample by South.Tver
AppVerName=DrawImageExample by South.Tver
DefaultDirName={pf}\ImageExample
OutputBaseFilename=setup
RawDataResource=Botva:botva2.dll|bPic:bPic.png|LiPic:LiPic.png|aPic:aPic.png
[Code]
#ifdef UNICODE
#define A "W"
#else
#define A "A"
#endif
const
AXEL_YELLOW = $48c1ca;
RT_RCDATA = 10;
TH32CS_SNAPPROCESS = $2;
INVALID_HANDLE_VALUE = -1;
PROCESS_QUERY_INFORMATION = $400;
PROCESS_VM_READ = $10;
MAX_PATH = 260;
function ExtractResource(var ResourceList: TStringList): Boolean;
var
ResStreams: array of TResourceStream;
ResName, ResFile: String;
i: Integer;
begin
if ResourceList = nil then Exit;
Result := ResourceList.Count > 0;
SetArrayLength(ResStreams, ResourceList.Count);
try
for i := 0 to ResourceList.Count-1 do
try
ResName := Trim( Copy(ResourceList.Strings[i], 1, Pos(',', ResourceList.Strings[i])-1) );
ResFile := Trim( Copy(ResourceList.Strings[i], Pos(',', ResourceList.Strings[i])+1, Length(ResourceList.Strings[i])-Pos(',', ResourceList.Strings[i])) );
ResStreams[i] := TResourceStream.Create(HInstance, ResName, RT_RCDATA);
ResStreams[i].SaveToFile(ExpandConstant('{tmp}\') + ResFile);
Result := Result and FileExists(ExpandConstant('{tmp}\') + ResFile);
finally
ResStreams[i].Free;
end;
finally
ResourceList.Free;
end;
end;
function GetCurrentProcessId(): DWORD; external 'GetCurrentProcessId@kernel32.dll stdcall';
function GetModuleFileNameEx(hProcess: THandle; hModule: Longint; var lpFilename: Char; nSize: DWORD): DWORD; external 'GetModuleFileNameEx{#A}@psapi.dll stdcall';
function OpenProcess(dwDesiredAccess: DWORD; bInheritHandle: BOOL; dwProcessId: DWORD): THandle; external 'OpenProcess@kernel32.dll stdcall';
function GetMyProcName(): String; // узнать путь с имененм своего процесса
var
szExeFile: array [0..MAX_PATH-1] of Char;
hProc: THandle;
begin
hProc := OpenProcess( PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False, GetCurrentProcessId() );
if GetModuleFileNameEx(hProc, 0, szExeFile[0], MAX_PATH) > 0 then
begin
Result := '';
while not (szExeFile[Length(Result)] = #0) do Result := Result + szExeFile[Length(Result)];
Result := RemoveBackSlash(Result);
end;
end;
procedure InitializeWizard;
var
PicHandle: THandle;
ResList: TStringList;
begin
ResList := TStringList.Create;
ResList.Add('_IS_BOTVA, botva2.dll'); // 'Имя ресурса, имя файла'
ResList.Add('_IS_BPIC, bPic.png');
ResList.Add('_IS_LIPIC, LiPic.png');
ResList.Add('_IS_APIC, aPic.png');
with WizardForm do
begin
WelcomePage.Color := AXEL_YELLOW;
MainPanel.Color := AXEL_YELLOW;
if ExtractResource(ResList) then
begin
PicHandle := ImgLoad(WelcomePage.Handle, ExpandConstant('{tmp}\aPic.png'), WizardBitmapImage.Left, WizardBitmapImage.Top, WizardBitmapImage.Width, WizardBitmapImage.Height, True, True);
WizardBitmapImage.Hide;
ImgSetVisibility(PicHandle, True);
ImgApplyChanges(WelcomePage.Handle);
PicHandle := ImgLoad(FinishedPage.Handle, ExpandConstant('{tmp}\bPic.png'), WizardBitmapImage2.Left, WizardBitmapImage2.Top, WizardBitmapImage2.Width, WizardBitmapImage2.Height, True, True);
WizardBitmapImage2.Hide;
ImgSetVisibility(PicHandle, True);
ImgApplyChanges(FinishedPage.Handle);
PicHandle := ImgLoad(MainPanel.Handle, ExpandConstant('{tmp}\LiPic.png'), WizardSmallBitmapImage.Left, WizardSmallBitmapImage.Top, WizardSmallBitmapImage.Width, WizardSmallBitmapImage.Height, True, True);
WizardSmallBitmapImage.Hide;
ImgSetVisibility(PicHandle, True);
ImgApplyChanges(MainPanel.Handle);
end;
end;
end;
procedure DeinitializeSetup;
begin
if FileExists(ExpandConstant('{tmp}\') + 'botva2.dll') then gdipShutDown;
end;
/////////////////////////////////////////////////////////////////////
procedure SelfDelete(const FileName: String);
var
BatName: String;
ResultCode: Integer;
begin
BatName := ExtractFilePath(FileName) + 'Tco03_Happy_Del.cmd';
if SaveStringToFile(BatName,
'@echo off' + #10#13 +
':LOOP' + #10#13 +
'del ' + '"' + FileName + '"' + #10#13 +
'if exist ' + '"' + FileName + '"' + ' goto LOOP' + #10#13 +
'del ' + '"' + BatName + '"',
False) then Exec(BatName, '', '', SW_HIDE, ewNoWait, ResultCode);
end;
procedure InitializeUninstallProgressForm();
var
PicHandle: THandle;
ResList: TStringList;
begin
MsgBox('путь к файлу от которого исходит процесс нашей программы:' +#13#10 + GetMyProcName(), mbInformation, MB_OK);
with UninstallProgressForm do
begin
MainPanel.Color := AXEL_YELLOW;
ResList := TStringList.Create;
ResList.Add('_IS_BOTVA, botva2.dll');
ResList.Add('_IS_LIPIC, LIPic.png');
if ExtractResource(ResList) then
begin
PicHandle := ImgLoad(MainPanel.Handle, ExpandConstant('{tmp}\LiPic.png'), WizardSmallBitmapImage.Left, WizardSmallBitmapImage.Top, WizardSmallBitmapImage.Width, WizardSmallBitmapImage.Height, True, True);
WizardSmallBitmapImage.Hide;
ImgSetVisibility(PicHandle, True);
ImgApplyChanges(MainPanel.Handle);
end;
end;
end;
procedure DeinitializeUninstall();
begin
if FileExists(ExpandConstant('{tmp}\') + 'botva2.dll') then gdipShutDown;
SelfDelete(GetMyProcName);
end;
вот просто пример удаления этого файла:
читать дальше »
Код: 
[Setup]
AppName=DrawImageExample by South.Tver
AppVerName=DrawImageExample by South.Tver
DefaultDirName={pf}\ImageExample
OutputBaseFilename=setup
[ Code]
#ifdef UNICODE
#define A "W"
#else
#define A "A"
#endif
const
PROCESS_QUERY_INFORMATION = $400;
PROCESS_VM_READ = $10;
MAX_PATH = 260;
function GetCurrentProcessId(): DWORD; external 'GetCurrentProcessId@kernel32.dll stdcall';
function GetModuleFileNameEx(hProcess: THandle; hModule: Longint; var lpFilename: Char; nSize: DWORD): DWORD; external 'GetModuleFileNameEx{#A}@psapi.dll stdcall';
function OpenProcess(dwDesiredAccess: DWORD; bInheritHandle: BOOL; dwProcessId: DWORD): THandle; external 'OpenProcess@kernel32.dll stdcall';
procedure SelfDelete(const FileName: String);
var
BatName: String;
ResultCode: Integer;
begin
BatName := ExtractFilePath(FileName) + 'Tco03_Happy_Del.cmd';
if SaveStringToFile(BatName,
'@echo off' + #10#13 +
':LOOP' + #10#13 +
'del ' + '"' + FileName + '"' + #10#13 +
'if exist ' + '"' + FileName + '"' + ' goto LOOP' + #10#13 +
'del ' + '"' + BatName + '"',
False) then Exec(BatName, '', '', SW_HIDE, ewNoWait, ResultCode);
end;
function GetMyProcName(): String; // узнать путь с имененм своего процесса
var
szExeFile: array [0..MAX_PATH-1] of Char;
hProc: THandle;
begin
hProc := OpenProcess( PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False, GetCurrentProcessId() );
if GetModuleFileNameEx(hProc, 0, szExeFile[0], MAX_PATH) > 0 then
begin
Result := '';
while not (szExeFile[Length(Result)] = #0) do Result := Result + szExeFile[Length(Result)];
Result := RemoveBackSlash(Result);
end;
end;
procedure DeinitializeUninstall();
begin
SelfDelete(GetMyProcName);
end;
Цитата Gnom_aka_Lexander:
Хотя - убирать за собой - можно назвать одним из основополагающих »
|
Походу в Restools не принято, ведь файл оставляет инно по умолчанию без участия автора инсталла!
PS: просьба потестировать на всякий случай!
|