Solved

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

Posted on 1998-10-16
5
247 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
Comment Utility
To delete your file by 'itself', see 'MoveFileEx()'...
0
 
LVL 2

Accepted Solution

by:
jstolan earned 150 total points
Comment Utility
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
Comment Utility
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
Comment Utility
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
Comment Utility
where to add this code? please let me know.

Thank you.
0

Featured Post

What Security Threats Are You Missing?

Enhance your security with threat intelligence from the web. Get trending threat insights on hackers, exploits, and suspicious IP addresses delivered to your inbox with our free Cyber Daily.

Join & Write a Comment

Suggested Solutions

Title # Comments Views Activity
Decoding 32 bit binary streams 6 29
Need to retreive data from .TFS file exported by DVR 8 166
has22 challenge 11 70
Change to event 1 72
Introduction: Dynamic window placements and drawing on a form, simple usage of windows registry as a storage place for information. Continuing from the first article about sudoku.  There we have designed the application and put a lot of user int…
If you use Adobe Reader X it is possible you can't open OLE PDF documents in the standard. The reason is the 'save box mode' in adobe reader X. Many people think the protected Mode of adobe reader x is only to stop the write access. But this fe…
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.
Excel styles will make formatting consistent and let you apply and change formatting faster. In this tutorial, you'll learn how to use Excel's built-in styles, how to modify styles, and how to create your own. You'll also learn how to use your custo…

762 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

Need Help in Real-Time?

Connect with top rated Experts

13 Experts available now in Live!

Get 1:1 Help Now