Solved

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

Posted on 1998-10-16
5
257 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
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 150 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

ScreenConnect 6.0 Free Trial

At ScreenConnect, partner feedback doesn't fall on deaf ears. We collected partner suggestions off of their virtual wish list and transformed them into one game-changing release: ScreenConnect 6.0. Explore all of the extras and enhancements for yourself!

Question has a verified solution.

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

Suggested Solutions

Title # Comments Views Activity
Detect CR LF to each line 12 161
post4 challenge 28 100
Modbus - whats the maximum I can store in one register? 4 80
Excel file not created as expected 7 72
In this article, I'll describe -- and show pictures of -- some of the significant additions that have been made available to programmers in the MFC Feature Pack for Visual C++ 2008.  These same feature are in the MFC libraries that come with Visual …
Introduction: Database storage, where is the exe actually on the disc? Playing a game selected randomly (how to generate random numbers).  Error trapping with try..catch to help the code run even if something goes wrong. Continuing from the seve…
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.
This video shows how to quickly and easily add an email signature for all users on Exchange 2016. The resulting signature is applied on a server level by Exchange Online. The email signature template has been downloaded from: www.mail-signatures…

809 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