?
Solved

how to delete a programm from itself ? and .. doing a .PIF file, how to ? :)

Posted on 1998-10-16
5
Medium Priority
?
266 Views
Last Modified: 2013-11-20
okay .. here's some questions ..

i am coding a programm in vc++5.0 i have called it setup.exe , and i would like it to be deleted from himself .
i mean : in the Setup.exe programm, i launch the api : remove ("setup.exe") and automatically i have an error , since the programm is still running
does anyone have any clues ?

and the last question is : how to create .PIF files from Shell API ?

thx for all and win these points .. hehe

Skizo / France / MoDEL - FX
0
Comment
Question by:SkizoWalker
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
5 Comments
 
LVL 86

Expert Comment

by:jkr
ID: 1323449
To delete your file by 'itself', see 'MoveFileEx()'...
0
 
LVL 2

Accepted Solution

by:
jstolan earned 450 total points
ID: 1323450
MoveFileEx works well if you don't mind rebooting the computer before the file is deleted.  A really cool way to have a file delete itself is to create and spawn a batch file.  The batch file consists of an infinite loop that tries to delete the executable file that spawned it, then when it succeeds deleted itself.  (Yes, batch files are unique in that they can delete themselves).  A sample follows in the attached comment.

Sorry, I don't think you can create PIF file from the shell.
0
 
LVL 2

Expert Comment

by:jstolan
ID: 1323451
Here is a sample from an app I did, it's a little involved but you can get the idea:

    CString cszBatFile;
    cszBatFile.FormatMessage( _T(":Repeat\r\n")
                              _T("del \"%1!s!\"\r\n")
                              _T("if exist \"%1!s!\" goto Repeat\r\n")
                              _T(":Again\r\n")
                              _T("del \"%2!s!\\*.dll\"\r\n")
                              _T("del \"%2!s!\\w32mkde.exe\"\r\n")
                              _T("del \"%2!s!\\ccstxt.ndb\"\r\n")
                              _T("if exist \"%2!s!\\*.dll\" goto Again\r\n")
                              _T("if exist \"%2!s!\\w32mkde.exe\" goto Again\r\n")
                              _T("if exist \"%2!s!\\ccstxt.ndb\" goto Again\r\n")
                              _T("rmdir \"%2!s!\"\r\n"),
                              LPCTSTR(cszUnsetupName),            
                              LPCTSTR(cszUnsetupPath) );

    // attempt removal of each directory working back toward root
    CString cszDirectory = cszUnsetupPath;
    while( cszDirectory.ReverseFind('\\') > 2 )
        {
        cszDirectory = cszDirectory.Left( cszDirectory.ReverseFind('\\') );
        CString cszRmdir;
        cszRmdir.FormatMessage( _T("rmdir \"%1!s!\"\r\n"), LPCTSTR(cszDirectory) );
        // Add it to the batch file
        cszBatFile+=cszRmdir;
        }
    // Finally add the batch line which deletes the batch file itself
    cszBatFile+=_T("del \\DelUs.bat\r\n");
 
    // Create the batch file
    HANDLE hfile = CreateFile( _T("\\DelUs.bat"),
                               GENERIC_WRITE,
                               0,
                               NULL,
                               CREATE_ALWAYS,
                               FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);

    // Handle failure to create
    if (hfile == INVALID_HANDLE_VALUE)
        {
        CString cszAddedText;
        NlsGetString( IDS_UNABLECREATE, cszAddedText.GetBuffer(256), 255 );
        cszAddedText.ReleaseBuffer();
        cszText += cszAddedText;
        SetDlgItemText(IDC_TEXTINFO,cszText);
        trace.Error(2,"Failure to create batch file");
        return FALSE;
        }

    // Write the batch file and close it.
    DWORD dwNumberOfBytesWritten;
    trace.Log("Writing batch file");
    WriteFile(hfile, LPCTSTR(cszBatFile), cszBatFile.GetLength(), &dwNumberOfBytesWritten, NULL);
    CloseHandle(hfile);

    // Handle failure to write properly
    if( dwNumberOfBytesWritten != (DWORD)cszBatFile.GetLength() )
        {
        CString cszAddedText;
        NlsGetString( IDS_UNABLECREATE, cszAddedText.GetBuffer(256), 255 );
        cszAddedText.ReleaseBuffer();
        cszText += cszAddedText;
        SetDlgItemText(IDC_TEXTINFO,cszText);
        trace.Error(2,"Failure to write to batch file");
        return FALSE;
        }

    // Initialize a STARTUPINFO structure
    STARTUPINFO si;
    ZeroMemory(&si, sizeof(si));
    si.cb = sizeof(si);
    // We want its console window to be invisible to the user.
    si.dwFlags = STARTF_USESHOWWINDOW;
    si.wShowWindow = SW_HIDE;
    trace.Log("Spawning batch file");

    // Spawn the batch file with low-priority and suspended.
    PROCESS_INFORMATION pi;
    if (!CreateProcess(NULL, _T("\\DelUs.bat"), NULL, NULL, FALSE,
       CREATE_SUSPENDED | IDLE_PRIORITY_CLASS, NULL, __TEXT("\\"), &si, &pi))
        {
        // Handle spawn error
        CString cszAddedText;
        NlsGetString( IDS_UNABLEEXECUTE, cszAddedText.GetBuffer(256), 255 );
        cszAddedText.ReleaseBuffer();
        cszText += cszAddedText;
        SetDlgItemText(IDC_TEXTINFO,cszText);
        trace.Error(2,"Failure to create process");
        return FALSE;
        }

    // Lower the batch file's priority even more.
    SetThreadPriority(pi.hThread, THREAD_PRIORITY_IDLE);
    // Raise our priority so that we terminate as quickly as possible.
    SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL);
    SetPriorityClass(GetCurrentProcess(), HIGH_PRIORITY_CLASS);

    // Allow the batch file to run and clean-up our handles.
    CloseHandle(pi.hProcess);
    ResumeThread(pi.hThread);
    CloseHandle(pi.hThread);

0
 

Author Comment

by:SkizoWalker
ID: 1323452
good ,thanx for that cheat , anyway only 100 points , because no pif answer :) take care .. and thx again , cya .. Skizo

0
 

Expert Comment

by:arkee
ID: 1323453
where to add this code? please let me know.

Thank you.
0

Featured Post

Free Tool: ZipGrep

ZipGrep is a utility that can list and search zip (.war, .ear, .jar, etc) archives for text patterns, without the need to extract the archive's contents.

One of a set of tools we're offering as a way to say thank you for being a part of the community.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Introduction: Displaying information on the statusbar.   Continuing from the third article about sudoku.   Open the project in visual studio. Status bar – let’s display the timestamp there.  We need to get the timestamp from the document s…
Have you tried to learn about Unicode, UTF-8, and multibyte text encoding and all the articles are just too "academic" or too technical? This article aims to make the whole topic easy for just about anyone to understand.
This video will show you how to get GIT to work in Eclipse.   It will walk you through how to install the EGit plugin in eclipse and how to checkout an existing repository.
In this video, Percona Solutions Engineer Barrett Chambers discusses some of the basic syntax differences between MySQL and MongoDB. To learn more check out our webinar on MongoDB administration for MySQL DBA: https://www.percona.com/resources/we…
Suggested Courses
Course of the Month14 days, 5 hours left to enroll

800 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question