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

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
SkizoWalkerAsked:
Who is Participating?
 
jstolanConnect With a Mentor Commented:
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
 
jkrCommented:
To delete your file by 'itself', see 'MoveFileEx()'...
0
 
jstolanCommented:
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
 
SkizoWalkerAuthor Commented:
good ,thanx for that cheat , anyway only 100 points , because no pif answer :) take care .. and thx again , cya .. Skizo

0
 
arkeeCommented:
where to add this code? please let me know.

Thank you.
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.