Имя пользователя:
Пароль:
 

Показать сообщение отдельно

Аватара для Johny777

Ветеран


Сообщения: 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: просьба потестировать на всякий случай!

Последний раз редактировалось Johny777, 03-04-2013 в 17:48.

Это сообщение посчитали полезным следующие участники:

Отправлено: 17:40, 03-04-2013 | #74